lab info save added
diff --git a/web_app/__init__.py b/web_app/__init__.py
index eaf9680..ac0bc15 100644
--- a/web_app/__init__.py
+++ b/web_app/__init__.py
@@ -1,81 +1,17 @@
 # <koder>: order imports in usual way
 import json
+from logging import getLogger, INFO
 
-from urlparse import urlparse
 from flask import render_template, url_for, make_response, request
 from report import build_vertical_bar, build_lines_chart
-from logging import getLogger, INFO
 from web_app import app
-from web_app.keystone import KeystoneAuth
-from persistance.storage_api import builds_list, prepare_build_data, get_data_for_table, add_data, get_builds_data
+from persistance.storage_api import builds_list, prepare_build_data, get_data_for_table, add_data, get_builds_data, \
+    get_build_info, get_build_detailed_info
 from web_app.app import app
 import os.path
 from werkzeug.routing import Rule
 
 
-def total_lab_info(data):
-    # <koder>: give 'd' meaningful name
-    d = {}
-    d['nodes_count'] = len(data['nodes'])
-    d['total_memory'] = 0
-    d['total_disk'] = 0
-    d['processor_count'] = 0
-
-    for node in data['nodes']:
-        d['total_memory'] += node['memory']['total']
-        d['processor_count'] += len(node['processors'])
-
-        for disk in node['disks']:
-            d['total_disk'] += disk['size']
-
-    to_gb = lambda x: x / (1024 ** 3)
-    d['total_memory'] = format(to_gb(d['total_memory']), ',d')
-    d['total_disk'] = format(to_gb(d['total_disk']), ',d')
-    return d
-
-
-def collect_lab_data(meta):
-    u = urlparse(meta['__meta__'])
-    cred = {"username": "admin", "password": "admin", "tenant_name": "admin"}
-    keystone = KeystoneAuth(root_url=meta['__meta__'], creds=cred, admin_node_ip=u.hostname)
-    lab_info = keystone.do(method='get', path="")
-    nodes = []
-    result = {}
-
-    for node in lab_info:
-        # <koder>: give p,i,d,... vars meaningful names
-        d = {}
-        d['name'] = node['name']
-        p = []
-        i = []
-        disks = []
-        devices = []
-
-        for processor in node['meta']['cpu']['spec']:
-             p.append(processor)
-
-        for iface in node['meta']['interfaces']:
-            i.append(iface)
-
-        m = node['meta']['memory'].copy()
-
-        for disk in node['meta']['disks']:
-            disks.append(disk)
-
-        d['memory'] = m
-        d['disks'] = disks
-        d['devices'] = devices
-        d['interfaces'] = i
-        d['processors'] = p
-
-        nodes.append(d)
-
-    result['nodes'] = nodes
-    result['name'] = 'Perf-1 Env'
-
-    return result
-
-
 def merge_builds(b1, b2):
     d = {}
 
@@ -119,10 +55,8 @@
 
 @app.endpoint('render_test')
 def render_test(test_name):
-    meta = {"__meta__": "http://172.16.52.112:8000/api/nodes"}
-    data = collect_lab_data(meta)
-    lab_meta = total_lab_info(data)
     results = prepare_build_data(test_name)
+    lab_meta = get_build_detailed_info(test_name)
 
     bars = build_vertical_bar(results)
     lines = build_lines_chart(results)
@@ -138,12 +72,10 @@
 @app.endpoint('render_table')
 def render_table(test_name):
     builds = get_data_for_table(test_name)
+    data = get_build_info(test_name)
 
     header_keys = ['build_id', 'iso_md5', 'type', 'date']
     table = [[]]
-    meta = {"__meta__": "http://172.16.52.112:8000/api/nodes"}
-    data = collect_lab_data(meta)
-
     if len(builds) > 0:
         sorted_keys = sorted(builds[0].keys())
 
diff --git a/web_app/keystone.py b/web_app/keystone.py
deleted file mode 100644
index e6308b5..0000000
--- a/web_app/keystone.py
+++ /dev/null
@@ -1,89 +0,0 @@
-from functools import partial
-import json
-import urllib2
-from keystoneclient.v2_0 import Client as keystoneclient
-from keystoneclient import exceptions
-
-
-class Urllib2HTTP(object):
-    """
-    class for making HTTP requests
-    """
-
-    allowed_methods = ('get', 'put', 'post', 'delete', 'patch', 'head')
-
-    def __init__(self, root_url, headers=None, echo=False):
-        """
-        """
-        if root_url.endswith('/'):
-            self.root_url = root_url[:-1]
-        else:
-            self.root_url = root_url
-
-        self.headers = headers if headers is not None else {}
-        self.echo = echo
-
-    def do(self, method, path, params=None):
-        if path.startswith('/'):
-            url = self.root_url + path
-        else:
-            url = self.root_url + '/' + path
-
-        if method == 'get':
-            assert params == {} or params is None
-            data_json = None
-        else:
-            data_json = json.dumps(params)
-
-        request = urllib2.Request(url,
-                                  data=data_json,
-                                  headers=self.headers)
-        if data_json is not None:
-            request.add_header('Content-Type', 'application/json')
-
-        request.get_method = lambda: method.upper()
-        response = urllib2.urlopen(request)
-
-        if response.code < 200 or response.code > 209:
-            raise IndexError(url)
-
-        content = response.read()
-
-        if '' == content:
-            return None
-
-        return json.loads(content)
-
-    def __getattr__(self, name):
-        if name in self.allowed_methods:
-            return partial(self.do, name)
-        raise AttributeError(name)
-
-
-class KeystoneAuth(Urllib2HTTP):
-    def __init__(self, root_url, creds, headers=None, echo=False,
-                 admin_node_ip=None):
-        super(KeystoneAuth, self).__init__(root_url, headers, echo)
-        self.keystone_url = "http://{0}:5000/v2.0".format(admin_node_ip)
-        self.keystone = keystoneclient(
-            auth_url=self.keystone_url, **creds)
-        self.refresh_token()
-
-    def refresh_token(self):
-        """Get new token from keystone and update headers"""
-        try:
-            self.keystone.authenticate()
-            self.headers['X-Auth-Token'] = self.keystone.auth_token
-        except exceptions.AuthorizationFailure:
-            print 'asdfsf'
-
-    def do(self, method, path, params=None):
-        """Do request. If gets 401 refresh token"""
-        try:
-            return super(KeystoneAuth, self).do(method, path, params)
-        except urllib2.HTTPError as e:
-            if e.code == 401:
-                self.refresh_token()
-                return super(KeystoneAuth, self).do(method, path, params)
-            else:
-                raise