2
0

fake_zfs.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import argparse
  2. import json
  3. import sys
  4. def parse_arguments(*unparsed_arguments):
  5. global_parser = argparse.ArgumentParser(add_help=False)
  6. action_parsers = global_parser.add_subparsers(dest='action')
  7. list_parser = action_parsers.add_parser('list')
  8. list_parser.add_argument('-H', dest='header', action='store_false', default=True)
  9. list_parser.add_argument('-t', dest='type', default='filesystem')
  10. list_parser.add_argument('-o', dest='properties', default='name,used,avail,refer,mountpoint')
  11. snapshot_parser = action_parsers.add_parser('snapshot')
  12. snapshot_parser.add_argument('name')
  13. destroy_parser = action_parsers.add_parser('destroy')
  14. destroy_parser.add_argument('name')
  15. return global_parser.parse_args(unparsed_arguments)
  16. BUILTIN_DATASETS = (
  17. {
  18. 'name': 'pool',
  19. 'used': '256K',
  20. 'avail': '23.7M',
  21. 'refer': '25K',
  22. 'mountpoint': '/pool',
  23. },
  24. {
  25. 'name': 'pool/dataset',
  26. 'used': '256K',
  27. 'avail': '23.7M',
  28. 'refer': '25K',
  29. 'mountpoint': '/pool/dataset',
  30. },
  31. )
  32. def load_snapshots():
  33. try:
  34. return json.load(open('/tmp/fake_zfs.json'))
  35. except FileNotFoundError:
  36. return []
  37. def save_snapshots(snapshots):
  38. json.dump(snapshots, open('/tmp/fake_zfs.json', 'w'))
  39. def print_dataset_list(arguments, datasets, snapshots):
  40. properties = arguments.properties.split(',')
  41. data = (
  42. (tuple(property_name.upper() for property_name in properties),) if arguments.header else ()
  43. ) + tuple(
  44. tuple(dataset.get(property_name, '-') for property_name in properties)
  45. for dataset in (snapshots if arguments.type == 'snapshot' else datasets)
  46. )
  47. if not data:
  48. return
  49. for data_row in data:
  50. print('\t'.join(data_row))
  51. def main():
  52. arguments = parse_arguments(*sys.argv[1:])
  53. snapshots = load_snapshots()
  54. if arguments.action == 'list':
  55. print_dataset_list(arguments, BUILTIN_DATASETS, snapshots)
  56. elif arguments.action == 'snapshot':
  57. snapshots.append(
  58. {
  59. 'name': arguments.name,
  60. 'used': '0B',
  61. 'avail': '-',
  62. 'refer': '25K',
  63. 'mountpoint': '-',
  64. },
  65. )
  66. save_snapshots(snapshots)
  67. elif arguments.action == 'destroy':
  68. snapshots = [snapshot for snapshot in snapshots if snapshot['name'] != arguments.name]
  69. save_snapshots(snapshots)
  70. if __name__ == '__main__':
  71. main()