198 lines
6.6 KiB
Python
198 lines
6.6 KiB
Python
# Copyright 2013 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.
|
|
|
|
try:
|
|
from oslo.config import cfg
|
|
except ImportError:
|
|
from oslo_config import cfg
|
|
try:
|
|
from oslo.serialization import jsonutils
|
|
except ImportError:
|
|
from oslo_serialization import jsonutils
|
|
from pecan import abort
|
|
from pecan import expose
|
|
from pecan import request
|
|
from pecan import rest
|
|
from sqlalchemy import func
|
|
from sqlalchemy.orm import joinedload
|
|
|
|
from fuel_plugin import consts
|
|
from fuel_plugin.ostf_adapter import mixins
|
|
from fuel_plugin.ostf_adapter.storage import models
|
|
|
|
|
|
class BaseRestController(rest.RestController):
|
|
def _handle_get(self, method, remainder, request=None):
|
|
if len(remainder):
|
|
method_name = remainder[0]
|
|
if method.upper() in self._custom_actions.get(method_name, []):
|
|
controller = self._find_controller(
|
|
'get_%s' % method_name,
|
|
method_name
|
|
)
|
|
if controller:
|
|
return controller, remainder[1:]
|
|
return super(BaseRestController, self)._handle_get(method, remainder,
|
|
request)
|
|
|
|
|
|
class TestsetsController(BaseRestController):
|
|
|
|
@expose('json')
|
|
def get(self, cluster):
|
|
mixins.discovery_check(request.session, cluster, request.token)
|
|
|
|
needed_testsets = request.session\
|
|
.query(models.ClusterTestingPattern.test_set_id)\
|
|
.filter_by(cluster_id=cluster)
|
|
|
|
test_sets = request.session.query(models.TestSet)\
|
|
.filter(models.TestSet.id.in_(needed_testsets))\
|
|
.order_by(models.TestSet.test_runs_ordering_priority)\
|
|
.all()
|
|
|
|
if test_sets:
|
|
return [item.frontend for item in test_sets]
|
|
return {}
|
|
|
|
|
|
class TestsController(BaseRestController):
|
|
|
|
@expose('json')
|
|
def get(self, cluster):
|
|
mixins.discovery_check(request.session, cluster, request.token)
|
|
needed_tests_list = request.session\
|
|
.query(models.ClusterTestingPattern.tests)\
|
|
.filter_by(cluster_id=cluster)
|
|
|
|
result = []
|
|
for tests in needed_tests_list:
|
|
tests_to_return = request.session.query(models.Test)\
|
|
.filter(models.Test.name.in_(tests[0]))\
|
|
.all()
|
|
|
|
result.extend(tests_to_return)
|
|
|
|
result.sort(key=lambda test: test.name)
|
|
|
|
if result:
|
|
return [item.frontend for item in result]
|
|
|
|
return {}
|
|
|
|
|
|
class TestrunsController(BaseRestController):
|
|
|
|
_custom_actions = {
|
|
'last': ['GET'],
|
|
}
|
|
|
|
@expose('json')
|
|
def get_all(self):
|
|
test_runs = request.session.query(models.TestRun).all()
|
|
|
|
return [item.frontend for item in test_runs]
|
|
|
|
@expose('json')
|
|
def get_one(self, test_run_id):
|
|
test_run = request.session.query(models.TestRun)\
|
|
.filter_by(id=test_run_id).first()
|
|
if test_run and isinstance(test_run, models.TestRun):
|
|
return test_run.frontend
|
|
return {}
|
|
|
|
@expose('json')
|
|
def get_last(self, cluster_id):
|
|
test_run_ids = request.session.query(func.max(models.TestRun.id)) \
|
|
.group_by(models.TestRun.test_set_id)\
|
|
.filter_by(cluster_id=cluster_id)
|
|
|
|
test_runs = request.session.query(models.TestRun)\
|
|
.options(joinedload('tests'))\
|
|
.filter(models.TestRun.id.in_(test_run_ids))
|
|
|
|
return [item.frontend for item in test_runs]
|
|
|
|
@expose('json')
|
|
def post(self):
|
|
test_runs = jsonutils.loads(request.body)
|
|
if 'objects' in test_runs:
|
|
test_runs = test_runs['objects']
|
|
|
|
# Discover tests for all clusters in request
|
|
clusters_ids = []
|
|
nedded_testsets = set()
|
|
for test_run in test_runs:
|
|
cluster_id = test_run['metadata']['cluster_id']
|
|
if cluster_id not in clusters_ids:
|
|
clusters_ids.append(cluster_id)
|
|
mixins.discovery_check(request.session,
|
|
cluster_id,
|
|
request.token)
|
|
nedded_testsets.add(test_run['testset'])
|
|
# Validate testsets from request
|
|
test_sets = set([testset.id for testset in request.
|
|
session.query(models.TestSet).all()])
|
|
if nedded_testsets - test_sets:
|
|
abort(400)
|
|
|
|
res = []
|
|
for test_run in test_runs:
|
|
test_set = test_run['testset']
|
|
metadata = test_run['metadata']
|
|
tests = test_run.get('tests', [])
|
|
|
|
test_set = models.TestSet.get_test_set(
|
|
request.session,
|
|
test_set
|
|
)
|
|
|
|
test_run = models.TestRun.start(
|
|
request.session,
|
|
test_set,
|
|
metadata,
|
|
tests,
|
|
cfg.CONF.adapter.dbpath,
|
|
token=request.token
|
|
)
|
|
|
|
res.append(test_run)
|
|
|
|
return res
|
|
|
|
@expose('json')
|
|
def put(self):
|
|
test_runs = jsonutils.loads(request.body)
|
|
if 'objects' in test_runs:
|
|
test_runs = test_runs['objects']
|
|
|
|
data = []
|
|
with request.session.begin(subtransactions=True):
|
|
for test_run in test_runs:
|
|
status = test_run.get('status')
|
|
tests = test_run.get('tests', [])
|
|
ostf_os_access_creds = test_run.get('ostf_os_access_creds')
|
|
|
|
test_run = models.TestRun.get_test_run(request.session,
|
|
test_run['id'])
|
|
if status == consts.TESTRUN_STATUSES.stopped:
|
|
data.append(test_run.stop(request.session))
|
|
elif status == consts.TESTRUN_STATUSES.restarted:
|
|
data.append(test_run.restart(request.session,
|
|
cfg.CONF.adapter.dbpath,
|
|
ostf_os_access_creds,
|
|
tests=tests,
|
|
token=request.token))
|
|
return data
|