Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[UI] EVEREST-1625 Fix PITR options are not available #1096

Open
wants to merge 25 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
f1134c0
[UI] EVEREST-1626 Remove `db.spec.backup.enabled` condition (#813)
dianabirs Feb 12, 2025
b60bcb7
EVEREST-1627 Do not use db.spec.backup.enabled (#1087)
oksana-grishchenko Feb 12, 2025
7a39270
Merge branch 'main' into EVEREST-1625-fix-pitr-options-are-not-available
dianabirs Feb 13, 2025
6251a29
fix: remove enabled
dianabirs Feb 13, 2025
df4f2d1
update swagger API
oksana-grishchenko Feb 13, 2025
bf32a88
update swagger API
oksana-grishchenko Feb 13, 2025
af94327
Merge branch 'main' into EVEREST-1625-fix-pitr-options-are-not-available
oksana-grishchenko Feb 14, 2025
e6e2f8f
Merge branch 'main' into EVEREST-1625-fix-pitr-options-are-not-available
oksana-grishchenko Feb 14, 2025
5a02c64
Merge branch 'main' into EVEREST-1625-fix-pitr-options-are-not-available
percona-robot Feb 14, 2025
fe8abd4
Merge branch 'main' into EVEREST-1625-fix-pitr-options-are-not-available
percona-robot Feb 14, 2025
24327b4
Merge branch 'main' into EVEREST-1625-fix-pitr-options-are-not-available
percona-robot Feb 17, 2025
95d0ddf
Merge branch 'main' into EVEREST-1625-fix-pitr-options-are-not-available
percona-robot Feb 18, 2025
072dc49
Merge branch 'main' into EVEREST-1625-fix-pitr-options-are-not-available
percona-robot Feb 18, 2025
ef11304
Merge branch 'main' into EVEREST-1625-fix-pitr-options-are-not-available
percona-robot Feb 19, 2025
7778f57
Merge branch 'main' into EVEREST-1625-fix-pitr-options-are-not-available
percona-robot Feb 19, 2025
1971e04
Merge branch 'main' into EVEREST-1625-fix-pitr-options-are-not-available
percona-robot Feb 19, 2025
b8970ce
Merge branch 'main' into EVEREST-1625-fix-pitr-options-are-not-available
percona-robot Feb 20, 2025
c0ceec8
Merge branch 'main' into EVEREST-1625-fix-pitr-options-are-not-available
percona-robot Feb 20, 2025
e805395
Merge branch 'main' into EVEREST-1625-fix-pitr-options-are-not-available
percona-robot Feb 20, 2025
bfe6f38
Merge branch 'main' into EVEREST-1625-fix-pitr-options-are-not-available
percona-robot Feb 20, 2025
0e0d5c3
Merge branch 'main' into EVEREST-1625-fix-pitr-options-are-not-available
percona-robot Feb 20, 2025
cab9111
Merge branch 'main' into EVEREST-1625-fix-pitr-options-are-not-available
percona-robot Feb 20, 2025
22dccf2
Merge branch 'main' into EVEREST-1625-fix-pitr-options-are-not-available
percona-robot Feb 20, 2025
fb77546
Merge branch 'refs/heads/main' into EVEREST-1625-fix-pitr-options-are…
oksana-grishchenko Mar 3, 2025
44d3e9f
upd operator version
oksana-grishchenko Mar 3, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
346 changes: 173 additions & 173 deletions api/everest-server.gen.go

Large diffs are not rendered by default.

346 changes: 173 additions & 173 deletions client/everest-client.gen.go

Large diffs are not rendered by default.

2 changes: 0 additions & 2 deletions docs/spec/openapi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2512,8 +2512,6 @@ components:
- schedule
type: object
type: array
required:
- enabled
type: object
dataSource:
description: DataSource defines a data source for bootstraping a new
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ require (
github.com/oapi-codegen/runtime v1.1.1
github.com/operator-framework/api v0.27.0
github.com/operator-framework/operator-lifecycle-manager v0.27.0
github.com/percona/everest-operator v0.6.0-dev1.0.20250225113755-a3ec50251812
github.com/percona/everest-operator v0.6.0-dev1.0.20250303112639-e4ee4c304250
github.com/percona/percona-helm-charts/charts/everest v0.0.0-20250228124316-3356da7b4edf
github.com/rodaine/table v1.3.0
github.com/spf13/cobra v1.8.1
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -2232,8 +2232,8 @@ github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE=
github.com/percona/everest-operator v0.6.0-dev1.0.20250225113755-a3ec50251812 h1:mXpaVPDDa9H3YXdI5h+hwAebKVAv/CvKDQNQE321CFw=
github.com/percona/everest-operator v0.6.0-dev1.0.20250225113755-a3ec50251812/go.mod h1:MNgmJP9Q0YFIUaQbwL99YT5vCDng8yE//aNyC6F3Yx8=
github.com/percona/everest-operator v0.6.0-dev1.0.20250303112639-e4ee4c304250 h1:OkLE5CX5wNnMaQIJJV109ZsYYcvZ5qb+zUV1vAevTSQ=
github.com/percona/everest-operator v0.6.0-dev1.0.20250303112639-e4ee4c304250/go.mod h1:MNgmJP9Q0YFIUaQbwL99YT5vCDng8yE//aNyC6F3Yx8=
github.com/percona/percona-backup-mongodb v1.8.1-0.20241212160532-0157f87a7eee h1:LtitxWyhBqCNjIZqdvsSEPBd2HPg11lDBlIExTQAbGQ=
github.com/percona/percona-backup-mongodb v1.8.1-0.20241212160532-0157f87a7eee/go.mod h1:zikIUTNTflfcth3ZJRqhvW8+7Jj38aVlg+wSV1jwnxo=
github.com/percona/percona-helm-charts/charts/everest v0.0.0-20250228124316-3356da7b4edf h1:2ZXrLOH/WBjvTQW3Qhw82p7+2ShLsvsyWFQl6Ea9Lms=
Expand Down
2 changes: 1 addition & 1 deletion internal/server/handlers/k8s/database_cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ func (h *k8sHandler) GetDatabaseClusterPitr(ctx context.Context, namespace, name
}

response := &api.DatabaseClusterPitr{}
if !databaseCluster.Spec.Backup.Enabled || !databaseCluster.Spec.Backup.PITR.Enabled {
if !databaseCluster.Spec.Backup.PITR.Enabled {
return response, nil
}

Expand Down
11 changes: 0 additions & 11 deletions internal/server/handlers/validation/database_cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -251,14 +251,6 @@ func validateProxyType(engineType everestv1alpha1.EngineType, proxyType everestv
}

func validateBackupSpec(cluster *everestv1alpha1.DatabaseCluster) error {
if !cluster.Spec.Backup.Enabled {
return nil
}

if len(cluster.Spec.Backup.Schedules) == 0 {
return errNoSchedules
}

if err := validatePitrSpec(cluster); err != nil {
return err
}
Expand Down Expand Up @@ -308,9 +300,6 @@ func (h *validateHandler) validateBackupStoragesFor(
namespace string,
databaseCluster *everestv1alpha1.DatabaseCluster,
) error {
if !databaseCluster.Spec.Backup.Enabled {
return nil
}
storages := make(map[string]bool)
for _, schedule := range databaseCluster.Spec.Backup.Schedules {
storages[schedule.BackupStorageName] = true
Expand Down
36 changes: 3 additions & 33 deletions internal/server/handlers/validation/database_cluster_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -272,33 +272,21 @@ func TestValidateBackupSpec(t *testing.T) {
err: nil,
},
{
name: "disabled backup is allowed",
name: "allow no schedules",
cluster: &everestv1alpha1.DatabaseCluster{
Spec: everestv1alpha1.DatabaseClusterSpec{
Backup: everestv1alpha1.Backup{
Enabled: false,
Schedules: []everestv1alpha1.BackupSchedule{},
},
},
},
err: nil,
},
{
name: "errNoSchedules",
cluster: &everestv1alpha1.DatabaseCluster{
Spec: everestv1alpha1.DatabaseClusterSpec{
Backup: everestv1alpha1.Backup{
Enabled: true,
},
},
},
err: errNoSchedules,
},
{
name: "errNoNameInSchedule",
cluster: &everestv1alpha1.DatabaseCluster{
Spec: everestv1alpha1.DatabaseClusterSpec{
Backup: everestv1alpha1.Backup{
Enabled: true,
Schedules: []everestv1alpha1.BackupSchedule{
{
Enabled: true,
Expand All @@ -314,7 +302,6 @@ func TestValidateBackupSpec(t *testing.T) {
cluster: &everestv1alpha1.DatabaseCluster{
Spec: everestv1alpha1.DatabaseClusterSpec{
Backup: everestv1alpha1.Backup{
Enabled: true,
Schedules: []everestv1alpha1.BackupSchedule{
{
Enabled: true,
Expand All @@ -331,7 +318,6 @@ func TestValidateBackupSpec(t *testing.T) {
cluster: &everestv1alpha1.DatabaseCluster{
Spec: everestv1alpha1.DatabaseClusterSpec{
Backup: everestv1alpha1.Backup{
Enabled: true,
Schedules: []everestv1alpha1.BackupSchedule{
{
Enabled: true,
Expand All @@ -356,7 +342,6 @@ func TestValidateBackupSpec(t *testing.T) {
cluster: &everestv1alpha1.DatabaseCluster{
Spec: everestv1alpha1.DatabaseClusterSpec{
Backup: everestv1alpha1.Backup{
Enabled: true,
Schedules: []everestv1alpha1.BackupSchedule{
{
Enabled: true,
Expand Down Expand Up @@ -394,7 +379,6 @@ func TestValidateBackupStoragesFor(t *testing.T) {
cluster: everestv1alpha1.DatabaseCluster{
Spec: everestv1alpha1.DatabaseClusterSpec{
Backup: everestv1alpha1.Backup{
Enabled: true,
Schedules: []everestv1alpha1.BackupSchedule{
{
Enabled: true,
Expand Down Expand Up @@ -426,7 +410,6 @@ func TestValidateBackupStoragesFor(t *testing.T) {
cluster: everestv1alpha1.DatabaseCluster{
Spec: everestv1alpha1.DatabaseClusterSpec{
Backup: everestv1alpha1.Backup{
Enabled: true,
Schedules: []everestv1alpha1.BackupSchedule{
{
Enabled: true,
Expand Down Expand Up @@ -456,7 +439,6 @@ func TestValidateBackupStoragesFor(t *testing.T) {
cluster: everestv1alpha1.DatabaseCluster{
Spec: everestv1alpha1.DatabaseClusterSpec{
Backup: everestv1alpha1.Backup{
Enabled: true,
Schedules: []everestv1alpha1.BackupSchedule{
{
Enabled: true,
Expand Down Expand Up @@ -486,7 +468,6 @@ func TestValidateBackupStoragesFor(t *testing.T) {
cluster: everestv1alpha1.DatabaseCluster{
Spec: everestv1alpha1.DatabaseClusterSpec{
Backup: everestv1alpha1.Backup{
Enabled: true,
PITR: everestv1alpha1.PITRSpec{
Enabled: true,
BackupStorageName: pointer.To("storage"),
Expand Down Expand Up @@ -520,7 +501,6 @@ func TestValidateBackupStoragesFor(t *testing.T) {
cluster: everestv1alpha1.DatabaseCluster{
Spec: everestv1alpha1.DatabaseClusterSpec{
Backup: everestv1alpha1.Backup{
Enabled: true,
PITR: everestv1alpha1.PITRSpec{
Enabled: true,
},
Expand Down Expand Up @@ -553,7 +533,6 @@ func TestValidateBackupStoragesFor(t *testing.T) {
cluster: everestv1alpha1.DatabaseCluster{
Spec: everestv1alpha1.DatabaseClusterSpec{
Backup: everestv1alpha1.Backup{
Enabled: true,
PITR: everestv1alpha1.PITRSpec{
Enabled: true,
BackupStorageName: pointer.To("storage"),
Expand Down Expand Up @@ -620,7 +599,6 @@ func TestValidatePitrSpec(t *testing.T) {
cluster: everestv1alpha1.DatabaseCluster{
Spec: everestv1alpha1.DatabaseClusterSpec{
Backup: everestv1alpha1.Backup{
Enabled: true,
PITR: everestv1alpha1.PITRSpec{
Enabled: true,
BackupStorageName: pointer.To("name"),
Expand All @@ -635,7 +613,6 @@ func TestValidatePitrSpec(t *testing.T) {
cluster: everestv1alpha1.DatabaseCluster{
Spec: everestv1alpha1.DatabaseClusterSpec{
Backup: everestv1alpha1.Backup{
Enabled: true,
PITR: everestv1alpha1.PITRSpec{
Enabled: false,
},
Expand All @@ -648,9 +625,7 @@ func TestValidatePitrSpec(t *testing.T) {
name: "valid spec no pitr",
cluster: everestv1alpha1.DatabaseCluster{
Spec: everestv1alpha1.DatabaseClusterSpec{
Backup: everestv1alpha1.Backup{
Enabled: true,
},
Backup: everestv1alpha1.Backup{},
},
},
err: nil,
Expand All @@ -660,7 +635,6 @@ func TestValidatePitrSpec(t *testing.T) {
cluster: everestv1alpha1.DatabaseCluster{
Spec: everestv1alpha1.DatabaseClusterSpec{
Backup: everestv1alpha1.Backup{
Enabled: true,
PITR: everestv1alpha1.PITRSpec{
Enabled: true,
},
Expand All @@ -677,7 +651,6 @@ func TestValidatePitrSpec(t *testing.T) {
cluster: everestv1alpha1.DatabaseCluster{
Spec: everestv1alpha1.DatabaseClusterSpec{
Backup: everestv1alpha1.Backup{
Enabled: true,
PITR: everestv1alpha1.PITRSpec{
Enabled: true,
},
Expand All @@ -694,7 +667,6 @@ func TestValidatePitrSpec(t *testing.T) {
cluster: everestv1alpha1.DatabaseCluster{
Spec: everestv1alpha1.DatabaseClusterSpec{
Backup: everestv1alpha1.Backup{
Enabled: true,
PITR: everestv1alpha1.PITRSpec{
Enabled: true,
},
Expand All @@ -711,7 +683,6 @@ func TestValidatePitrSpec(t *testing.T) {
cluster: everestv1alpha1.DatabaseCluster{
Spec: everestv1alpha1.DatabaseClusterSpec{
Backup: everestv1alpha1.Backup{
Enabled: true,
PITR: everestv1alpha1.PITRSpec{
Enabled: true,
BackupStorageName: pointer.To("name"),
Expand All @@ -727,7 +698,6 @@ func TestValidatePitrSpec(t *testing.T) {
cluster: everestv1alpha1.DatabaseCluster{
Spec: everestv1alpha1.DatabaseClusterSpec{
Backup: everestv1alpha1.Backup{
Enabled: true,
PITR: everestv1alpha1.PITRSpec{
Enabled: true,
BackupStorageName: pointer.To("name"),
Expand Down
1 change: 0 additions & 1 deletion internal/server/handlers/validation/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ var (
errUnsupportedPXCProxy = errors.New("you can use either HAProxy or Proxy SQL for PXC clusters")
errUnsupportedPGProxy = errors.New("you can use only PGBouncer as a proxy type for Postgres clusters")
errUnsupportedPSMDBProxy = errors.New("you can use only Mongos as a proxy type for MongoDB clusters")
errNoSchedules = errors.New("please specify at least one backup schedule")
errNoNameInSchedule = errors.New("'name' field for the backup schedules cannot be empty")
errScheduleNoBackupStorageName = errors.New("'backupStorageName' field cannot be empty when schedule is enabled")
errPitrNoBackupStorageName = errors.New("'backupStorageName' field cannot be empty when pitr is enabled")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,6 @@ export const backupScheduleFormValuesToDbClusterPayload = (
...dbCluster?.spec,
backup: {
...dbCluster.spec.backup,
enabled: schedulesPayload.length > 0,
schedules: schedulesPayload.length > 0 ? schedulesPayload : undefined,
},
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,6 @@ export const useDbCluster = () => ({
spec: {
allowUnsafeConfiguration: true,
monitoring: {},
backup: {
enabled: false,
},
engine: {
config:
"[mysqld]\ninnodb_adaptive_hash_index = True\ninnodb_log_files_in_group = 2\ninnodb_parallel_read_threads = 1\ninnodb_buffer_pool_instances = 1\ninnodb_flush_method = O_DIRECT\ninnodb_log_file_size = 152548048\ninnodb_page_cleaners = 1\ninnodb_purge_threads = 4\ninnodb_buffer_pool_chunk_size = 2097152\ninnodb_buffer_pool_size = 731424661\ninnodb_ddl_threads = 2\ninnodb_flush_log_at_trx_commit = 2\ninnodb_io_capacity_max = 1800\ninnodb_monitor_enable = ALL\nreplica_parallel_workers = 4\nreplica_preserve_commit_order = ON\nreplica_compressed_protocol = 1\nreplica_exec_mode = STRICT\nreplica_parallel_type = LOGICAL_CLOCK\nloose_group_replication_member_expel_timeout = 6\nloose_group_replication_autorejoin_tries = 3\nloose_group_replication_message_cache_size = 162538812\nloose_group_replication_communication_max_message_size = 10485760\nloose_group_replication_unreachable_majority_timeout = 1029\nloose_group_replication_poll_spin_loops = 20000\nloose_group_replication_paxos_single_leader = ON\nloose_binlog_transaction_dependency_tracking = WRITESET\nread_rnd_buffer_size = 393216\nsort_buffer_size = 524288\nmax_heap_table_size = 16777216\ntmp_table_size = 16777216\nbinlog_cache_size = 131072\nbinlog_stmt_cache_size = 131072\njoin_buffer_size = 524288\nmax_connections = 72\ntablespace_definition_cache = 512\nthread_cache_size = 9\nthread_stack = 1024\ntable_open_cache_instances = 4\nsync_binlog = 1\nsql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,TRADITIONAL,STRICT_ALL_TABLES'\nbinlog_expire_logs_seconds = 604800\nthread_pool_size = 4\ntable_definition_cache = 4096\ntable_open_cache = 4096\nbinlog_format = ROW\n ",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,6 @@ const formValuesToPayloadMapping = (
},
spec: {
backup: {
enabled: dbPayload.schedules?.length > 0,
...(dbPayload.pitrEnabled && {
pitr: {
enabled: dbPayload.pitrEnabled,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,8 @@ export const DbClusterPayloadToFormValues = (
dbCluster?.spec?.engine?.storage?.class || null,

//backups
[DbWizardFormFields.backupsEnabled]: !!backup?.enabled,

[DbWizardFormFields.backupsEnabled]: (backup?.schedules || []).length > 0,
[DbWizardFormFields.pitrEnabled]:
dbCluster?.spec?.engine?.type === DbEngineType.POSTGRESQL
? (backup?.schedules || []).length > 0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ export const convertDbClusterPayloadToTableFormat = (
: DbClusterStatus.unknown,
dbType: cluster.spec.engine.type,
dbVersion: cluster.spec.engine.version || '',
backupsEnabled: !!cluster.spec.backup?.enabled,
backupsEnabled: (cluster.spec.backup?.schedules || []).length > 0,
databaseName: cluster.metadata.name,
cpu: cluster.spec.engine.resources?.cpu || '',
memory: cluster.spec.engine.resources?.memory || '',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,15 +129,13 @@ const ScheduledBackupsList = () => {
<>
<IconButton
color="primary"
disabled={!dbCluster.spec.backup?.enabled}
onClick={() => handleEdit(item.name)}
data-testid="edit-schedule-button"
>
<EditOutlinedIcon />
</IconButton>
<IconButton
color="primary"
disabled={!dbCluster.spec.backup?.enabled}
onClick={() => handleDelete(item.name)}
data-testid="delete-schedule-button"
>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ export const BackupsDetails = ({
schedules,
pitrEnabled,
pitrStorageName,
backup,
loading,
showStorage = true,
}: BackupsDetailsOverviewCardProps) => {
Expand Down Expand Up @@ -185,9 +184,7 @@ export const BackupsDetails = ({
title={Messages.titles.schedules}
loading={loading}
>
{Array.isArray(schedules) &&
schedules?.length > 0 &&
backup?.enabled ? (
{Array.isArray(schedules) && schedules?.length > 0 ? (
schedules?.map((item) => (
<OverviewSectionText key={`${item.name}-${item.schedule}`}>
{getTimeSelectionPreviewMessage(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@ export type ResourcesDetailsOverviewProps = {

export type BackupsDetailsOverviewCardProps = {
schedules: NonNullable<DbCluster['spec']['backup']>['schedules'];
backup: DbCluster['spec']['backup'];
pitrEnabled: NonNullable<
NonNullable<DbCluster['spec']['backup']>['pitr']
>['enabled'];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,6 @@ export const ClusterOverview = () => {
/>
{canReadBackups && (
<BackupsDetails
backup={dbCluster?.spec.backup!}
dbClusterName={dbCluster?.metadata.name}
namespace={dbCluster?.metadata.namespace}
schedules={dbCluster?.spec.backup?.schedules}
Expand Down
1 change: 0 additions & 1 deletion ui/apps/everest/src/shared-types/dbCluster.types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ export interface PITR {
}

export interface Backup {
enabled: boolean;
pitr?: PITR;
schedules?: Array<Schedule>;
}
Expand Down
1 change: 0 additions & 1 deletion ui/apps/everest/src/utils/db.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,6 @@ export const deleteScheduleFromDbCluster = (
...dbCluster?.spec,
backup: {
...dbCluster.spec.backup,
enabled: filteredSchedulesWithCronCorrection.length > 0,
schedules:
filteredSchedulesWithCronCorrection.length > 0
? filteredSchedulesWithCronCorrection
Expand Down
Loading