Prefer to create delta snapshot if possible

This commit is contained in:
2018-04-21 17:24:41 -05:00
parent 38fdef12e6
commit 86e9b60dbb
4 changed files with 46 additions and 15 deletions
+1 -1
View File
@@ -55,7 +55,7 @@ logs:
kubectl logs geth-$(net) -f
ssh:
kubectl exec -it geth-$(net) -- /bin/bash
kubectl exec -it geth-$(net)-02 -- /bin/bash
attach:
kubectl exec -it geth-$(net)-01 -- $(geth) attach
+26 -9
View File
@@ -22,9 +22,34 @@ class Bootnode(object):
print('{0}\t{1}\t{2}'.format(snap.name, snap.link, snap.status))
def get_last_snapshot(self, network=None):
snap = self.gcloud.last_snapshot(network=network)
snap = self.gcloud.get_last_snapshot(network=network)
print('{0}\t{1}\t{2}'.format(snap.name, snap.link, snap.status))
def snapshot_pod(self, name):
pod = self.kube.get_pod(name)
if pod.syncing():
raise Exception('Pod not synced: ""' % pod.name)
name = "{0}-{1}-{2}".format(pod.client, pod.network, pod.block_number())
print(self.gcloud.snapshot_disk(pod.disk, name, pod_name=pod.name))
def update_snapshot(self, network=None):
if not network:
raise Exception('Network must be specified')
# Re-use last snapshot so subsequent snapshots are just deltas,
# otherwise find any sync'd pod and start there
snap = self.gcloud.get_last_snapshot(network=network)
if snap:
pod = self.kube.get_pod(snap.pod)
else:
pod = self.kube.get_synced_pod(network)
if not pod or pod.syncing():
raise Exception('Pod not synced: ""' % pod.name)
name = "{0}-{1}-{2}".format(pod.client, pod.network, pod.block_number())
print(self.gcloud.snapshot_disk(pod.disk, name, pod_name=pod.name))
# Pods
def list_pods(self, network=None):
for pod in self.kube.list_pods(network=network):
@@ -43,14 +68,6 @@ class Bootnode(object):
print('{0}\t{1}\t{2}\t{3}'.format(pod.name, pod.phase,
pod.block_number(), pod.ip))
def snapshot_pod(self, name, pod_name=None, network=None):
if pod_name:
pod = self.kube.get_pod(pod_name)
else:
pod = self.kube.get_synced_pod(network)
print(self.gcloud.snapshot_disk(pod.disk, name))
# Scaling
def scale_up(args):
pass
+10 -3
View File
@@ -48,6 +48,9 @@ class Snapshot(object):
self.network = bits[1]
self.block = int(bits[2])
# self.pod = obj['labels']['pod']
self.pod = 'geth-testnet-02'
self.id = obj['id']
self.created_at = obj['creationTimestamp']
self.disk_size = obj['diskSizeGb'] + 'Gi'
@@ -105,12 +108,16 @@ class Gcloud(object):
return [s for s in snaps if s.network == network]
def get_last_snapshot(self, network=None):
return max(self.list_snapshots(network), key=lambda x: x.created_at)
return max(self.list_snapshots(network), key=lambda x: x.block)
def snapshot_disk(self, disk, name, project=None, zone=None):
def snapshot_disk(self, disk, name, pod_name=None, project=None, zone=None):
if not project:
project = self.project
if not zone:
zone = self.zone
body = {
'name': name,
'labels': {'pod-name': pod_name},
}
return self.api.disks().createSnapshot(project=project, zone=zone,
disk=disk, body={'name': name}).execute()
disk=disk, body=body).execute()
+9 -2
View File
@@ -13,6 +13,9 @@ def run_command(cmd, args):
# Create kwargs from args specified
kwargs = dict(map(lambda k: (k, getattr(args, k)), keys))
# Clear out any default args that are unspecified
kwargs = {k: v for k, v in kwargs.items() if v is not None}
# Call relevant method on Bootnode
getattr(bootnode, cmd)(**kwargs)
@@ -37,10 +40,14 @@ if __name__ == '__main__':
last_parser.set_defaults(command='get_last_snapshot')
snapshot_pod_parser = subparsers.add_parser('snapshot-pod', help='Snapshot pod')
snapshot_pod_parser.add_argument('--pod_name', help='Name of pod to snapshot')
snapshot_pod_parser.add_argument('name', help='Name of snapshot')
snapshot_pod_parser.add_argument('name', help='Name of pod to snapshot')
snapshot_pod_parser.set_defaults(command='snapshot_pod')
update_snapshot_parser = subparsers.add_parser('update-snapshot',
help='Update snapshot for a given network')
update_snapshot_parser.add_argument('network', help='Network to update snapshot for')
update_snapshot_parser.set_defaults(command='update_snapshot')
# Pods
list_parser = subparsers.add_parser('pods', help='List pods')
list_parser.set_defaults(command='list_pods')