Skip to content
This repository has been archived by the owner on Jun 6, 2024. It is now read-only.

Commit

Permalink
refactor restore message and volume handling
Browse files Browse the repository at this point in the history
  • Loading branch information
Heavybullets8 committed May 29, 2024
1 parent ab0fe91 commit d6d8ef5
Show file tree
Hide file tree
Showing 3 changed files with 132 additions and 190 deletions.
102 changes: 51 additions & 51 deletions functions/backup_restore/kube/resources_restore.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,69 +93,69 @@ def restore_namespace(self, namespace_file: Path) -> bool:
return False

@type_check
def restore_secrets(self, secret_files: List[Path]) -> list:
def restore_secret(self, secret_file: Path) -> dict:
"""
Restore secrets for the application from its backup directory.
Restore a single secret for the application from its backup directory.
Parameters:
- secret_files (List[Path]): List of secret file paths to restore.
- secret_file (Path): Path of the secret file to restore.
Returns:
- list: List of files that failed to restore. If everything succeeds, returns an empty list.
- dict: Result containing status and message.
"""
self.logger.debug("Restoring secrets from provided file list...")
failures = []
result = {
"success": False,
"message": ""
}

if not secret_files:
self.logger.warning("No secret files provided.")
return []

for secret_file in secret_files:
self.logger.debug(f"Restoring secret from file: {secret_file}")
try:
with open(secret_file, 'r') as f:
secret_body = yaml.safe_load(f)
secret_body['metadata'].pop('resourceVersion', None)
secret_body['metadata'].pop('uid', None)
secret_body['metadata']['annotations'] = secret_body['metadata'].get('annotations', {})
secret_body['metadata']['annotations']['kubectl.kubernetes.io/last-applied-configuration'] = yaml.dump(secret_body)
with open(secret_file, 'w') as f:
yaml.dump(secret_body, f)
restoreResult = run_command(f"k3s kubectl apply -f \"{secret_file}\" --validate=false")
if restoreResult.is_success():
self.logger.debug(f"Restored {secret_file.name}")
else:
self.logger.error(f"Failed to restore {secret_file.name}: {restoreResult.get_error()}")
failures.append(secret_file.name)
except Exception as e:
self.logger.error(f"Error processing secret file {secret_file}: {e}")
failures.append(secret_file.name)
return failures
self.logger.debug(f"Restoring secret from file: {secret_file}")
try:
with open(secret_file, 'r') as f:
secret_body = yaml.safe_load(f)
secret_body['metadata'].pop('resourceVersion', None)
secret_body['metadata'].pop('uid', None)
secret_body['metadata']['annotations'] = secret_body['metadata'].get('annotations', {})
secret_body['metadata']['annotations']['kubectl.kubernetes.io/last-applied-configuration'] = yaml.dump(secret_body)
with open(secret_file, 'w') as f:
yaml.dump(secret_body, f)
restore_result = run_command(f"k3s kubectl apply -f \"{secret_file}\" --validate=false")
if restore_result.is_success():
self.logger.debug(f"Restored {secret_file.name}")
result["success"] = True
result["message"] = f"Restored {secret_file.name} successfully."
else:
self.logger.error(f"Failed to restore {secret_file.name}: {restore_result.get_error()}")
result["message"] = f"Failed to restore {secret_file.name}: {restore_result.get_error()}"
except Exception as e:
self.logger.error(f"Error processing secret file {secret_file}: {e}")
result["message"] = f"Error processing secret file {secret_file}: {e}"

return result

@type_check
def restore_crd(self, crd_files: List[Path]) -> list:
def restore_crd(self, crd_file: Path) -> dict:
"""
Restore CRDs for the application from its backup directory.
Restore a single CRD for the application from its backup directory.
Parameters:
- crd_files (List[Path]): List of CRD file paths to restore.
- crd_file (Path): Path of the CRD file to restore.
Returns:
- list: List of files that failed to restore. If everything succeeds, returns an empty list.
- dict: Result containing status and message.
"""
self.logger.debug("Restoring CRDs from provided file list...")
failures = []

if not crd_files:
self.logger.warning("No CRD files provided.")
return []

for file in crd_files:
self.logger.debug(f"Restoring CRD from file: {file}")
restoreResult = run_command(f"k3s kubectl apply -f \"{file}\" --validate=false")
if restoreResult.is_success():
self.logger.debug(f"Restored {file.name}")
else:
self.logger.error(f"Failed to restore {file.name}: {restoreResult.get_error()}")
failures.append(file.name)
return failures
result = {
"success": False,
"message": ""
}

self.logger.debug(f"Restoring CRD from file: {crd_file}")
restore_result = run_command(f"k3s kubectl apply -f \"{crd_file}\" --validate=false")
if restore_result.is_success():
self.logger.debug(f"Restored {crd_file.name}")
result["success"] = True
result["message"] = f"Restored {crd_file.name} successfully."
else:
self.logger.error(f"Failed to restore {crd_file.name}: {restore_result.get_error()}")
result["message"] = f"Failed to restore {crd_file.name}: {restore_result.get_error()}"

return result
10 changes: 5 additions & 5 deletions functions/backup_restore/restore/restore_all.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ def restore(self):
self._rollback_volumes(app_name)
except Exception as e:
self.logger.error(f"Failed to rollback snapshots for {app_name}: {e}\n")
self.failures[app_name].append(f"Failed to rollback volume snapshots: {e}")
self.failures.setdefault(app_name, []).append(f"Failed to rollback volume snapshots: {e}")

self.logger.info("\nStarting Kubernetes Services\n"
"----------------------------")
Expand All @@ -57,7 +57,7 @@ def restore(self):
CatalogRestoreManager(self.catalog_dir).restore()
except Exception as e:
self.logger.warning(f"Failed to restore catalog: {e}")
self.failures["Catalog"].append(f"Restoration failed: {e}")
self.failures.setdefault(app_name, []).append(f"Restoration failed: {e}")

if self.chart_info.apps_with_crds:
self.logger.info("\nRestoring Custom Resource Definitions\n"
Expand Down Expand Up @@ -90,7 +90,7 @@ def restore(self):
continue
except Exception as e:
self.logger.error(f"Failed to restore {app_name}: {e}\n")
self.failures[app_name].append(f"Restoration failed: {e}")
self.failures.setdefault(app_name, []).append(f"Restoration failed: {e}")
continue

self.logger.info("")
Expand All @@ -115,12 +115,12 @@ def restore(self):
db_manager = RestoreCNPGDatabase(app_name, self.chart_info.get_file(app_name, "database"))
result = db_manager.restore()
if not result["success"]:
self.failures[app_name].append(result["message"])
self.failures.setdefault(app_name, []).append(result["message"])
else:
self.logger.info(result["message"])
except Exception as e:
self.logger.error(f"Failed to restore database for {app_name}: {e}")
self.failures[app_name].append(f"Database restore failed: {e}")
self.failures.setdefault(app_name, []).append(f"Database restore failed: {e}")

self._log_failures()

Expand Down
Loading

0 comments on commit d6d8ef5

Please sign in to comment.