functional tests: don't require devstack

Now py27 bootstrap mysql and gnocchi to run tests against them.
This commit is contained in:
Mehdi Abaakouk 2015-08-31 13:37:29 +02:00
parent 15c6f165c9
commit 8d19fc953f
7 changed files with 97 additions and 65 deletions

View File

@ -2,6 +2,6 @@
test_command=OS_STDOUT_CAPTURE=${OS_STDOUT_CAPTURE:-1} \
OS_STDERR_CAPTURE=${OS_STDERR_CAPTURE:-1} \
OS_TEST_TIMEOUT=${OS_TEST_TIMEOUT:-60} \
${PYTHON:-python} -m subunit.run discover -t ./ ${OS_TEST_PATH:-./gnocchiclient/tests/unit} $LISTOPT $IDOPTION
${PYTHON:-python} -m subunit.run discover -t ./ ${OS_TEST_PATH:-./gnocchiclient/tests} $LISTOPT $IDOPTION
test_id_option=--load-list $IDFILE
test_list_option=--list

View File

@ -11,10 +11,36 @@
# under the License.
import os
import uuid
from tempest_lib.cli import base
class GnocchiClient(object):
"""Gnocchi Client for tempest-lib
This client doesn't use any authentification system
"""
def __init__(self):
self.cli_dir = os.environ.get('GNOCCHI_CLIENT_EXEC_DIR')
self.endpoint = os.environ.get('GNOCCHI_ENDPOINT')
self.user_id = uuid.uuid4()
self.project_id = uuid.uuid4()
def gnocchi(self, action, flags='', params='',
fail_ok=False, merge_stderr=False):
creds = ("--os-auth-plugin gnocchi-noauth "
"--user-id %s --project-id %s "
"--endpoint %s") % (self.user_id,
self.project_id,
self.endpoint)
flags = creds + ' ' + flags
return base.execute("gnocchi", action, flags, params, fail_ok,
merge_stderr, self.cli_dir)
class ClientTestBase(base.ClientTestBase):
"""Base class for gnocchiclient tests.
@ -23,13 +49,7 @@ class ClientTestBase(base.ClientTestBase):
"""
def _get_clients(self):
cli_dir = os.environ.get('OS_GNOCCHI_CLIENT_EXEC_DIR')
return base.CLIClient(
username=os.environ.get('OS_USERNAME'),
password=os.environ.get('OS_PASSWORD'),
tenant_name=os.environ.get('OS_TENANT_NAME'),
uri=os.environ.get('OS_AUTH_URL'),
cli_dir=cli_dir)
return GnocchiClient()
def gnocchi(self, *args, **kwargs):
return self.clients.cmd_with_auth('gnocchi', *args, **kwargs)
return self.clients.gnocchi(*args, **kwargs)

View File

@ -1,40 +0,0 @@
# 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 re
import uuid
from tempest_lib.cli import base as tempest_lib_cli_base
from gnocchiclient.tests.functional import base
class ResourceClientTest(base.ClientTestBase):
def test_no_auth(self):
result = self.gnocchi('resource', params="list", flags="--debug",
merge_stderr=True)
endpoint = re.findall("(http://[^/]*)/v1/resource/generic",
result, re.M)[0]
result = tempest_lib_cli_base.execute(
'gnocchi', 'resource', params="list",
flags=("--os-auth-plugin gnocchi-noauth "
"--user-id %s "
"--project-id %s "
"--endpoint %s"
) % (str(uuid.uuid4()),
str(uuid.uuid4()),
endpoint),
fail_ok=True, merge_stderr=True,
cli_dir=self.clients.cli_dir)
self.assertFirstLineStartsWith(result.split('\n'),
"Unauthorized (HTTP 401)")

View File

@ -161,7 +161,7 @@ class ResourceManager(base.Manager):
request = request or {}
qs = _get_pagination_options(details, False, limit, marker, sorts)
url = self.client._build_url(
"/search/resource/%s?%s" % (resource_type, qs))
"search/resource/%s?%s" % (resource_type, qs))
return self.client.api.post(
url, headers={'Content-Type': "application/json"},
data=jsonutils.dumps(request)).json()

58
setup-tests.sh Executable file
View File

