From b9fc979100b5a2f06d22da1b205751e494f55618 Mon Sep 17 00:00:00 2001 From: Eldin Didic <25496156+creativestate@users.noreply.github.com> Date: Mon, 13 Nov 2023 08:12:59 +1100 Subject: [PATCH] Add Timezone Support To Backup Schedule --- deploy/deploy-crds.yaml | 3 +++ mysqloperator/controller/backup/backup_api.py | 8 +++++++- mysqloperator/controller/backup/backup_objects.py | 3 +++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/deploy/deploy-crds.yaml b/deploy/deploy-crds.yaml index 3d5124d..5f6202a 100644 --- a/deploy/deploy-crds.yaml +++ b/deploy/deploy-crds.yaml @@ -626,6 +626,9 @@ spec: type: boolean default: true description: "Whether the schedule is enabled or not" + timeZone: + type: string + description: "Enable timezone to the backup schedule, example: 'America/New_York'" logs: type: object properties: diff --git a/mysqloperator/controller/backup/backup_api.py b/mysqloperator/controller/backup/backup_api.py index f4c3dc6..1e96c7b 100644 --- a/mysqloperator/controller/backup/backup_api.py +++ b/mysqloperator/controller/backup/backup_api.py @@ -117,6 +117,7 @@ def __init__(self, cluster_spec): self.backupProfile: Optional[BackupProfile] = None self.schedule: str = "" self.enabled: bool = False + self.timeZone: str = "" self.deleteBackupData: bool = False # unused def add_to_pod_spec(self, pod_spec: dict, container_name: str) -> None: @@ -133,6 +134,8 @@ def parse(self, spec: dict, prefix: str, load_profile: bool = True) -> None: self.backupProfileName = dget_str(spec, "backupProfileName", prefix, default_value= "") + self.timeZone = dget_str(spec, "timeZone", prefix, default_value= "") + self.schedule = dget_str(spec, "schedule", prefix) if not self.schedule: raise ApiSpecError(f"schedule not set in in a {prefix}") @@ -158,7 +161,7 @@ def parse(self, spec: dict, prefix: str, load_profile: bool = True) -> None: raise ApiSpecError(f"Invalid backupProfileName '{self.backupProfileName}' in cluster {self.cluster_spec.namespace}/{self.cluster_spec.name}") def __str__(self) -> str: - return f"Object BackupSchedule scheduleName={self.name} deleteBackupData={self.deleteBackupData} enabled={self.enabled} backupProfileName={self.backupProfileName} schedule={self.schedule} profile={self.backupProfile}" + return f"Object BackupSchedule scheduleName={self.name} deleteBackupData={self.deleteBackupData} enabled={self.enabled} backupProfileName={self.backupProfileName} schedule={self.schedule} profile={self.backupProfile} timeZone={self.timeZone}" def __eq__(self, other : 'BackupSchedule') -> bool: assert isinstance(other, BackupSchedule) @@ -169,6 +172,7 @@ def __eq__(self, other : 'BackupSchedule') -> bool: self.backupProfile == other.backupProfile and \ self.schedule == other.schedule and \ self.deleteBackupData == other.deleteBackupData and \ + self.timeZone == other.timeZone and \ self.enabled == other.enabled) return eq @@ -182,6 +186,7 @@ def __init__(self, namespace: str, name: str, spec: dict): self.backupProfileName: str = "" self.backupProfile: BackupProfile = None self.deleteBackupData: bool = False # unused + self.timeZone: str = "" self.addTimestampToBackupDirectory: bool = True self.operator_image: str = "" self.operator_image_pull_policy: str = "" @@ -198,6 +203,7 @@ def parse(self, spec: dict) -> Optional[ApiSpecError]: self.backupProfileName = dget_str(spec, "backupProfileName", "spec", default_value="") self.backupProfile = self.parse_backup_profile(dget_dict(spec, "backupProfile", "spec", {}), "spec.backupProfile") self.deleteBackupData = dget_bool(spec, "deleteBackupData", "spec", default_value=False) + self.timeZone = dget_str(spec, "timeZone", "spec", default_value="") self.addTimestampToBackupDirectory = dget_bool(spec, "addTimestampToBackupDirectory", "spec", default_value=True) if self.backupProfileName and self.backupProfile: diff --git a/mysqloperator/controller/backup/backup_objects.py b/mysqloperator/controller/backup/backup_objects.py index e383d63..881936a 100644 --- a/mysqloperator/controller/backup/backup_objects.py +++ b/mysqloperator/controller/backup/backup_objects.py @@ -208,6 +208,9 @@ def patch_cron_template_for_backup_schedule(base: dict, cluster_name: str, sched new_object["spec"]["schedule"] = schedule_profile.schedule new_object["spec"]["jobTemplate"]["spec"]["template"]["spec"]["containers"][0]["command"].extend(["--schedule-name", schedule_profile.name]) + if schedule_profile.timeZone: + new_object["spec"]["timeZone"] = schedule_profile.timeZone + metadata = {} if schedule_profile.backupProfile.podAnnotations: metadata['annotations'] = schedule_profile.backupProfile.podAnnotations