apiVersion: cr.kanister.io/v1alpha1 kind: Blueprint metadata: name: maria-blueprint actions: backup: outputArtifacts: mariaBackup: # Capture the kopia snapshot information for subsequent actions # The information includes the kopia snapshot ID which is essential for restore and delete to succeed # `kopiaOutput` is the name provided to kando using `--output-name` flag kopiaSnapshot: "{{ .Phases.dumpToStore.Output.kopiaOutput }}" phases: - func: KubeTask name: dumpToStore objects: mariaSecret: kind: Secret name: '{{ .StatefulSet.Name }}' namespace: '{{ .StatefulSet.Namespace }}' args: image: ghcr.io/kanisterio/mysql-sidecar:0.107.0 namespace: "{{ .StatefulSet.Namespace }}" command: - bash - -o - errexit - -o - pipefail - -c - | backup_file_path="dump.sql" root_password="{{ index .Phases.dumpToStore.Secrets.mariaSecret.Data "mariadb-root-password" | toString }}" exclude_db="('information_schema', 'mysql', 'performance_schema')" dump_databases="" for db in `mysql -u root -h {{ .StatefulSet.Name }} --password=${root_password} -ANe "use information_schema; select schema_name from schemata where schema_name not in ${exclude_db}"` do dump_databases="${dump_databases} ${db}" done dump_cmd="mysqldump -u root --password=${root_password} -h {{ .StatefulSet.Name }} --column-statistics=0 --single-transaction --databases ${dump_databases}" ${dump_cmd} | kando location push --profile '{{ toJson .Profile }}' --path "${backup_file_path}" --output-name "kopiaOutput" - restore: inputArtifactNames: # The kopia snapshot info created in backup phase can be used here # Use the `--kopia-snapshot` flag in kando to pass in `mariaBackup.KopiaSnapshot` - mariaBackup phases: - func: KubeTask name: restoreFromStore objects: mariaSecret: kind: Secret name: '{{ .StatefulSet.Name }}' namespace: '{{ .StatefulSet.Namespace }}' args: image: ghcr.io/kanisterio/mysql-sidecar:0.107.0 namespace: "{{ .StatefulSet.Namespace }}" command: - bash - -o - errexit - -o - pipefail - -c - | backup_file_path="dump.sql" kopia_snap='{{ .ArtifactsIn.mariaBackup.KopiaSnapshot }}' root_password="{{ index .Phases.restoreFromStore.Secrets.mariaSecret.Data "mariadb-root-password" | toString }}" kando location pull --profile '{{ toJson .Profile }}' --path "${backup_file_path}" --kopia-snapshot "${kopia_snap}" - | mysql -u root --password=${root_password} -h {{ .StatefulSet.Name }} delete: inputArtifactNames: # The kopia snapshot info created in backup phase can be used here # Use the `--kopia-snapshot` flag in kando to pass in `mariaBackup.KopiaSnapshot` - mariaBackup phases: - func: KubeTask name: deleteFromStore args: image: ghcr.io/kanisterio/mysql-sidecar:0.107.0 namespace: "{{ .Namespace.Name }}" command: - bash - -o - errexit - -o - pipefail - -c - | backup_file_path="dump.sql" kopia_snap='{{ .ArtifactsIn.mariaBackup.KopiaSnapshot }}' kando location delete --profile '{{ toJson .Profile }}' --path "${backup_file_path}" --kopia-snapshot "${kopia_snap}"