7216f73185
Add 'pickled' suffix instead of file extensions to not to mislead users. Files stored in cache as pickled objects, so they can be open as regular files. Change-Id: Ia6418696cf81de2bb1add175f27b6465fc91f6b9 Closes-Bug: #1520515
86 lines
2.6 KiB
Python
86 lines
2.6 KiB
Python
# Copyright (c) 2014 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 functools
|
|
import os
|
|
|
|
from oslo_log import log as logging
|
|
|
|
from muranodashboard.common import utils
|
|
from muranodashboard.environments import consts
|
|
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
OBJS_PATH = os.path.join(consts.CACHE_DIR, 'apps')
|
|
|
|
if not os.path.exists(OBJS_PATH):
|
|
os.makedirs(OBJS_PATH)
|
|
LOG.info('Creating apps cache directory located at {dir}'.
|
|
format(dir=OBJS_PATH))
|
|
|
|
LOG.info('Using apps cache directory located at {dir}'.
|
|
format(dir=OBJS_PATH))
|
|
|
|
|
|
def _get_entry_path(app_id):
|
|
head, tail = app_id[:2], app_id[2:]
|
|
head = os.path.join(OBJS_PATH, head)
|
|
if not os.path.exists(head):
|
|
os.mkdir(head)
|
|
tail = os.path.join(head, tail)
|
|
if not os.path.exists(tail):
|
|
os.mkdir(tail)
|
|
return tail
|
|
|
|
|
|
def _load_from_file(file_name):
|
|
if os.path.isfile(file_name) and os.path.getsize(file_name) > 0:
|
|
with open(file_name, 'rb') as f:
|
|
p = utils.CustomUnpickler(f)
|
|
return p.load()
|
|
return None
|
|
|
|
|
|
def _save_to_file(file_name, content):
|
|
dir_path = os.path.dirname(file_name)
|
|
if not os.path.exists(dir_path):
|
|
os.makedirs(dir_path)
|
|
with open(file_name, 'wb') as f:
|
|
p = utils.CustomPickler(f)
|
|
p.dump(content)
|
|
|
|
|
|
def with_cache(*dst_parts):
|
|
def _decorator(func):
|
|
@functools.wraps(func)
|
|
def __inner(request, app_id):
|
|
path = os.path.join(_get_entry_path(app_id), *dst_parts)
|
|
# Remove file extensions since file content is pickled and
|
|
# could not be open as usual files
|
|
path = os.path.splitext(path)[0] + '-pickled'
|
|
content = _load_from_file(path)
|
|
if content is None:
|
|
content = func(request, app_id)
|
|
if content:
|
|
LOG.debug('Caching value at {0}.'.format(path))
|
|
_save_to_file(path, content)
|
|
else:
|
|
LOG.debug('Using cached value from {0}.'.format(path))
|
|
|
|
return content
|
|
|
|
return __inner
|
|
|
|
return _decorator
|