fake_zfs.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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': 'e2e/pool',
  19. 'used': '256K',
  20. 'avail': '23.7M',
  21. 'refer': '25K',
  22. 'canmount': 'on',
  23. 'mountpoint': '/e2e/pool',
  24. },
  25. {
  26. 'name': 'e2e/pool/dataset',
  27. 'used': '256K',
  28. 'avail': '23.7M',
  29. 'refer': '25K',
  30. 'canmount': 'on',
  31. 'mountpoint': '/e2e/pool/dataset',
  32. },
  33. )
  34. def load_snapshots():
  35. try:
  36. return json.load(open('/tmp/fake_zfs.json'))
  37. except FileNotFoundError:
  38. return []
  39. def save_snapshots(snapshots):
  40. json.dump(snapshots, open('/tmp/fake_zfs.json', 'w'))
  41. def print_dataset_list(arguments, datasets, snapshots):
  42. properties = arguments.properties.split(',')
  43. data = (
  44. (tuple(property_name.upper() for property_name in properties),) if arguments.header else ()
  45. ) + tuple(
  46. tuple(dataset.get(property_name, '-') for property_name in properties)
  47. for dataset in (snapshots if arguments.type == 'snapshot' else datasets)
  48. )
  49. if not data:
  50. return
  51. for data_row in data:
  52. print('\t'.join(data_row))
  53. def main():
  54. arguments = parse_arguments(*sys.argv[1:])
  55. snapshots = load_snapshots()
  56. if arguments.action == 'list':
  57. print_dataset_list(arguments, BUILTIN_DATASETS, snapshots)
  58. elif arguments.action == 'snapshot':
  59. snapshots.append(
  60. {
  61. 'name': arguments.name,
  62. 'used': '0B',
  63. 'avail': '-',
  64. 'refer': '25K',
  65. 'mountpoint': '-',
  66. },
  67. )
  68. save_snapshots(snapshots)
  69. elif arguments.action == 'destroy':
  70. snapshots = [snapshot for snapshot in snapshots if snapshot['name'] != arguments.name]
  71. save_snapshots(snapshots)
  72. if __name__ == '__main__':
  73. main()