Merge "Move functional test to dsvm and remove pifpaf"
This commit is contained in:
commit
11c37391ea
@ -1,3 +1,3 @@
|
|||||||
[DEFAULT]
|
[DEFAULT]
|
||||||
test_path=./aodhclient/tests
|
test_path=./aodhclient/tests/unit
|
||||||
top_dir=./
|
top_dir=./
|
||||||
|
33
.zuul.yaml
33
.zuul.yaml
@ -1,5 +1,38 @@
|
|||||||
|
- job:
|
||||||
|
name: aodhclient-dsvm-functional
|
||||||
|
parent: devstack-tox-functional
|
||||||
|
description: |
|
||||||
|
Devstack-based functional tests for aodhclient.
|
||||||
|
required-projects:
|
||||||
|
- openstack/python-aodhclient
|
||||||
|
- openstack/aodh
|
||||||
|
# We neeed ceilometer's devstack plugin to install gnocchi
|
||||||
|
- openstack/ceilometer
|
||||||
|
- gnocchixyz/gnocchi
|
||||||
|
timeout: 4200
|
||||||
|
vars:
|
||||||
|
devstack_localrc:
|
||||||
|
USE_PYTHON3: True
|
||||||
|
GLOBAL_VENV: False
|
||||||
|
CEILOMETER_BACKENDS: "gnocchi"
|
||||||
|
devstack_plugins:
|
||||||
|
aodh: https://opendev.org/openstack/aodh
|
||||||
|
ceilometer: https://opendev.org/openstack/ceilometer
|
||||||
|
|
||||||
- project:
|
- project:
|
||||||
templates:
|
templates:
|
||||||
- openstack-python3-jobs
|
- openstack-python3-jobs
|
||||||
- publish-openstack-docs-pti
|
- publish-openstack-docs-pti
|
||||||
- openstackclient-plugin-jobs
|
- openstackclient-plugin-jobs
|
||||||
|
check:
|
||||||
|
jobs:
|
||||||
|
- aodhclient-dsvm-functional:
|
||||||
|
irrelevant-files: &ac-irrelevant-files
|
||||||
|
- ^(test-|)requirements.txt$
|
||||||
|
- ^setup.cfg$
|
||||||
|
- ^.*\.rst$
|
||||||
|
- ^releasenotes/.*$
|
||||||
|
gate:
|
||||||
|
jobs:
|
||||||
|
- aodhclient-dsvm-functional:
|
||||||
|
irrelevant-files: *ac-irrelevant-files
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
import os
|
import os
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
import os_client_config
|
||||||
from oslo_utils import uuidutils
|
from oslo_utils import uuidutils
|
||||||
from tempest.lib.cli import base
|
from tempest.lib.cli import base
|
||||||
from tempest.lib import exceptions
|
from tempest.lib import exceptions
|
||||||
@ -27,18 +28,28 @@ class AodhClient(object):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.cli_dir = os.environ.get('AODH_CLIENT_EXEC_DIR')
|
self.cli_dir = os.environ.get('AODH_CLIENT_EXEC_DIR')
|
||||||
self.endpoint = os.environ.get('AODH_ENDPOINT')
|
self.endpoint = os.environ.get('AODH_ENDPOINT')
|
||||||
|
self.cloud = os.environ.get('OS_ADMIN_CLOUD', 'devstack-admin')
|
||||||
self.user_id = uuidutils.generate_uuid()
|
self.user_id = uuidutils.generate_uuid()
|
||||||
self.project_id = uuidutils.generate_uuid()
|
self.project_id = uuidutils.generate_uuid()
|
||||||
|
|
||||||
def aodh(self, action, flags='', params='',
|
def aodh(self, action, flags='', params='',
|
||||||
fail_ok=False, merge_stderr=False):
|
fail_ok=False, merge_stderr=False):
|
||||||
creds = ("--os-auth-plugin aodh-noauth "
|
auth_args = []
|
||||||
"--user-id %s --project-id %s "
|
if self.cloud is None:
|
||||||
"--aodh-endpoint %s") % (self.user_id,
|
auth_args.append("--os-auth-type none")
|
||||||
self.project_id,
|
elif self.cloud != '':
|
||||||
self.endpoint)
|
conf = os_client_config.OpenStackConfig()
|
||||||
|
creds = conf.get_one_cloud(cloud=self.cloud).get_auth_args()
|
||||||
|
auth_args.append(f"--os-auth-url {creds['auth_url']}")
|
||||||
|
auth_args.append(f"--os-username {creds['username']}")
|
||||||
|
auth_args.append(f"--os-password {creds['password']}")
|
||||||
|
auth_args.append(f"--os-project-name {creds['project_name']}")
|
||||||
|
auth_args.append(f"--os-user-domain-id {creds['user_domain_id']}")
|
||||||
|
auth_args.append("--os-project-domain-id "
|
||||||
|
f"{creds['project_domain_id']}")
|
||||||
|
endpoint_arg = "--aodh-endpoint %s" % self.endpoint
|
||||||
|
|
||||||
flags = creds + ' ' + flags
|
flags = " ".join(auth_args + [endpoint_arg] + [flags])
|
||||||
|
|
||||||
return base.execute("aodh", action, flags, params, fail_ok,
|
return base.execute("aodh", action, flags, params, fail_ok,
|
||||||
merge_stderr, self.cli_dir)
|
merge_stderr, self.cli_dir)
|
||||||
@ -66,6 +77,15 @@ class ClientTestBase(base.ClientTestBase):
|
|||||||
def aodh(self, *args, **kwargs):
|
def aodh(self, *args, **kwargs):
|
||||||
return self.clients.aodh(*args, **kwargs)
|
return self.clients.aodh(*args, **kwargs)
|
||||||
|
|
||||||
|
def get_token(self):
|
||||||
|
cloud = os.environ.get('OS_ADMIN_CLOUD', 'devstack-admin')
|
||||||
|
if cloud is not None and cloud != "":
|
||||||
|
conf = os_client_config.OpenStackConfig()
|
||||||
|
region_conf = conf.get_one_cloud(cloud=cloud)
|
||||||
|
return region_conf.get_auth().get_token(region_conf.get_session())
|
||||||
|
else:
|
||||||
|
return ""
|
||||||
|
|
||||||
def details_multiple(self, output_lines, with_label=False):
|
def details_multiple(self, output_lines, with_label=False):
|
||||||
"""Return list of dicts with item details from cli output tables.
|
"""Return list of dicts with item details from cli output tables.
|
||||||
|
|
||||||
|
@ -391,7 +391,7 @@ class AodhClientGnocchiRulesTest(base.ClientTestBase):
|
|||||||
|
|
||||||
req = requests.post(
|
req = requests.post(
|
||||||
os.environ.get("GNOCCHI_ENDPOINT") + "/v1/resource/generic",
|
os.environ.get("GNOCCHI_ENDPOINT") + "/v1/resource/generic",
|
||||||
auth=requests.auth.HTTPBasicAuth('admin', ''),
|
headers={"X-Auth-Token": self.get_token()},
|
||||||
json={
|
json={
|
||||||
"id": RESOURCE_ID,
|
"id": RESOURCE_ID,
|
||||||
})
|
})
|
||||||
@ -573,8 +573,6 @@ class AodhClientGnocchiRulesTest(base.ClientTestBase):
|
|||||||
|
|
||||||
def test_gnocchi_aggr_by_resources_scenario(self):
|
def test_gnocchi_aggr_by_resources_scenario(self):
|
||||||
|
|
||||||
PROJECT_ID = uuidutils.generate_uuid()
|
|
||||||
|
|
||||||
# CREATE
|
# CREATE
|
||||||
result = self.aodh(
|
result = self.aodh(
|
||||||
u'alarm',
|
u'alarm',
|
||||||
@ -585,8 +583,7 @@ class AodhClientGnocchiRulesTest(base.ClientTestBase):
|
|||||||
"--query "
|
"--query "
|
||||||
'\'{"=": {"creator": "cr3at0r"}}\' '
|
'\'{"=": {"creator": "cr3at0r"}}\' '
|
||||||
"--resource-type generic "
|
"--resource-type generic "
|
||||||
"--aggregation-method mean "
|
"--aggregation-method mean "))
|
||||||
"--project-id %s" % PROJECT_ID))
|
|
||||||
alarm = self.details_multiple(result)[0]
|
alarm = self.details_multiple(result)[0]
|
||||||
ALARM_ID = alarm['alarm_id']
|
ALARM_ID = alarm['alarm_id']
|
||||||
self.assertEqual('alarm1', alarm['name'])
|
self.assertEqual('alarm1', alarm['name'])
|
||||||
@ -608,8 +605,7 @@ class AodhClientGnocchiRulesTest(base.ClientTestBase):
|
|||||||
"--query "
|
"--query "
|
||||||
'\'{"=": {"creator": "cr3at0r"}}\' '
|
'\'{"=": {"creator": "cr3at0r"}}\' '
|
||||||
"--resource-type generic "
|
"--resource-type generic "
|
||||||
"--aggregation-method mean "
|
"--aggregation-method mean "))
|
||||||
"--project-id %s" % PROJECT_ID))
|
|
||||||
|
|
||||||
# UPDATE
|
# UPDATE
|
||||||
result = self.aodh(
|
result = self.aodh(
|
||||||
@ -625,7 +621,6 @@ class AodhClientGnocchiRulesTest(base.ClientTestBase):
|
|||||||
'alarm', params="show %s" % ALARM_ID)
|
'alarm', params="show %s" % ALARM_ID)
|
||||||
alarm_show = self.details_multiple(result)[0]
|
alarm_show = self.details_multiple(result)[0]
|
||||||
self.assertEqual(ALARM_ID, alarm_show["alarm_id"])
|
self.assertEqual(ALARM_ID, alarm_show["alarm_id"])
|
||||||
self.assertEqual(PROJECT_ID, alarm_show["project_id"])
|
|
||||||
self.assertEqual('alarm1', alarm_show['name'])
|
self.assertEqual('alarm1', alarm_show['name'])
|
||||||
self.assertEqual('cpu', alarm_show['metric'])
|
self.assertEqual('cpu', alarm_show['metric'])
|
||||||
self.assertEqual('90.0', alarm_show['threshold'])
|
self.assertEqual('90.0', alarm_show['threshold'])
|
||||||
|
1
test-requirements.txt
Normal file
1
test-requirements.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
os-client-config>=1.28.0 # Apache-2.0
|
41
tools/fix_ca_bundle.sh
Normal file
41
tools/fix_ca_bundle.sh
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
# File taken from python-glanceclient
|
||||||
|
|
||||||
|
# When the functional tests are run in a devstack environment, we
|
||||||
|
# need to make sure that the python-requests module installed by
|
||||||
|
# tox in the test environment can find the distro-specific CA store
|
||||||
|
# where the devstack certs have been installed.
|
||||||
|
#
|
||||||
|
# assumptions:
|
||||||
|
# - devstack is running
|
||||||
|
# - the devstack tls-proxy service is running
|
||||||
|
# - the environment var OS_TESTENV_NAME is set in tox.ini (defaults
|
||||||
|
# to 'functional'
|
||||||
|
#
|
||||||
|
# This code based on a function in devstack lib/tls
|
||||||
|
function set_ca_bundle {
|
||||||
|
local python_cmd=".tox/${OS_TESTENV_NAME:-functional}/bin/python"
|
||||||
|
local capath=$($python_cmd -c $'try:\n from requests import certs\n print (certs.where())\nexcept ImportError: pass')
|
||||||
|
# of course, each distro keeps the CA store in a different location
|
||||||
|
local fedora_CA='/etc/pki/tls/certs/ca-bundle.crt'
|
||||||
|
local ubuntu_CA='/etc/ssl/certs/ca-certificates.crt'
|
||||||
|
local suse_CA='/etc/ssl/ca-bundle.pem'
|
||||||
|
|
||||||
|
# the distro CA is rooted in /etc, so if ours isn't, we need to
|
||||||
|
# change it
|
||||||
|
if [[ ! $capath == "" && ! $capath =~ ^/etc/.* && ! -L $capath ]]; then
|
||||||
|
if [[ -e $fedora_CA ]]; then
|
||||||
|
rm -f $capath
|
||||||
|
ln -s $fedora_CA $capath
|
||||||
|
elif [[ -e $ubuntu_CA ]]; then
|
||||||
|
rm -f $capath
|
||||||
|
ln -s $ubuntu_CA $capath
|
||||||
|
elif [[ -e $suse_CA ]]; then
|
||||||
|
rm -f $capath
|
||||||
|
ln -s $suse_CA $capath
|
||||||
|
else
|
||||||
|
echo "can't set CA bundle, expect tests to fail"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
set_ca_bundle
|
27
tox.ini
27
tox.ini
@ -9,8 +9,6 @@ usedevelop = True
|
|||||||
setenv =
|
setenv =
|
||||||
VIRTUAL_ENV={envdir}
|
VIRTUAL_ENV={envdir}
|
||||||
AODH_CLIENT_EXEC_DIR={envdir}/bin
|
AODH_CLIENT_EXEC_DIR={envdir}/bin
|
||||||
AODH_ENDPOINT=http://localhost:8042
|
|
||||||
GNOCCHI_ENDPOINT=http://localhost:8041
|
|
||||||
passenv =
|
passenv =
|
||||||
GNOCCHI_*
|
GNOCCHI_*
|
||||||
AODH_*
|
AODH_*
|
||||||
@ -20,14 +18,25 @@ passenv =
|
|||||||
OS_LOG_CAPTURE
|
OS_LOG_CAPTURE
|
||||||
# NOTE(tonyb): This project has chosen to *NOT* consume upper-constraints.txt
|
# NOTE(tonyb): This project has chosen to *NOT* consume upper-constraints.txt
|
||||||
# NOTE(jd): the -e is on its own line so it is passed a separate argument to pip
|
# NOTE(jd): the -e is on its own line so it is passed a separate argument to pip
|
||||||
# NOTE(mmagr): Recent compatibility fixes for gnocchi (werkzeug 2.x vs. 3.x)
|
|
||||||
# are not included in any release yet. Remove gnocchi dep override
|
|
||||||
# once above is not true.
|
|
||||||
deps =
|
deps =
|
||||||
.[test]
|
.[test]
|
||||||
git+https://github.com/gnocchixyz/gnocchi.git
|
commands = stestr run --slowest {posargs}
|
||||||
http://tarballs.openstack.org/aodh/aodh-master.tar.gz#egg=aodh[mysql]
|
|
||||||
commands = pifpaf run aodh -- stestr run --slowest {posargs}
|
[testenv:functional]
|
||||||
|
setenv =
|
||||||
|
OS_TEST_PATH = ./aodhclient/tests/functional
|
||||||
|
OS_TESTENV_NAME = {envname}
|
||||||
|
AODH_CLIENT_EXEC_DIR={envdir}/bin
|
||||||
|
AODH_ENDPOINT=http://localhost:8042
|
||||||
|
GNOCCHI_ENDPOINT=http://localhost/metric/
|
||||||
|
allowlist_externals =
|
||||||
|
bash
|
||||||
|
deps = .[test]
|
||||||
|
-r{toxinidir}/requirements.txt
|
||||||
|
-r{toxinidir}/test-requirements.txt
|
||||||
|
commands =
|
||||||
|
bash tools/fix_ca_bundle.sh
|
||||||
|
stestr --test-path {env:OS_TEST_PATH} run --slowest {posargs}
|
||||||
|
|
||||||
[testenv:pep8]
|
[testenv:pep8]
|
||||||
deps = hacking<3.1.0,>=3.0
|
deps = hacking<3.1.0,>=3.0
|
||||||
@ -67,7 +76,7 @@ commands =
|
|||||||
allowlist_externals = rm
|
allowlist_externals = rm
|
||||||
|
|
||||||
[testenv:debug]
|
[testenv:debug]
|
||||||
commands = pifpaf --debug run aodh -- oslo_debug_helper {posargs}
|
commands = oslo_debug_helper {posargs}
|
||||||
|
|
||||||
[flake8]
|
[flake8]
|
||||||
show-source = True
|
show-source = True
|
||||||
|
Loading…
x
Reference in New Issue
Block a user