赞
踩
- # -*- encoding: utf-8 -*-
-
- import abc
- from datetime import datetime
- import sys
- import threading
- import time
-
- import cotyledon
- from cotyledon import oslo_config_glue
- from oslo_config import cfg
- from oslo_log import log
- from oslo_utils import timeutils
- import six
-
-
- LOG = log.getLogger(__name__)
-
- CLEANER_OPTS = [
- cfg.IntOpt('workers',
- default=1,
- required=True,
- help="how many cleaner workers"),
- cfg.IntOpt('resource_cleanup_interval',
- default=60,
- required=True,
- help='how many seconds to wait to clean deleted resource')
- ]
-
- '''
- 参考:
- https://blog.csdn.net/tjcwt2011/article/details/80764765
- https://www.jb51.net/article/139014.htm
- https://blog.csdn.net/qingyuanluofeng/article/details/83869163
- gnocchi 3.1源码
- '''
-
-
- # cfg.CONF.register_opts(CLEANER_OPTS, group='cleaner')
-
- # import pdb
- #
- # class ForkedPdb(pdb.Pdb):
- # def interaction(self, *args, **kwargs):
- # _stdin = sys.stdin
- # try:
- # sys.stdin = open('/dev/stdin')
- # pdb.Pdb.interaction(self, *args, **kwargs)
- # finally:
- # sys.stdin = _stdin
-
-
- # @six.add_metaclass(abc.ABCMeta)
- class BaseCleaner(cotyledon.Service):
-
- def __init__(self, workerId, conf, interval=0):
- super(BaseCleaner, self).__init__(workerId)
- self.workerId = workerId
- self.interval = interval
- self.closeEvent = threading.Event()
- self.conf = conf
-
- # main entry point
- def run(self):
- time.sleep(self.workerId)
- while not self.closeEvent.is_set():
- with timeutils.StopWatch() as timer:
- self.process()
- elapsedTime = self.interval - timer.elapsed(0)
- timeout = max(0, elapsedTime)
- self.closeEvent.wait(timeout)
- self.closeEvent.set()
-
- @abc.abstractmethod
- def process(self):
- """ Process code """
-
- def terminate(self):
- self.closeEvent.set()
- self.closeService()
-
- @staticmethod
- def closeService():
- pass
-
-
- class ResourceCleaner(BaseCleaner):
- def __init__(self, workerId, conf):
- # ForkedPdb().set_trace()
- interval = conf.cleaner.resource_cleanup_interval
- super(ResourceCleaner, self).__init__(workerId, conf, interval=interval)
-
- # TODO(), add process code
- def process(self):
- info = "clean deleted resource at {curTime}".format(
- curTime=datetime.now()
- )
- print info
-
-
- class CleanerServiceManager(cotyledon.ServiceManager):
-
- def __init__(self, conf):
- super(CleanerServiceManager, self).__init__()
- #
- oslo_config_glue.setup(self, conf)
- self.conf = conf
- self.addService()
-
- # add service which needs to be managered
- def addService(self):
- # NOTE(), args=(self.conf,) it needs to add ','
- self.resourceCleanerProcessId = self.add(
- ResourceCleaner,
- args=(self.conf,),
- workers=self.conf.cleaner.workers)
-
- def on_reload(self):
- self.reconfigure(
- self.resourceCleanerProcessId,
- workers=self.conf.cleaner.workers
- )
-
- def run(self):
- super(CleanerServiceManager, self).run()
-
-
- def getOpts():
- return [
- ('cleaner', CLEANER_OPTS),
- ]
-
-
- def prepareService(configFile=None):
- conf= cfg.ConfigOpts()
- log.register_options(conf)
- log.set_defaults(default_log_levels=conf.default_log_levels)
- sys.argv = [sys.argv[0]]
- for group, options in getOpts():
- conf.register_opts(
- group=group if group else 'DEFAULT', opts=list(options))
- conf(None,
- project='gnocchi',
- validate_default_values=False,
- default_config_files=[configFile] if configFile else None)
- log.setup(conf, 'gnocchi')
- return conf
-
-
- def cleand():
- # initialize config
- conf = prepareService()
- CleanerServiceManager(conf).run()
-
-
- def process():
- cleand()
-
-
- if __name__ == "__main__":
- process()

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。