import repository from arizona
[raven.git] / owl / client / seattle / owl.repy
1 include httpretrieve.repy
2 include urllib.repy
3
4 class Field:
5     def __init__(self, name = None, module = None, type = 'string', 
6                  heading = None, headingAlign = 'center', align = 'center',
7                  stats = None, description = None):
8         self.name = name
9         self.module = module
10         self.type = type
11         self.heading = heading
12         self.headingAlign = headingAlign
13         self.align = align
14         self.stats = stats
15         self.description = description
16
17 class Owl:
18     def __init__(self, baseURL, timeout, maxRegisterBackoff, maxUpdateBackoff):
19         self.baseURL = baseURL
20         self.maxRegisterBackoff = maxRegisterBackoff
21         self.maxUpdateBackoff = maxUpdateBackoff
22         self.timeout = timeout
23         #socket.setdefaulttimeout(timeout)    XXX
24         self._protocol = "1.2"
25
26
27     def param_list_to_dict(self, l):
28         d = {}
29         for item in l:
30             d[item[0]] = item[1]
31         return d
32
33     def register(self, dbs, module, version, fields, heading = None, retry = True):
34         fieldNames = []
35         for field in fields:
36             fieldNames.append(field.name)
37         args = []
38         args.append(('protocol', self._protocol))
39         for db in dbs:
40             args.append(('db', db))
41         args.append(('module', module))
42         args.append(('version', version))
43         if heading != None:
44             args.append(('heading', heading))
45         args.append(('fields', ','.join(fieldNames)))
46         for field in fields:
47             field.module = module
48             fullname = "%s.%s" % (field.module, field.name)
49             args.append((fullname + ".name", field.name))
50             args.append((fullname + ".module", field.module))
51             args.append((fullname + ".type", field.type))
52             if field.heading != None:
53                 args.append((fullname + ".heading", field.heading))
54             args.append((fullname + ".headingAlign", field.headingAlign))
55             args.append((fullname + ".align", field.align))
56             if field.description != None:
57                 args.append((fullname + ".description", field.description))
58             if field.stats != None:
59                 statsStr = field.stats.join(',')
60                 args.append((fullname + ".stats", statsStr))
61
62         pdict = self.param_list_to_dict(args)
63
64         url = self.baseURL + "register?"
65
66         data = urllib_quote_parameters(pdict)
67
68         self._get_url(url, data, retry, 1, self.maxRegisterBackoff)
69
70     def update(self, dbs, values, retry = True):
71         keys = []
72         keys.append(('protocol',self._protocol))
73         for db in dbs:
74             keys.append(("db", db))
75         for name in values:
76             keys.append((name,values[name]))
77
78         pdict = self.param_list_to_dict(keys)
79
80         url = self.baseURL + "update?"
81         data = urllib_quote_parameters(pdict)
82         self._get_url(url, data, retry, 1, self.maxUpdateBackoff)
83
84     def delete(self, dbs, module, retry = True):
85         keys = []
86         keys.append(('protocol',self._protocol))
87         for db in dbs:
88             keys.append(("db", db))
89
90         pdict = self.param_list_to_dict(keys)
91
92         url = self.baseURL + "delete?"
93         data = urllib_quote_parameters(pdict)
94         self._get_url(url, data, retry, 1, self.maxUpdateBackoff)
95
96
97     def _get_url(self, url, data, retry, backoff, maxBackoff):
98         #exitCodes = [408, 503]
99         exitCodes = []
100
101         while 1:
102             s = None
103             try:
104                 try:
105                     s = httpretrieve_open(url, data, timeout=self.timeout)
106                 except Exception,e:
107                     # this is a kludge to catch <socket.error> and re-raise it
108                     # as SocketTimeoutError
109                     if str(e) == "(4, 'Interrupted system call')":
110                         raise SocketTimeoutError
111                     else:
112                         raise
113             except (HttpConnectionError, HttpBrokenServerError, SocketTimeoutError), e:
114                print "Exception in httpretrieve_open", type(e), str(e)
115                if retry:
116                    backoff = backoff * 2
117                    if backoff > maxBackoff:
118                        backoff = maxBackoff
119                else:
120                    break
121             except Exception, e:
122                 print "un-caught exception in owl._get_url:", type(e), str(e)
123             else:
124                 backoff = 0
125                 result =  s.read()
126                 status = result.split(" ")[0]
127                 msg = result[(len(status) + 1):]
128                 if status == "ERROR":
129                     raise IOError(result)
130                 elif status != "OK":
131                     print("Server returned unexpected status: " + status)
132                     raise IOError(result)
133                 else:
134                     break
135             if backoff > 0:
136                 sleep(backoff)