nova 4.8 KB

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