@ -0,0 +1,58 @@
#!/bin/bash
set -e -x
wait_for_line () {
while read line
do
echo "$line" | grep -q "$1" && break
done < "$2"
# Read the fifo for ever otherwise process would block
cat "$2" &
# cat "$2" >/dev/null &
}
clean_exit (){
local error_code="$?"
kill $(jobs -p)
rm -rf "$@"
return $error_code
}
GNOCCHI_DATA=`mktemp -d /tmp/gnocchi-data-XXXXX`
MYSQL_DATA=`mktemp -d /tmp/gnocchi-mysql-XXXXX`
trap "clean_exit \"$GNOCCHI_DATA\" \"$MYSQL_DATA\"" EXIT
mkfifo ${MYSQL_DATA}/out
PATH=$PATH:/usr/libexec
mysqld --no-defaults --datadir=${MYSQL_DATA} --pid-file=${MYSQL_DATA}/mysql.pid --socket=${MYSQL_DATA}/mysql.socket --skip-networking --skip-grant-tables &> ${MYSQL_DATA}/out &
# Wait for MySQL to start listening to connections
wait_for_line "mysqld: ready for connections." ${MYSQL_DATA}/out
export GNOCCHI_TEST_INDEXER_URL="mysql+pymysql://root@localhost/test?unix_socket=${MYSQL_DATA}/mysql.socket&charset=utf8"
mysql --no-defaults -S ${MYSQL_DATA}/mysql.socket -e 'CREATE DATABASE test;'
mkfifo ${GNOCCHI_DATA}/out
echo '{"default": ""}' > ${GNOCCHI_DATA}/policy.json
cat > ${GNOCCHI_DATA}/gnocchi.conf <<EOF
[oslo_policy]
policy_file = ${GNOCCHI_DATA}/policy.json
[api]
middlewares =
[storage]
file_basepath = ${GNOCCHI_DATA}
driver = file
coordination_url = file://${GNOCCHI_DATA}
[indexer]
url = mysql+pymysql://root@localhost/test?unix_socket=${MYSQL_DATA}/mysql.socket&charset=utf8
EOF
gnocchi-dbsync --config-file ${GNOCCHI_DATA}/gnocchi.conf
gnocchi-metricd --config-file ${GNOCCHI_DATA}/gnocchi.conf &>/dev/null &
gnocchi-api --config-file ${GNOCCHI_DATA}/gnocchi.conf &> ${GNOCCHI_DATA}/out &
# Wait for Gnocchi to start
wait_for_line "Running on http://0.0.0.0:8041/" ${GNOCCHI_DATA}/out
export GNOCCHI_ENDPOINT=http://localhost:8041/
create_archive_policy() { curl -X POST -H "X-USER-ID: $(uuidgen)" -H "X-PROJECT-ID: $(uuidgen)" -H "Content-Type: application/json" -d "$1" ${GNOCCHI_ENDPOINT}v1/archive_policy ; }
create_archive_policy '{"name":"high","definition":[{"granularity": "1s","points": 86400},{"granularity": "1m","points": 43200},{"granularity": "1h","points": 8760}]}'
$*

View File

@ -14,3 +14,6 @@ tempest-lib>=0.6.1
testrepository>=0.0.18
testscenarios>=0.4
testtools>=1.4.0
http://tarballs.openstack.org/gnocchi/gnocchi-master.tar.gz#egg=gnocchi
# FIXME(sileht): should be in gnocchi ?
keystonemiddleware

21
tox.ini
View File

@ -5,11 +5,14 @@ skipsdist = True
[testenv]
usedevelop = True
install_command = pip install -U {opts} {packages}
install_command = pip install -U --allow-external gnocchi --allow-insecure gnocchi {opts} {packages}
setenv =
VIRTUAL_ENV={envdir}
deps = -r{toxinidir}/test-requirements.txt
commands = python setup.py test --slowest --testr-args='{posargs}'
GNOCCHI_CLIENT_EXEC_DIR={envdir}/bin
passenv = GNOCCHI_*
deps = -r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt
commands = {toxinidir}/setup-tests.sh python setup.py test --slowest --testr-args='{posargs}'
[testenv:pep8]
commands = flake8
@ -26,18 +29,6 @@ commands = python setup.py build_sphinx
[testenv:debug]
commands = oslo_debug_helper {posargs}
[testenv:py27-functional]
setenv =
OS_TEST_PATH=./gnocchiclient/tests/functional
OS_GNOCCHI_CLIENT_EXEC_DIR={envdir}/bin
passenv = OS_*
[testenv:py34-functional]
setenv =
OS_TEST_PATH=./gnocchiclient/tests/functional
OS_GNOCCHI_CLIENT_EXEC_DIR={envdir}/bin
passenv = OS_*
[flake8]
# E123, E125 skipped as they are invalid PEP-8.