Skip to content

Commit 81e5b74

Browse files
committed
Merge pull request gmr#81 from fusiondog/restore-prune
Adding targets for ls, backup, and restore. Adds pruning to restore.
2 parents 8f0af56 + 3c259c2 commit 81e5b74

File tree

2 files changed

+53
-6
lines changed

2 files changed

+53
-6
lines changed

consulate/api/kv.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ def keys(self):
225225
"""
226226
return sorted([row['Key'] for row in self._get_all_items()])
227227

228-
def records(self):
228+
def records(self, key=None):
229229
"""Return a list of tuples for all of the records in the Key/Value
230230
service
231231
@@ -242,8 +242,12 @@ def records(self):
242242
:rtype: list of (Key, Flags, Value)
243243
244244
"""
245-
return [(item['Key'], item['Flags'], item['Value'])
246-
for item in self._get_all_items()]
245+
if key:
246+
return [(item['Key'], item['Flags'], item['Value'])
247+
for item in self._get_list([key], {'recurse': None})]
248+
else:
249+
return [(item['Key'], item['Flags'], item['Value'])
250+
for item in self._get_all_items()]
247251

248252
def release_lock(self, item, session):
249253
"""Release an existing lock from the Consul KV database.

consulate/cli.py

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,19 @@ def connection_error():
5555

5656
KV_PARSERS = [
5757
('backup', 'Backup to stdout or a JSON file', [
58+
[['key'], {'help': 'The key to use as target to backup a specific key or folder.',
59+
'nargs':'?'}],
5860
[['-b', '--base64'], {'help': 'Base64 encode values',
5961
'action': 'store_true'}],
6062
[['-f', '--file'], {'help': 'JSON file to write instead of stdout',
6163
'nargs': '?'}],
6264
[['-p', '--pretty'], {'help': 'pretty-print JSON output',
6365
'action': 'store_true'}]]),
6466
('restore', 'Restore from stdin or a JSON file', [
67+
[['key'], {'help': 'The key as target to restore to a specific key or folder.',
68+
'nargs':'?'}],
69+
[['-p', '--prune'], {'help':'Remove entries from consul tree that are not in restore file.',
70+
'action': 'store_true'}],
6571
[['-b', '--base64'], {'help': 'Restore from Base64 encode values',
6672
'action': 'store_true'}],
6773
[['-f', '--file'],
@@ -71,6 +77,8 @@ def connection_error():
7177
{'help': 'Do not replace existing entries',
7278
'action': 'store_true'}]]),
7379
('ls', 'List all of the keys', [
80+
[['key'], {'help': 'The key to use as target to list contents of specific key or folder',
81+
'nargs':'?'}],
7482
[['-l', '--long'],
7583
{'help': 'Long format',
7684
'action': 'store_true'}]]),
@@ -277,7 +285,13 @@ def kv_backup(consul, args):
277285
278286
"""
279287
handle = open(args.file, 'w') if args.file else sys.stdout
280-
records = consul.kv.records()
288+
if args.key:
289+
args.key = args.key.strip('/')
290+
prefixlen = len(args.key.split('/'))
291+
records = [('/'.join(k.split('/')[prefixlen:]), f, v)
292+
for k, f, v in consul.kv.records(args.key)]
293+
else:
294+
records = consul.kv.records()
281295
if args.base64:
282296
if utils.PYTHON3:
283297
records = [(k, f, str(base64.b64encode(utils.maybe_encode(v)),
@@ -341,7 +355,12 @@ def kv_ls(consul, args):
341355
342356
"""
343357
try:
344-
for key in consul.kv.keys():
358+
if args.key:
359+
args.key = args.key.lstrip('/')
360+
keylist = sorted(consul.kv.find(args.key))
361+
else:
362+
keylist = consul.kv.keys()
363+
for key in keylist:
345364
if args.long:
346365
keylen = 0
347366
if consul.kv[key]:
@@ -375,6 +394,12 @@ def kv_restore(consul, args):
375394
:param argparser.namespace args: The cli args
376395
377396
"""
397+
if args.prune:
398+
if args.key:
399+
args.key = args.key.strip('/')
400+
keylist = consul.kv.find(args.key)
401+
else:
402+
keylist = consul.kv.find('')
378403
handle = open(args.file, 'r') if args.file else sys.stdin
379404
data = json.load(handle)
380405
for row in data:
@@ -390,10 +415,28 @@ def kv_restore(consul, args):
390415
# Here's an awesome thing to make things work
391416
if not utils.PYTHON3 and isinstance(row[2], unicode):
392417
row[2] = row[2].encode('utf-8')
418+
if args.key:
419+
if row[0] == "":
420+
rowkey = args.key
421+
else:
422+
rowkey = args.key + '/' + row[0]
423+
else:
424+
rowkey = row[0]
425+
if args.prune:
426+
if rowkey in keylist:
427+
del keylist[rowkey]
393428
try:
394-
consul.kv.set_record(row[0], row[1], row[2], not args.no_replace)
429+
consul.kv.set_record(rowkey, row[1], row[2], not args.no_replace)
395430
except exceptions.ConnectionError:
396431
connection_error()
432+
if args.prune:
433+
for key in keylist:
434+
print "Pruning " + key
435+
try:
436+
consul.kv.delete(key)
437+
except exceptions.ConnectionError:
438+
connection_error()
439+
397440

398441

399442
def kv_rm(consul, args):

0 commit comments

Comments
 (0)