Merge ~ksdziekonski/charm-juju-backup-all:omit-models into charm-juju-backup-all:master

Proposed by Ksawery DziekoƄski
Status: Superseded
Proposed branch: ~ksdziekonski/charm-juju-backup-all:omit-models
Merge into: charm-juju-backup-all:master
Diff against target: 149 lines (+41/-10)
5 files modified
actions.yaml (+6/-0)
config.yaml (+4/-0)
scripts/templates/auto_backup.py (+11/-3)
src/charm.py (+4/-1)
src/utils.py (+16/-6)
Reviewer Review Type Date Requested Status
BootStack Reviewers Pending
Canonical BootStack Charmers Pending
Review via email: mp+425852@code.launchpad.net

This proposal has been superseded by a proposal from 2022-08-30.

Commit message

Allow for model omission in controller-wide backups

To post a comment you must log in.
Revision history for this message
đŸ€– Canonical IS Merge Bot (canonical-is-mergebot) wrote :

This merge proposal is being monitored by mergebot. Change the status to Approved to merge.

Revision history for this message
Robert Gildein (rgildein) wrote :

I think this is quite a straightforward feature. However, we should at
least add unittests for these changes.

Revision history for this message
Eric Chen (eric-chen) wrote :

Change the status to WIP until the unit test available.

Unmerged commits

92f8691... by Ksawery DziekoƄski

Allow for model omission in controller-wide backups

