Skip to content

Instantly share code, notes, and snippets.

@e-minguez
Last active June 11, 2020 11:29
Show Gist options
  • Select an option

  • Save e-minguez/f8a8c95bc91512b88bd37fdf3575ae7a to your computer and use it in GitHub Desktop.

Select an option

Save e-minguez/f8a8c95bc91512b88bd37fdf3575ae7a to your computer and use it in GitHub Desktop.
object,revision from an etcd database backup

Let's try etcd-dump-db to extract information from the etcd database backup.

It is not available as a package, so let's get get the source

$ sudo dnf provides etcd-dump-db
Updating Subscription Management repositories.
Last metadata expiration check: 0:38:46 ago on Thu 11 Jun 2020 08:30:30 AM UTC.
Error: No Matches found
$ go get -u -v github.com/coreos/etcd
$ cd ~/go/src/github.com/coreos/etcd/tools/etcd-dump-db
$ go build
$ sudo cp ./etcd-dump-db /usr/local/bin/

Create a database backup

$ oc debug node/kni1-vmaster-0 -- chroot /host sh -c '/usr/local/bin/cluster-backup.sh /tmp/backup-$(date +%Y%m%d-%H%M)'
$ oc debug node/kni1-vmaster-0 -- chroot /host sh -c 'cat /tmp/backup-20200611-09:13/snapshot_2020-06-11_091345.db' > snapshot_2020-06-11_091345.db

With etcd-dump-db I can extract most of the fields of the objects, including the resourceVersion:

$ oc get cm -n openshift-ovn-kubernetes ovn-ca -o yaml | grep -i resourceVersion
  resourceVersion: "7133"

$ etcd-dump-db iterate-bucket snapshot_2020-06-11_091345.db key --decode | grep "/kubernetes.io/configmaps/openshift-ovn-kubernetes/ovn-ca"
rev={main:7133 sub:0}, value=[key "/kubernetes.io/configmaps/openshift-ovn-kubernetes/ovn-ca" | val "k8s\x00\n\x0f\n\x02v1\x12\tConfigMap\x12\x9c\f\n\xd4\x02\n\x06ovn-ca\x12\x00\x1a\x18openshift-ovn-kubernetes\"\x00*$7d6b916a-67e7-459b-82d4-06e573ba60f62\x008\x00B\b\b\xef\xcd\xfe\xf6\x05\x10\x00Z7\n*auth.openshift.io/managed-certificate-type\x12\tca-bundlez\x00\x8a\x01\xbb\x01\n\x18cluster-network-operator\x12\x06Update\x1a\x02v1\"\b\b\xef\xcd\xfe\xf6\x05\x10\x002\bFieldsV1:\u007f\n}{\"f:data\":{\".\":{},\"f:ca-bundle.crt\":{}},\"f:metadata\":{\"f:labels\":{\".\":{},\"f:auth.openshift.io/managed-certificate-type\":{}}}}\x12\xc2\t\n\rca-bundle.crt\x12\xb0\t-----BEGIN CERTIFICATE-----\nMxxx\n-----END CERTIFICATE-----\n\x1a\x00\"\x00" | created 7133 | mod 7133 | ver 1]

So, we can use process.sh to create a csv file:

$ time ./process.sh > snapshot_2020-06-11_091345.csv

real	1m15.321s
user	0m54.628s
sys	0m33.788s

$ wc -l ./snapshot_2020-06-11_091345.csv
5813
#!/bin/bash
while IFS= read -r line
do
object=$(echo $line | sed 's/.*value=\[key "\(.*\)" | val.*/\1/')
rev=$(echo $line | sed -E "s/rev=\{main:([0-9]+) .*/\1/")
echo "$object,$rev"
done < <(etcd-dump-db iterate-bucket snapshot_2020-06-11_091345.db key --decode)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment