web app added
diff --git a/data_generator.py b/data_generator.py
index 019b861..975f307 100644
--- a/data_generator.py
+++ b/data_generator.py
@@ -15,7 +15,7 @@
 op_type = ["randread", "read", "randwrite", "write"]
 is_sync = ["s", "a"]
 
-storage = create_storage(sys.argv[1])
+storage = create_storage("file:///home/gstepanov/rally-results-processor/sample.json", "", "")
 combinations = list(itertools.product(op_type, is_sync, sz))
 
 for i in range(30):
@@ -27,4 +27,5 @@
         row[" ".join([sz, op_type, is_sync])] = (random.random() * 100,
                                                  random.random() * 5)
 
+    print row
     storage.store(row)
diff --git a/storage_api.py b/storage_api.py
index fb3d8b7..8e995c1 100644
--- a/storage_api.py
+++ b/storage_api.py
@@ -184,6 +184,7 @@
 
         return result
 
+
 if __name__ == "__main__":
     storage = create_storage("file:///home/gstepanov/rally-results-processor/sample.json", "", "")
     print storage.recent_builds()
diff --git a/web_app/__init__.py b/web_app/__init__.py
new file mode 100644
index 0000000..45e6180
--- /dev/null
+++ b/web_app/__init__.py
@@ -0,0 +1,88 @@
+from flask import Flask, render_template, url_for, request, g
+from flask_bootstrap import Bootstrap
+import json
+import os.path
+from storage_api import create_storage
+
+app = Flask(__name__)
+Bootstrap(app)
+
+
+def collect_tests():
+    result = []
+
+    for file in os.listdir("../test_results"):
+        if file.endswith(".json"):
+            result.append(file.split('.')[0])
+
+    return result
+
+
+def load_test(test_name):
+    test_name += '.json'
+
+    with open("../" + test_name, 'rt') as f:
+        raw = f.read()
+
+        if raw == '':
+            raise Exception("Test is emoty")
+
+        test = json.loads(raw)
+
+    return test
+
+
+@app.route("/", methods=['GET', 'POST'])
+def index():
+    data = []
+    for test in collect_tests():
+        d = {}
+        d["name"] = test
+        d["url"] = url_for("render_test", test_name=test)
+        data.append(d)
+
+    return render_template("index.html", tests=data)
+
+
+@app.route("/tests/<test_name>", methods=['GET'])
+def render_test(test_name):
+    tests = load_test(test_name)
+    header_keys = ['build_id', 'iso_md5', 'type']
+    table = []
+
+    if len(tests) > 0:
+        sorted_keys = sorted(tests[0].keys())
+
+    for key in sorted_keys:
+        if key not in header_keys:
+            header_keys.append(key)
+
+    for test in tests:
+        row = []
+
+        for header in header_keys:
+            if isinstance(test[header], list):
+                row.append(str(test[header][0]) + unichr(0x00B1) + str(test[header][1]))
+            else:
+                row.append(test[header])
+
+        table.append(row)
+
+    return render_template("table.html", headers=header_keys, table=table)
+
+
+@app.route("/tests/<test_name>", methods=['POST'])
+def add_test(test_name):
+    tests = json.loads(request.data)
+
+    if not hasattr(g, "storage"):
+        g.storage = create_storage("file:///home/gstepanov/rally-results-processor/test_results/sample.json", "", "")
+
+    for test in tests:
+        g.storage.store(test)
+    return "Created", 201
+
+
+
+if __name__ == "__main__":
+    app.run(debug=True)
\ No newline at end of file
diff --git a/web_app/templates/base.html b/web_app/templates/base.html
new file mode 100644
index 0000000..2067d55
--- /dev/null
+++ b/web_app/templates/base.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<html>
+  <head>
+    {% block head %}
+        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css"
+        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap-theme.min.css">
+        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
+    {% endblock %}
+  </head>
+  <body>
+      {% block body %}
+      {% endblock %}
+  </body>
+</html>
\ No newline at end of file
diff --git a/web_app/templates/index.html b/web_app/templates/index.html
new file mode 100644
index 0000000..ba32405
--- /dev/null
+++ b/web_app/templates/index.html
@@ -0,0 +1,25 @@
+{% extends "base.html" %}
+<html>
+<head>
+    {% block head %}
+    {{ super() }}
+    <title>Test report</title>
+    {% endblock %}
+</head>
+<body>
+    <h1>Tests</h1>
+    {% block body %}
+    <div>
+        <ol>
+            {% for test in tests %}
+            <li>
+                       <h2>
+                           <a href="{{ test.url }} ">{{ test.name }}</a>
+                        </h2>
+            </li>
+            {% endfor %}
+        </ol>
+    </div>
+    {% endblock %}
+</body>
+</html>
\ No newline at end of file
diff --git a/web_app/templates/table.html b/web_app/templates/table.html
new file mode 100644
index 0000000..0dba28c
--- /dev/null
+++ b/web_app/templates/table.html
@@ -0,0 +1,31 @@
+{% extends "base.html" %}
+<html>
+<head>
+    {% block head %}
+    {{ super() }}
+    <title>Table of results</title>
+    {% endblock %}
+</head>
+<body>
+    {% block body %}
+    <div class="table-responsive">
+        <table class="table">
+        {% for header in headers %}
+        <th>
+            <h2>{{ header }}</h2>
+        </th>
+        {% endfor %}
+        {% for row in table %}
+        <tr>
+            {% for data in row %}
+            <td>
+               {{ data }}
+            </td>
+            {%  endfor %}
+        </tr>
+        {% endfor %}
+        </table>
+    </div>
+    {% endblock %}
+</body>
+</html>
\ No newline at end of file