d0f243e0ae
Multi-patch set for easier chunks. This one addresses the scheduler cinder directory. There have been quite a few instances found where the i18n guidelines are not being followed. I believe this has helped lead to some of the confusion around how to correctly do this. Other developers see this code and assume it is an example of the correct usage. This patch attempts to clean up most of those violations in the existing codebase to hopefully help avoid some of that confusion in reviews. Some issues address: * Correct log translation markers for different log levels * Passing format values as arguments to call, not preformatting * Not forcing translation via six.text_type and others Guidelines can be found here: http://docs.openstack.org/developer/oslo.i18n/guidelines.html Hacking checks will not be able to identify all violations of the guidelines, but it could be useful for catching obvious one such as LOG.info("No markers!"). Change-Id: I0473ac402bc7b4a644c9b700df0fa2b88d82d705 Partial-bug: 1433216
106 lines
3.4 KiB
Python
106 lines
3.4 KiB
Python
# Copyright (c) 2011 OpenStack Foundation
|
|
# All Rights Reserved.
|
|
#
|
|
# 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.
|
|
|
|
"""
|
|
SchedulerOptions monitors a local .json file for changes and loads
|
|
it if needed. This file is converted to a data structure and passed
|
|
into the filtering and weighing functions which can use it for
|
|
dynamic configuration.
|
|
"""
|
|
|
|
import datetime
|
|
import json
|
|
import os
|
|
|
|
from oslo_config import cfg
|
|
from oslo_log import log as logging
|
|
from oslo_utils import timeutils
|
|
|
|
from cinder.i18n import _LE
|
|
|
|
|
|
scheduler_json_config_location_opt = cfg.StrOpt(
|
|
'scheduler_json_config_location',
|
|
default='',
|
|
help='Absolute path to scheduler configuration JSON file.')
|
|
|
|
|
|
CONF = cfg.CONF
|
|
CONF.register_opt(scheduler_json_config_location_opt)
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
|
|
class SchedulerOptions(object):
|
|
"""SchedulerOptions monitors a local .json file for changes.
|
|
|
|
The file is reloaded if needed and converted to a data structure and
|
|
passed into the filtering and weighing functions which can use it
|
|
for dynamic configuration.
|
|
"""
|
|
|
|
def __init__(self):
|
|
super(SchedulerOptions, self).__init__()
|
|
self.data = {}
|
|
self.last_modified = None
|
|
self.last_checked = None
|
|
|
|
def _get_file_handle(self, filename):
|
|
"""Get file handle. Broken out for testing."""
|
|
return open(filename)
|
|
|
|
def _get_file_timestamp(self, filename):
|
|
"""Get the last modified datetime. Broken out for testing."""
|
|
try:
|
|
return os.path.getmtime(filename)
|
|
except os.error:
|
|
LOG.exception(_LE("Could not stat scheduler options file "
|
|
"%(filename)s."),
|
|
{'filename': filename})
|
|
raise
|
|
|
|
def _load_file(self, handle):
|
|
"""Decode the JSON file. Broken out for testing."""
|
|
try:
|
|
return json.load(handle)
|
|
except ValueError:
|
|
LOG.exception(_LE("Could not decode scheduler options."))
|
|
return {}
|
|
|
|
def _get_time_now(self):
|
|
"""Get current UTC. Broken out for testing."""
|
|
return timeutils.utcnow()
|
|
|
|
def get_configuration(self, filename=None):
|
|
"""Check the json file for changes and load it if needed."""
|
|
if not filename:
|
|
filename = CONF.scheduler_json_config_location
|
|
if not filename:
|
|
return self.data
|
|
if self.last_checked:
|
|
now = self._get_time_now()
|
|
if now - self.last_checked < datetime.timedelta(minutes=5):
|
|
return self.data
|
|
|
|
last_modified = self._get_file_timestamp(filename)
|
|
if (not last_modified or not self.last_modified or
|
|
last_modified > self.last_modified):
|
|
self.data = self._load_file(self._get_file_handle(filename))
|
|
self.last_modified = last_modified
|
|
if not self.data:
|
|
self.data = {}
|
|
|
|
return self.data
|