Merge lp:~joetalbott/utah/parser_update into lp:utah

Proposed by Joe Talbott
Status: Merged
Merged at revision: 756
Proposed branch: lp:~joetalbott/utah/parser_update
Merge into: lp:utah
Diff against target: 89 lines (+41/-9)
1 file modified
utah/parser.py (+41/-9)
To merge this branch: bzr merge lp:~joetalbott/utah/parser_update
Reviewer Review Type Date Requested Status
Javier Collado (community) Approve
Review via email: mp+135433@code.launchpad.net

Description of the change

This branch adds support for parsing UTAH client logs stored in string.

In addition there is improved error handling and I removed a hardcoded path.

To post a comment you must log in.
Revision history for this message
Javier Collado (javier.collado) wrote :

Looks fine to me.

I've seen http support has been added to download a remote file. Note that you
can use utah.url.url_argument to add support for launchpad url's as well:

from utah.url import url_argument

# bzr export log_file_url
log_file = url_argument(log_file_url)

review: Approve
Revision history for this message
Joe Talbott (joetalbott) wrote :

This code is to be packaged as a separate module and will be run from the dashboard. Once we get pieces of utah packaged individually I'll use the utah.url module. For the time being I'm going to merge.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'utah/parser.py'
--- utah/parser.py 2012-11-14 22:10:40 +0000
+++ utah/parser.py 2012-11-21 15:03:20 +0000
@@ -1,5 +1,8 @@
1import argparse
2import jsonschema
3import logging
1import os4import os
2import jsonschema5import urllib2
3import yaml6import yaml
47
5class UTAHParser(object):8class UTAHParser(object):
@@ -67,25 +70,31 @@
67 },70 },
68 }71 }
6972
70 def parse(self, logdata):73 def parse(self, logdata, as_string=False):
71 """74 """
72 Parse utah client results.75 Parse utah client results.
7376
74 logdata should be either a filename or a handle to a file77 logdata should be either a filename or a handle to a file
75 object.78 object.
7679
77 Returns the parsed yaml data.80 Returns the parsed yaml data or None.
7881
79 """82 """
8083
81 if isinstance(logdata, str):84 if as_string:
85 return self._parse_string(logdata)
86 elif isinstance(logdata, str):
82 return self._parse_logfile(logdata)87 return self._parse_logfile(logdata)
83 else:88 else:
84 return self._parse_stream(logdata)89 return self._parse_stream(logdata)
8590
86 def _parse_stream(self, stream):91 def _parse_stream(self, stream):
87 """ Parse client output from stream. """92 """ Parse client output from stream. """
88 data = yaml.load(stream)93 try:
94 data = yaml.load(stream)
95 except yaml.YAMLError as e:
96 logging.error(e)
97 return None
8998
90 jsonschema.validate(data, self.CLIENT_OUTPUT_SCHEMA)99 jsonschema.validate(data, self.CLIENT_OUTPUT_SCHEMA)
91100
@@ -96,13 +105,36 @@
96105
97 data = None106 data = None
98107
99 with open(logfile, 'r') as fp:108 if logfile.startswith('http'):
109 fp = urllib2.urlopen(logfile)
100 data = self._parse_stream(fp)110 data = self._parse_stream(fp)
101111 else:
102 return data112 with open(logfile, 'r') as fp:
113 data = self._parse_stream(fp)
114
115 return data
116
117 def _parse_string(self, log_data):
118 """ Parse client data from a string. """
119 try:
120 data = yaml.load(log_data)
121 except yaml.YAMLError as e:
122 logging.error(e)
123 return None
124
125 jsonschema.validate(data, self.CLIENT_OUTPUT_SCHEMA)
126
127 return data
128
103129
104if __name__ == "__main__":130if __name__ == "__main__":
131 arg_parser = argparse.ArgumentParser(description='phoenix bootstrapper')
132 arg_parser.add_argument('logfile', metavar='LOGFILE', type=str,
133 help='log file to parse')
134
135 args = arg_parser.parse_args()
136
105 parser = UTAHParser()137 parser = UTAHParser()
106 data = parser.parse("/tmp/utah.yaml")138 data = parser.parse(args.logfile)
107 print(data)139 print(data)
108140

Subscribers

People subscribed via source and target branches