Related: LP#1980215

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/actions.yaml b/actions.yaml
2index 2ecaac8..3ae2418 100644
3--- a/actions.yaml
4+++ b/actions.yaml
5@@ -3,5 +3,11 @@
6
7 do-backup:
8 description: Performs a backup against all configured controllers/models
9+ params:
10+ omit-models:
11+ type: string
12+ default: ""
13+ description: |
14+ Comma-delimited list of model names to omit during this backup run
15 push-ssh-keys:
16 description: Push the charm ssh keys to all models in configured controllers
17diff --git a/config.yaml b/config.yaml
18index acc98af..dd7e418 100644
19--- a/config.yaml
20+++ b/config.yaml
21@@ -60,6 +60,10 @@ options:
22 description: |
23 Whether to backup the juju client data (accounts, controllers, ssh keys)
24 as part of the backup operations.
25+ exclude-models:
26+ type: string
27+ default: ""
28+ description: Comma-delimited list of model names to omit during backup runs
29 timeout:
30 type: int
31 default: 60
32diff --git a/scripts/templates/auto_backup.py b/scripts/templates/auto_backup.py
33index 17f3c02..a569941 100644
34--- a/scripts/templates/auto_backup.py
35+++ b/scripts/templates/auto_backup.py
36@@ -59,7 +59,7 @@ class AutoJujuBackupAll:
37 if "JUJUDATA_DIR" not in os.environ:
38 os.environ["JUJU_DATA"] = str(Paths.JUJUDATA_DIR)
39
40- def perform_backup(self):
41+ def perform_backup(self, omit_models=None):
42 """Perform backups."""
43 # first ensure the ssh key is in all models, then perform the backup
44 accounts_yaml = (Paths.JUJUDATA_DIR / "accounts.yaml").read_text()
45@@ -68,7 +68,7 @@ class AutoJujuBackupAll:
46 ssh_helper.push_ssh_keys_to_models()
47
48 backup_processor = BackupProcessor(self.config)
49- backup_results = backup_processor.process_backups()
50+ backup_results = backup_processor.process_backups(omit_models=omit_models)
51 logger.info("backup results = '{}'".format(backup_results))
52 return backup_results
53
54@@ -124,6 +124,14 @@ class AutoJujuBackupAll:
55 help="Individual task timeout length",
56 )
57
58+ parser.add_argument(
59+ "--omit-models"
60+ action="append",
61+ dest="omit_models",
62+ metavar="MODEL_NAME",
63+ help="Names of models to omit during backup run"
64+ )
65+
66 args = parser.parse_args()
67
68 log_level = logging.DEBUG if args.debug else logging.ERROR
69@@ -141,7 +149,7 @@ class AutoJujuBackupAll:
70 PID_FILENAME.write_text(pid)
71
72 try:
73- backup_results = self.perform_backup()
74+ backup_results = self.perform_backup(omit_models=args.omit_models)
75 Paths.AUTO_BACKUP_RESULTS_PATH.write_text(backup_results)
76
77 # purge old backups if requested
78diff --git a/src/charm.py b/src/charm.py
79index 57f9c6d..f71855f 100755
80--- a/src/charm.py
81+++ b/src/charm.py
82@@ -4,6 +4,8 @@
83
84 import logging
85
86+from charmhelpers.core import hookenv
87+
88 from ops.charm import CharmBase
89 from ops.framework import StoredState
90 from ops.main import main
91@@ -42,7 +44,8 @@ class JujuBackupAllCharm(CharmBase):
92
93 def _on_do_backup_action(self, event):
94 """Handle the dobackup action."""
95- backup_results = self.helper.perform_backup()
96+ backup_results = self.helper.perform_backup(omit_models=[
97+ name for name in hookenv.action_get("omit-models").split(",") if name])
98 event.set_results({"result": backup_results})
99
100 def _on_push_ssh_keys_action(self, event):
101diff --git a/src/utils.py b/src/utils.py
102index dae3635..aa276a1 100644
103--- a/src/utils.py
104+++ b/src/utils.py
105@@ -141,12 +141,12 @@ class JujuBackupAllHelper:
106
107 self._update_dir_owner(Paths.JUJUDATA_DIR)
108
109- def perform_backup(self):
110+ def perform_backup(self, omit_models=None):
111 """Perform backups."""
112 # first ensure the ssh key is in all models, then perform the backup
113 self.push_ssh_keys()
114 backup_processor = BackupProcessor(self.config)
115- backup_results = backup_processor.process_backups()
116+ backup_results = backup_processor.process_backups(omit_models=omit_models)
117 logging.info("backup results = '{}'".format(backup_results))
118 self._update_dir_owner(self.charm_config["backup-dir"])
119 return backup_results
120@@ -160,15 +160,25 @@ class JujuBackupAllHelper:
121 def update_crontab(self):
122 """Update crontab "/etc/cron.d/juju-backup-all" that runs "auto_backup.py"."""
123 path = "PATH=/usr/bin:/bin:/snap/bin"
124- cron_job = "{}\n{} {} {} --debug --purge {} --task-timeout {} >> {} 2>&1\n".format( # noqa E501
125+ cron_job = "{}\n{} {} {} --debug".format(
126 path,
127 self.charm_config["crontab"],
128 BACKUP_USERNAME,
129 Paths.AUTO_BACKUP_SCRIPT_PATH,
130- self.charm_config["backup-retention-period"],
131- self.charm_config["timeout"],
132- Paths.AUTO_BACKUP_LOG_PATH,
133 )
134+
135+ if self.charm_config["backup-retention-period"]:
136+ cron_job += " --purge {}".format(self.charm_config["backup-retention-period"])
137+
138+ if self.charm_config["timeout"]:
139+ cron_job += " --task-timeout {}".format(self.charm_config["timeout"])
140+
141+ if self.charm_config["exclude-models"]:
142+ cron_job += " --omit-models {}".format(",".join([
143+ name for name in self.charm_config["exclude-models"].split(",") if name
144+ ]))
145+
146+ cron_job += " >> {} 2>&1\n".format(Paths.AUTO_BACKUP_LOG_PATH)
147 Paths.AUTO_BACKUP_CRONTAB_PATH.write_text(cron_job)
148
149 def update_jujudata_config(self):

Subscribers

People subscribed via source and target branches

to all changes: