
Module group may contain modules that belong to different project types. Show only those that belong to selected project type completely. Otherwise user may wonder why the same module group shows different results depending on selected project type - that may be misleading. Also added 'unknown' module into project type 'all'. That module holds all emails that were not assigned to any of known modules Change-Id: Ie0f54802463d67ba9de7ddb76f58314b05e58e19
194 lines
6.1 KiB
Python
194 lines
6.1 KiB
Python
# Copyright (c) 2013 Mirantis Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
# implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
import collections
|
|
import os
|
|
|
|
import flask
|
|
from oslo.config import cfg
|
|
|
|
from dashboard import memory_storage
|
|
from stackalytics.openstack.common import log as logging
|
|
from stackalytics.processor import runtime_storage
|
|
from stackalytics.processor import utils
|
|
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
|
|
def get_vault():
|
|
vault = getattr(flask.current_app, 'stackalytics_vault', None)
|
|
if not vault:
|
|
try:
|
|
vault = {}
|
|
runtime_storage_inst = runtime_storage.get_runtime_storage(
|
|
cfg.CONF.runtime_storage_uri)
|
|
vault['runtime_storage'] = runtime_storage_inst
|
|
vault['memory_storage'] = memory_storage.get_memory_storage(
|
|
memory_storage.MEMORY_STORAGE_CACHED)
|
|
|
|
init_releases(vault)
|
|
|
|
flask.current_app.stackalytics_vault = vault
|
|
except Exception as e:
|
|
LOG.critical('Failed to initialize application: %s', e)
|
|
LOG.exception(e)
|
|
flask.abort(500)
|
|
|
|
if not getattr(flask.request, 'stackalytics_updated', None):
|
|
flask.request.stackalytics_updated = True
|
|
memory_storage_inst = vault['memory_storage']
|
|
have_updates = memory_storage_inst.update(
|
|
vault['runtime_storage'].get_update(os.getpid()))
|
|
|
|
if have_updates:
|
|
init_releases(vault)
|
|
init_module_groups(vault)
|
|
init_project_types(vault)
|
|
|
|
return vault
|
|
|
|
|
|
def get_memory_storage():
|
|
return get_vault()['memory_storage']
|
|
|
|
|
|
def init_releases(vault):
|
|
runtime_storage_inst = vault['runtime_storage']
|
|
releases = runtime_storage_inst.get_by_key('releases')
|
|
releases_map = {}
|
|
|
|
if releases:
|
|
vault['start_date'] = releases[0]['end_date']
|
|
vault['end_date'] = releases[-1]['end_date']
|
|
start_date = releases[0]['end_date']
|
|
for r in releases[1:]:
|
|
r['start_date'] = start_date
|
|
start_date = r['end_date']
|
|
releases_map = dict((r['release_name'].lower(), r)
|
|
for r in releases[1:])
|
|
|
|
vault['releases'] = releases_map
|
|
|
|
|
|
def _make_module(module_id, text, modules, tag):
|
|
return {'id': module_id, 'text': text,
|
|
'modules': set(modules), 'tag': tag}
|
|
|
|
|
|
def init_module_groups(vault):
|
|
runtime_storage_inst = vault['runtime_storage']
|
|
memory_storage_inst = vault['memory_storage']
|
|
|
|
module_group_index = collections.defaultdict(set)
|
|
module_id_index = {}
|
|
module_groups = runtime_storage_inst.get_by_key('module_groups') or {}
|
|
|
|
for module_group in module_groups.values():
|
|
module_group_name = module_group['module_group_name']
|
|
module_group_id = module_group.get('id') or module_group_name.lower()
|
|
|
|
module_id_index[module_group_id] = _make_module(
|
|
module_group_id, module_group_name, module_group['modules'],
|
|
module_group.get('tag') or 'group')
|
|
|
|
for module in module_group['modules']:
|
|
module_group_index[module].add(module_group_id)
|
|
|
|
for module in memory_storage_inst.get_modules():
|
|
module_id_index[module] = _make_module(module.lower(), module,
|
|
[module.lower()], 'module')
|
|
|
|
module_id_index['all'] = _make_module('all', 'All',
|
|
memory_storage_inst.get_modules(),
|
|
'project_type')
|
|
|
|
vault['module_group_index'] = module_group_index
|
|
vault['module_id_index'] = module_id_index
|
|
|
|
|
|
def init_project_types(vault):
|
|
runtime_storage_inst = vault['runtime_storage']
|
|
project_types = runtime_storage_inst.get_by_key('project_types') or {}
|
|
|
|
result = []
|
|
parent = None
|
|
for pt in project_types:
|
|
is_child = pt.get('child', False)
|
|
if parent and is_child:
|
|
item = {'id': pt['id'], 'text': pt['title']}
|
|
if 'items' in parent:
|
|
parent['items'].append(item)
|
|
else:
|
|
parent['items'] = [item]
|
|
else:
|
|
parent = pt
|
|
result.append(parent)
|
|
|
|
vault['project_types'] = result
|
|
vault['project_types_index'] = dict([(pt['id'], pt)
|
|
for pt in project_types])
|
|
|
|
|
|
def get_project_types():
|
|
return get_vault()['project_types']
|
|
|
|
|
|
def get_release_options():
|
|
runtime_storage_inst = get_vault()['runtime_storage']
|
|
releases = (runtime_storage_inst.get_by_key('releases') or [None])[1:]
|
|
releases.append({'release_name': 'all'})
|
|
releases.reverse()
|
|
return releases
|
|
|
|
|
|
def is_project_type_valid(project_type):
|
|
if not project_type:
|
|
return False
|
|
project_type = project_type.lower()
|
|
if project_type == 'all':
|
|
return True
|
|
project_types = get_vault().get('project_types_index', [])
|
|
return project_type in project_types
|
|
|
|
|
|
def get_project_type(project_type_id):
|
|
if not is_project_type_valid(project_type_id):
|
|
return None
|
|
return get_vault()['project_types_index'][project_type_id]
|
|
|
|
|
|
def get_user_from_runtime_storage(user_id):
|
|
runtime_storage_inst = get_vault()['runtime_storage']
|
|
return utils.load_user(runtime_storage_inst, user_id)
|
|
|
|
|
|
def resolve_modules(module_ids):
|
|
module_id_index = get_vault().get('module_id_index') or {}
|
|
modules = set()
|
|
for module_id in module_ids:
|
|
if module_id in module_id_index:
|
|
modules |= set(module_id_index[module_id]['modules'])
|
|
return modules
|
|
|
|
|
|
def resolve_project_types(project_types):
|
|
modules = set()
|
|
for pt in project_types:
|
|
if is_project_type_valid(pt):
|
|
modules |= resolve_modules(
|
|
get_vault()['project_types_index'][pt]['modules'])
|
|
return modules
|