fake_zfs.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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. (
  43. tuple(property_name.upper() for property_name in properties),
  44. )
  45. if arguments.header else ()
  46. ) + tuple(
  47. tuple(
  48. dataset.get(property_name, '-') for property_name in properties
  49. )
  50. for dataset in (snapshots if arguments.type == 'snapshot' else datasets)
  51. )
  52. if not data:
  53. return
  54. for data_row in data:
  55. print('\t'.join(data_row))
  56. def main():
  57. arguments = parse_arguments(*sys.argv[1:])
  58. snapshots = load_snapshots()
  59. if arguments.action == 'list':
  60. print_dataset_list(arguments, BUILTIN_DATASETS, snapshots)
  61. elif arguments.action == 'snapshot':
  62. snapshots.append(
  63. {
  64. 'name': arguments.name,
  65. 'used': '0B',
  66. 'avail': '-',
  67. 'refer': '25K',
  68. 'mountpoint': '-',
  69. },
  70. )
  71. save_snapshots(snapshots)
  72. elif arguments.action == 'destroy':
  73. snapshots = [
  74. snapshot for snapshot in snapshots
  75. if snapshot['name'] != arguments.name
  76. ]
  77. save_snapshots(snapshots)
  78. if __name__ == '__main__':
  79. main()