octavia/octavia/cmd/house_keeping.py

137 lines
4.6 KiB
Python

# Copyright 2015 Hewlett-Packard Development Company, L.P.
#
# 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 datetime
import signal
import sys
import threading
import time
from oslo_config import cfg
from oslo_log import log as logging
from oslo_reports import guru_meditation_report as gmr
from octavia.common import service
from octavia.controller.housekeeping import house_keeping
from octavia import version
LOG = logging.getLogger(__name__)
CONF = cfg.CONF
spare_amp_thread_event = threading.Event()
db_cleanup_thread_event = threading.Event()
cert_rotate_thread_event = threading.Event()
def spare_amphora_check():
"""Initiates spare amp check with respect to configured interval."""
# Read the interval from CONF
interval = CONF.house_keeping.spare_check_interval
LOG.info("Spare check interval is set to %d sec", interval)
spare_amp = house_keeping.SpareAmphora()
while not spare_amp_thread_event.is_set():
LOG.debug("Initiating spare amphora check...")
try:
spare_amp.spare_check()
except Exception as e:
LOG.debug('spare_amphora caught the following exception and '
'is restarting: {}'.format(e))
spare_amp_thread_event.wait(interval)
def db_cleanup():
"""Perform db cleanup for old resources."""
# Read the interval from CONF
interval = CONF.house_keeping.cleanup_interval
LOG.info("DB cleanup interval is set to %d sec", interval)
LOG.info('Amphora expiry age is %s seconds',
CONF.house_keeping.amphora_expiry_age)
LOG.info('Load balancer expiry age is %s seconds',
CONF.house_keeping.load_balancer_expiry_age)
db_cleanup = house_keeping.DatabaseCleanup()
while not db_cleanup_thread_event.is_set():
LOG.debug("Initiating the cleanup of old resources...")
try:
db_cleanup.delete_old_amphorae()
db_cleanup.cleanup_load_balancers()
except Exception as e:
LOG.debug('db_cleanup caught the following exception and '
'is restarting: {}'.format(e))
db_cleanup_thread_event.wait(interval)
def cert_rotation():
"""Perform certificate rotation."""
interval = CONF.house_keeping.cert_interval
LOG.info(
"Expiring certificate check interval is set to %d sec", interval)
cert_rotate = house_keeping.CertRotation()
while not cert_rotate_thread_event.is_set():
LOG.debug("Initiating certification rotation ...")
try:
cert_rotate.rotate()
except Exception as e:
LOG.debug('cert_rotation caught the following exception and '
'is restarting: {}'.format(e))
cert_rotate_thread_event.wait(interval)
def _mutate_config(*args, **kwargs):
LOG.info("Housekeeping recieved HUP signal, mutating config.")
CONF.mutate_config_files()
def main():
service.prepare_service(sys.argv)
gmr.TextGuruMeditation.setup_autorun(version)
timestamp = str(datetime.datetime.utcnow())
LOG.info("Starting house keeping at %s", timestamp)
# Thread to perform spare amphora check
spare_amp_thread = threading.Thread(target=spare_amphora_check)
spare_amp_thread.daemon = True
spare_amp_thread.start()
# Thread to perform db cleanup
db_cleanup_thread = threading.Thread(target=db_cleanup)
db_cleanup_thread.daemon = True
db_cleanup_thread.start()
# Thread to perform certificate rotation
cert_rotate_thread = threading.Thread(target=cert_rotation)
cert_rotate_thread.daemon = True
cert_rotate_thread.start()
signal.signal(signal.SIGHUP, _mutate_config)
# Try-Exception block should be at the end to gracefully exit threads
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
LOG.info("Attempting to gracefully terminate House-Keeping")
spare_amp_thread_event.set()
db_cleanup_thread_event.set()
cert_rotate_thread_event.set()
spare_amp_thread.join()
db_cleanup_thread.join()
cert_rotate_thread.join()
LOG.info("House-Keeping process terminated")