nova 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #!/usr/bin/env python
  2. import os
  3. import sys
  4. import io
  5. import argparse
  6. import requests
  7. import ConfigParser
  8. from nova import memtar
  9. class Config(object):
  10. def __init__(self, args, dataset_id=None):
  11. self.root = os.path.abspath('.nova')
  12. args = vars(args)
  13. self.token = args.get('token', None)
  14. self.remote = args.get('remote', None)
  15. self.id = args.get('id', None) or dataset_id
  16. if os.path.exists(self.path):
  17. parser = ConfigParser.RawConfigParser()
  18. parser.read(self.path)
  19. self.token = parser.get('core', 'token')
  20. self.remote = parser.get('core', 'remote')
  21. self.id = parser.get('core', 'id')
  22. @property
  23. def path(self):
  24. return os.path.join(self.root, 'config')
  25. def write(self):
  26. parser = ConfigParser.RawConfigParser()
  27. parser.add_section('core')
  28. parser.set('core', 'remote', self.remote)
  29. parser.set('core', 'token', self.token)
  30. parser.set('core', 'id', self.id)
  31. print self.root
  32. if not os.path.exists(self.root):
  33. os.mkdir(self.root)
  34. with open(self.path, 'wb') as f:
  35. parser.write(f)
  36. def url(self, u):
  37. if not self.remote:
  38. sys.exit("No remote specified in configuration or as an argument.")
  39. return '{}{}'.format(self.remote, u)
  40. def __repr__(self):
  41. return '<Config remote={}, token={}, id={}>'.format(self.remote, self.token, self.id)
  42. def push(args):
  43. config = Config(args)
  44. params = dict(token=config.token)
  45. f = memtar.create_tar(os.path.abspath('.'))
  46. f.seek(0L)
  47. url = config.remote + '/upload/' + config.id
  48. r = requests.post(url, params=params, data=f)
  49. print r.status_code
  50. def clone(args):
  51. config = Config(args)
  52. params = dict(token=config.token)
  53. if not args.name:
  54. r = requests.get(config.url('/api/datasets/') + config.id, params=params)
  55. name = r.json()['name']
  56. else:
  57. name = args.name
  58. url = config.url('/clone/' + config.id)
  59. r = requests.get(url, params=params)
  60. f = io.BytesIO(r.content)
  61. memtar.extract_tar(f, os.path.join(os.path.abspath('.'), name))
  62. config.root = os.path.join(os.path.abspath(name), '.nova')
  63. config.write()
  64. def init(args):
  65. name = args.name if args.name else os.path.basename(os.path.abspath(os.curdir))
  66. config = Config(args)
  67. # create dataset on remote
  68. data = dict(name=name)
  69. params = dict(token=args.token)
  70. r = requests.post(config.url('/api/datasets'), params=params, data=data)
  71. result = r.json()
  72. # write initial configuration
  73. config.id = result['id']
  74. config.write()
  75. def list_datasets(args):
  76. config = Config(args)
  77. params = dict(token=config.token)
  78. r = requests.get(config.url('/api/datasets'), params=params)
  79. for d in r.json():
  80. print d['id'], d['name']
  81. if __name__ == '__main__':
  82. parser = argparse.ArgumentParser()
  83. cmd_parsers = parser.add_subparsers(title="Commands")
  84. init_parser = cmd_parsers.add_parser('init', help="Initialize dataset in current directory")
  85. init_parser.add_argument('--name', type=str, help="Dataset name, if not given current directory name")
  86. init_parser.add_argument('--remote', type=str, help="URL of remote NOVA instance")
  87. init_parser.add_argument('--token', type=str,
  88. help="Access token")
  89. init_parser.set_defaults(run=init)
  90. list_parser = cmd_parsers.add_parser('list', help="List datasets assigned to me")
  91. list_parser.add_argument('--remote', type=str, help="URL of remote NOVA instance")
  92. list_parser.add_argument('--token', type=str, help="Access token")
  93. list_parser.set_defaults(run=list_datasets)
  94. push_parser = cmd_parsers.add_parser('push', help="Finalize data and push to remote")
  95. push_parser.set_defaults(run=push)
  96. clone_parser = cmd_parsers.add_parser('clone', help="Clone dataset")
  97. clone_parser.add_argument('--remote', type=str, help="URL of remote NOVA instance")
  98. clone_parser.add_argument('--token', type=str, help="Access token")
  99. clone_parser.add_argument('--id', required=True, type=str, help="Dataset identifier")
  100. clone_parser.add_argument('--name', type=str, help="Alternative directory name")
  101. clone_parser.set_defaults(run=clone)
  102. args = parser.parse_args()
  103. args.run(args)