7 __author__ =
"Valentin Kuznetsov"
10 if sys.version_info < (2, 6):
11 raise Exception(
"DAS requires python 2.6 or greater")
18 from optparse
import OptionParser, OptionGroup
22 DAS cache client option parser
26 usage =
'usage: %prog [options] --query "dataset=/HT/Run2011A-*/AOD"'
27 self.
parser = OptionParser(usage=usage)
28 group = OptionGroup(self.
parser,
"Das options",
"These options relate to the Das client interface.")
29 group.add_option(
"-v",
"--verbose", action=
"store",
30 type=
"int", default=0, dest=
"verbose",
31 help=
"verbose output")
32 group.add_option(
"--query", action=
"store", type=
"string",
33 default=
False, dest=
"query",
34 help=
"specify query for your request")
35 group.add_option(
"--host", action=
"store", type=
"string",
36 default=
'https://cmsweb.cern.ch', dest=
"host",
37 help=
"specify host name of DAS cache server, default https://cmsweb.cern.ch")
38 group.add_option(
"--idx", action=
"store", type=
"int",
39 default=0, dest=
"idx",
40 help=
"start index for returned result set, aka pagination, use w/ limit")
41 group.add_option(
"--limit", action=
"store", type=
"int",
42 default=10, dest=
"limit",
43 help=
"number of returned results (results per page)")
44 group.add_option(
"--format", action=
"store", type=
"string",
45 default=
"json", dest=
"format",
46 help=
"specify return data format (json or plain), default json")
47 self.parser.add_option_group(group)
50 Returns parse list of options
52 return self.parser.parse_args()
55 """Filter data from a row for given list of filters"""
57 if ftr.find(
'>') != -1
or ftr.find(
'<') != -1
or ftr.find(
'=') != -1:
60 for key
in ftr.split(
'.'):
61 if isinstance(row, dict)
and row.has_key(key):
63 if isinstance(row, list):
65 if isinstance(item, dict)
and item.has_key(key):
71 """Contact DAS server and retrieve data for given DAS query"""
72 params = {
'input':query,
'idx':idx,
'limit':limit}
74 pat = re.compile(
'http[s]{0,1}://')
75 if not pat.match(host):
76 msg =
'Invalid hostname: %s' % host
79 headers = {
"Accept":
"application/json"}
80 encoded_data = urllib.urlencode(params, doseq=
True)
81 url +=
'?%s' % encoded_data
82 req = urllib2.Request(url=url, headers=headers)
84 hdlr = urllib2.HTTPHandler(debuglevel=1)
85 opener = urllib2.build_opener(hdlr)
87 opener = urllib2.build_opener()
88 fdesc = opener.open(req)
92 pat = re.compile(
r'^[a-z0-9]{32}')
93 if data
and isinstance(data, str)
and pat.match(data)
and len(data) == 32:
100 params.update({
'pid':data})
101 encoded_data = urllib.urlencode(params, doseq=
True)
102 url = host + path +
'?%s' % encoded_data
103 req = urllib2.Request(url=url, headers=headers)
105 fdesc = opener.open(req)
108 except urllib2.HTTPError, err:
111 if data
and isinstance(data, str)
and pat.match(data)
and len(data) == 32:
125 opts, _ = optmgr.get_opt()
132 raise Exception(
'You must provide input query')
133 data =
get_data(host, query, idx, limit, debug)
134 if opts.format ==
'plain':
135 jsondict = json.loads(data)
136 mongo_query = jsondict[
'mongo_query']
137 if mongo_query.has_key(
'filters'):
138 filters = mongo_query[
'filters']
139 data = jsondict[
'data']
140 if isinstance(data, dict):
141 rows = [r
for r
in get_value(data, filters)]
143 elif isinstance(data, list):
145 rows = [r
for r
in get_value(row, filters)]
static std::string join(char **cmd)