Adding the TestManager code and the timerthread
Change-Id: I0cba5db5b3875bf450bbd7ffe85d7c90ff2966ab
This commit is contained in:
145
cloudpulse/TestManager/TestManager.py
Normal file
145
cloudpulse/TestManager/TestManager.py
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
# 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.
|
||||||
|
|
||||||
|
from cloudpulse.common import context as cloudpulse_context
|
||||||
|
from cloudpulse.common.plugin import discover
|
||||||
|
from cloudpulse.db.sqlalchemy import api as dbapi
|
||||||
|
from cloudpulse import objects
|
||||||
|
from cloudpulse.openstack.common import service as os_service
|
||||||
|
from cloudpulse.scenario import base
|
||||||
|
import logging
|
||||||
|
from oslo_config import cfg
|
||||||
|
from oslo_utils import importutils
|
||||||
|
import textwrap
|
||||||
|
import threading
|
||||||
|
|
||||||
|
cfg.CONF.import_opt('auth_uri', 'keystonemiddleware.auth_token',
|
||||||
|
group='keystone_authtoken')
|
||||||
|
|
||||||
|
|
||||||
|
CONF = cfg.CONF
|
||||||
|
|
||||||
|
dblock = threading.RLock()
|
||||||
|
|
||||||
|
|
||||||
|
def acquireLock():
|
||||||
|
dblock.acquire()
|
||||||
|
|
||||||
|
|
||||||
|
def releaseLock():
|
||||||
|
dblock.release()
|
||||||
|
|
||||||
|
|
||||||
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class Periodic_Task(object):
|
||||||
|
def __init__(self, task):
|
||||||
|
self.task = task
|
||||||
|
|
||||||
|
def create_task_entry(self, context):
|
||||||
|
test = {}
|
||||||
|
test['state'] = 'created'
|
||||||
|
test['testtype'] = 'periodic'
|
||||||
|
test['name'] = self.task
|
||||||
|
new_test = objects.Cpulse(context, **test)
|
||||||
|
acquireLock()
|
||||||
|
new_test.create()
|
||||||
|
releaseLock()
|
||||||
|
return new_test
|
||||||
|
|
||||||
|
def run_task(self):
|
||||||
|
importutils.import_module('keystonemiddleware.auth_token')
|
||||||
|
username = cfg.CONF.keystone_authtoken.username
|
||||||
|
tenant_name = cfg.CONF.keystone_authtoken.project_name
|
||||||
|
# password = cfg.CONF.keystone_authtoken.password
|
||||||
|
auth_url = cfg.CONF.keystone_authtoken.auth_uri
|
||||||
|
|
||||||
|
context = cloudpulse_context.make_context(
|
||||||
|
auth_url=auth_url,
|
||||||
|
user=username,
|
||||||
|
project=tenant_name)
|
||||||
|
|
||||||
|
new_test = self.create_task_entry(context)
|
||||||
|
test_manager.run(test=new_test)
|
||||||
|
|
||||||
|
|
||||||
|
class Periodic_TestManager(os_service.Service):
|
||||||
|
def __init__(self):
|
||||||
|
super(Periodic_TestManager, self).__init__()
|
||||||
|
|
||||||
|
def start(self):
|
||||||
|
tasks = CONF.periodic_tests
|
||||||
|
for key in tasks.keys():
|
||||||
|
interval, task_name = tasks[key], key
|
||||||
|
if int(interval) > 0:
|
||||||
|
period_task = Periodic_Task(task_name)
|
||||||
|
self.tg.add_timer(interval, self.interval_task,
|
||||||
|
task=period_task)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def interval_task(task):
|
||||||
|
task.run_task()
|
||||||
|
|
||||||
|
|
||||||
|
class TestManager(object):
|
||||||
|
def __init__(self):
|
||||||
|
self.command_ref = {}
|
||||||
|
discover.import_modules_from_package("cloudpulse.scenario.plugins")
|
||||||
|
for scenario_group in discover.itersubclasses(base.Scenario):
|
||||||
|
for method in dir(scenario_group):
|
||||||
|
scenario = scenario_group()
|
||||||
|
callback = getattr(scenario, method)
|
||||||
|
self.command_ref[method] = callback
|
||||||
|
|
||||||
|
def run(self, **kwargs):
|
||||||
|
Test = kwargs['test']
|
||||||
|
func = self.command_ref[Test['name']]
|
||||||
|
Test['state'] = 'running'
|
||||||
|
acquireLock()
|
||||||
|
self.update_test(Test['uuid'], Test)
|
||||||
|
releaseLock()
|
||||||
|
result = func()
|
||||||
|
if result[0] == 200:
|
||||||
|
Test['state'] = 'finished'
|
||||||
|
Test['result'] = 'success'
|
||||||
|
else:
|
||||||
|
Test['state'] = 'failed'
|
||||||
|
Test['result'] = textwrap.fill(str(result[1]), 40)
|
||||||
|
acquireLock()
|
||||||
|
self.update_test(Test['uuid'], Test)
|
||||||
|
releaseLock()
|
||||||
|
|
||||||
|
def run_periodic(self, **kwargs):
|
||||||
|
Test = kwargs['test']
|
||||||
|
func = self.command_ref[Test['name']]
|
||||||
|
result = func()
|
||||||
|
if result[0] == 200:
|
||||||
|
Test['result'] = 'success'
|
||||||
|
else:
|
||||||
|
Test['state'] = 'failed'
|
||||||
|
Test['result'] = textwrap.fill(str(result[1]), 40)
|
||||||
|
acquireLock()
|
||||||
|
self.update_test(Test['uuid'], Test)
|
||||||
|
releaseLock()
|
||||||
|
|
||||||
|
def update_test(self, tuuid, patch):
|
||||||
|
npatch = {}
|
||||||
|
npatch['state'] = patch['state']
|
||||||
|
npatch['id'] = patch['id']
|
||||||
|
npatch['name'] = patch['name']
|
||||||
|
npatch['result'] = patch['result']
|
||||||
|
conn = dbapi.get_backend()
|
||||||
|
conn.update_test(tuuid, npatch)
|
||||||
|
return npatch
|
||||||
|
|
||||||
|
test_manager = TestManager()
|
0
cloudpulse/TestManager/__init__.py
Normal file
0
cloudpulse/TestManager/__init__.py
Normal file
@@ -16,6 +16,10 @@ import pecan
|
|||||||
from cloudpulse.api import auth
|
from cloudpulse.api import auth
|
||||||
from cloudpulse.api import config as api_config
|
from cloudpulse.api import config as api_config
|
||||||
from cloudpulse.api import middleware
|
from cloudpulse.api import middleware
|
||||||
|
from cloudpulse.common.timerthread import cpulseTimer
|
||||||
|
from cloudpulse.common.timerthread import timerfunc
|
||||||
|
from cloudpulse.TestManager.TestManager import Periodic_TestManager
|
||||||
|
|
||||||
|
|
||||||
# Register options for the service
|
# Register options for the service
|
||||||
bind_opts = [
|
bind_opts = [
|
||||||
@@ -67,4 +71,7 @@ def setup_app(config=None):
|
|||||||
|
|
||||||
# TBD Add test hook later
|
# TBD Add test hook later
|
||||||
# cpulseTimer(10, timerfunc, "Cpulse")
|
# cpulseTimer(10, timerfunc, "Cpulse")
|
||||||
|
cpulseTimer(30, timerfunc, "Cpulse")
|
||||||
|
tm = Periodic_TestManager()
|
||||||
|
tm.start()
|
||||||
return auth.install(app, CONF, config.app.acl_public_routes)
|
return auth.install(app, CONF, config.app.acl_public_routes)
|
||||||
|
80
cloudpulse/common/timerthread.py
Executable file
80
cloudpulse/common/timerthread.py
Executable file
@@ -0,0 +1,80 @@
|
|||||||
|
# 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.
|
||||||
|
|
||||||
|
from cloudpulse import objects
|
||||||
|
from cloudpulse.openstack.common._i18n import _LI
|
||||||
|
from cloudpulse.openstack.common import log as logging
|
||||||
|
from cloudpulse.TestManager import TestManager
|
||||||
|
import sys
|
||||||
|
import threading
|
||||||
|
from threading import Timer
|
||||||
|
|
||||||
|
LOG = logging.getLogger(__name__)
|
||||||
|
dblock = threading.RLock()
|
||||||
|
|
||||||
|
test_manager = TestManager.TestManager()
|
||||||
|
|
||||||
|
|
||||||
|
def acquireLock():
|
||||||
|
dblock.acquire()
|
||||||
|
|
||||||
|
|
||||||
|
def releaseLock():
|
||||||
|
dblock.release()
|
||||||
|
|
||||||
|
|
||||||
|
class cpulseTimer(object):
|
||||||
|
def __init__(self, interval, function, *args, **kwargs):
|
||||||
|
self._timer = None
|
||||||
|
self.interval = interval
|
||||||
|
self.function = function
|
||||||
|
self.args = args
|
||||||
|
self.kwargs = kwargs
|
||||||
|
self.is_running = False
|
||||||
|
self.start()
|
||||||
|
|
||||||
|
def _run(self):
|
||||||
|
self.is_running = False
|
||||||
|
self.start()
|
||||||
|
self.function(self, *self.args, **self.kwargs)
|
||||||
|
|
||||||
|
def start(self):
|
||||||
|
if not self.is_running:
|
||||||
|
self._timer = Timer(self.interval, self._run)
|
||||||
|
self._timer.start()
|
||||||
|
self.is_running = True
|
||||||
|
|
||||||
|
|
||||||
|
def test_run(**kwargs):
|
||||||
|
LOG.debug(_LI('Running Openstack test%s') % kwargs['test']['name'])
|
||||||
|
test_manager.run(**kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
testthreads = []
|
||||||
|
|
||||||
|
|
||||||
|
def timerfunc(*args, **kwargs):
|
||||||
|
context = None
|
||||||
|
acquireLock()
|
||||||
|
tests = objects.Cpulse.list(context)
|
||||||
|
releaseLock()
|
||||||
|
for test in tests:
|
||||||
|
LOG.debug(_LI('Dumping REPFUNCTION %s') % test['uuid'])
|
||||||
|
if test['state'] == 'created' and test['testtype'] == 'manual':
|
||||||
|
methodtocall = getattr(sys.modules[__name__], 'test_run')
|
||||||
|
# methodtocall()
|
||||||
|
testthr = threading.Thread(name=test['name'],
|
||||||
|
target=methodtocall,
|
||||||
|
kwargs={'test': test})
|
||||||
|
testthreads.append(testthr)
|
||||||
|
testthr.start()
|
||||||
|
LOG.debug(_LI('REPFUNCTION, exec test %s') % test['name'])
|
@@ -133,9 +133,6 @@ class Connection(api.Connection):
|
|||||||
if not values.get('uuid'):
|
if not values.get('uuid'):
|
||||||
values['uuid'] = utils.generate_uuid()
|
values['uuid'] = utils.generate_uuid()
|
||||||
|
|
||||||
if not values.get('id'):
|
|
||||||
values['id'] = 777
|
|
||||||
|
|
||||||
cpulse = models.cpulse()
|
cpulse = models.cpulse()
|
||||||
cpulse.update(values)
|
cpulse.update(values)
|
||||||
# TODO(VINOD)
|
# TODO(VINOD)
|
||||||
|
Reference in New Issue
Block a user