AiC and REST login
[myslice.git] / influxdb / client.py
1 from django.http import HttpResponse
2 from rest import error
3 import os,json,string,random
4 import logging,ConfigParser
5
6 from portal.models import MeasurementsDB
7
8 from manifold.core.query             import Query, AnalyzedQuery
9 from manifoldapi.manifoldapi         import execute_query
10
11 logger = logging.getLogger(__name__)
12
13 try :
14     from influxdb import InfluxDBClient
15 except :
16     logger.error('can\'t import InfluxDBClient module')
17
18 def createDatabase(request, slicename):
19     result = {}
20     
21     Config = config(request)
22     
23     server = Config.get('influxdb', 'server')
24     #port = Config.get('influxdb', 'port', 8086)
25     port = 8086
26     user = Config.get('influxdb', 'user')
27     password = Config.get('influxdb', 'password')
28     
29     dbname = slicename
30     dbuser = request.user.username
31     dbpassword = generatePassword()
32     
33     query = Query().get('user').filter_by('user_email', '==', dbuser).select('slices')
34     slices = execute_query(request, query)
35     
36     if not slicename in slices:
37         result['status'] = 'fail'
38         result['message'] = 'no permissions'
39         return HttpResponse(json.dumps(result), content_type="application/json")
40
41     client = InfluxDBClient(server, port, user, password, dbname)
42     
43     try :
44         client.create_database(dbname)
45     except Exception as e:
46         print e
47     
48     # Add database user
49     try :
50         client.add_database_user(dbuser, dbpassword)
51     except Exception as e:
52         print e
53     
54     # Make user a database admin
55     client.set_database_admin(dbuser)
56     
57     
58     # Insert an entry in the Influxdb table
59     i = MeasurementsDB(
60         backend         = 'influxdb',
61         server          = server,
62         port            = port,
63         dbname          = dbname,
64         dbuser          = dbuser,
65         dbpassword      = dbpassword
66     )
67     i.save()
68     
69     
70     result['status'] = 'ok'
71
72     return HttpResponse(json.dumps(result), content_type="application/json")
73
74 def infoDatabase(request, slicename):
75     Config = config(request)
76     
77     res = MeasurementsDB.objects.get(dbname=slicename, dbuser=request.user.username)
78     result = {
79               'server' : res.server,
80               'port' : res.port,
81               'dbname' : res.dbname,
82               'dbuser' : res.dbuser,
83               'dbpassword' : res.dbpassword
84               }
85     return HttpResponse(json.dumps(result), content_type="application/json")
86
87 def config(request):
88     Config = ConfigParser.ConfigParser()
89     Config.read(os.getcwd() + "/myslice/measurements.ini")
90
91     if not request.user.is_authenticated :
92         return HttpResponse(json.dumps({'error' : 'not authenticated'}), content_type="application/json")
93     
94     #if Config.has_section('influxdb') :
95     if not Config.has_option('influxdb', 'server') :
96         return HttpResponse(json.dumps({'error' : 'server not specified'}), content_type="application/json")
97     
98     if not Config.has_option('influxdb', 'user') :
99         return HttpResponse(json.dumps({'error' : 'user not specified'}), content_type="application/json")
100     
101     if not Config.has_option('influxdb', 'password') :
102         return HttpResponse(json.dumps({'error' : 'server not specified'}), content_type="application/json")
103     
104     return Config
105
106 def generatePassword():
107     password_len = 16
108     password = []
109     
110     for group in (string.ascii_letters, string.punctuation, string.digits):
111         password += random.sample(group, 3)
112     
113     password += random.sample(
114                      string.ascii_letters + string.punctuation + string.digits,
115                      password_len - len(password))
116     
117     random.shuffle(password)
118     password = ''.join(password)
119     
120     
121     return password
122     
123