From 2e0c3eaaa6cfaa7b57c10baa68826ce0defa498d Mon Sep 17 00:00:00 2001 From: Hemanth Nakkina Date: Tue, 26 Jul 2022 15:37:28 +0530 Subject: [PATCH] Sync global tox, requirement files Following changes are done as part of this patch: * Sync global tox, requirements.txt, test-requirements from release-tools project * Resolve flake errors * Fix templates to handle optional ingress relations * Remove run_tests script * Restructure unit tests directory --- charms/neutron-k8s/.stestr.conf | 4 +- charms/neutron-k8s/CONTRIBUTING.md | 4 +- .../v0/identity_service.py | 41 +++--- charms/neutron-k8s/requirements.txt | 38 +++-- charms/neutron-k8s/run_tests | 17 --- .../src/templates/wsgi-neutron-api.conf.j2 | 2 +- charms/neutron-k8s/test-requirements.txt | 26 ++-- .../{unit_tests => tests/unit}/__init__.py | 0 .../unit}/test_neutron_charm.py | 4 - charms/neutron-k8s/tox.ini | 139 +++++++----------- 10 files changed, 108 insertions(+), 167 deletions(-) delete mode 100755 charms/neutron-k8s/run_tests rename charms/neutron-k8s/{unit_tests => tests/unit}/__init__.py (100%) rename charms/neutron-k8s/{unit_tests => tests/unit}/test_neutron_charm.py (97%) diff --git a/charms/neutron-k8s/.stestr.conf b/charms/neutron-k8s/.stestr.conf index 5fcccaca..e4750de4 100644 --- a/charms/neutron-k8s/.stestr.conf +++ b/charms/neutron-k8s/.stestr.conf @@ -1,3 +1,3 @@ [DEFAULT] -test_path=./unit_tests -top_dir=./ +test_path=./tests/unit +top_dir=./tests diff --git a/charms/neutron-k8s/CONTRIBUTING.md b/charms/neutron-k8s/CONTRIBUTING.md index 8fc41419..2c2f11e2 100644 --- a/charms/neutron-k8s/CONTRIBUTING.md +++ b/charms/neutron-k8s/CONTRIBUTING.md @@ -35,9 +35,9 @@ TODO ## Testing The Python operator framework includes a very nice harness for testing -operator behaviour without full deployment. Just `run_tests`: +operator behaviour without full deployment. Run tests using command: - ./run_tests + tox -e py3 ## Deployment diff --git a/charms/neutron-k8s/lib/charms/sunbeam_keystone_operator/v0/identity_service.py b/charms/neutron-k8s/lib/charms/sunbeam_keystone_operator/v0/identity_service.py index 89f9b1f3..e80e5a04 100644 --- a/charms/neutron-k8s/lib/charms/sunbeam_keystone_operator/v0/identity_service.py +++ b/charms/neutron-k8s/lib/charms/sunbeam_keystone_operator/v0/identity_service.py @@ -26,7 +26,7 @@ Two events are also available to respond to: A basic example showing the usage of this relation follows: ``` -from charms.sunbeam_sunbeam_identity_service_operator.v0.identity_service import IdentityServiceRequires +from charms.sunbeam_keystone_operator.v0.identity_service import IdentityServiceRequires class IdentityServiceClientCharm(CharmBase): def __init__(self, *args): @@ -75,6 +75,20 @@ class IdentityServiceClientCharm(CharmBase): ``` """ +import json +import logging + +from ops.framework import ( + StoredState, + EventBase, + ObjectEvents, + EventSource, + Object, +) +from ops.model import Relation + +logger = logging.getLogger(__name__) + # The unique Charmhub library identifier, never change it LIBID = "6a7cb19b98314ecf916e3fcb02708608" @@ -85,21 +99,6 @@ LIBAPI = 0 # to 0 if you are raising the major API version LIBPATCH = 1 -import json -import logging -import requests - -from ops.framework import ( - StoredState, - EventBase, - ObjectEvents, - EventSource, - Object, -) - -from ops.model import Relation - -from typing import List logger = logging.getLogger(__name__) @@ -309,25 +308,21 @@ class IdentityServiceRequires(Object): """Return the service_user_id.""" return self.get_remote_app_data('service-user-id') - @property def internal_auth_url(self) -> str: """Return the internal_auth_url.""" return self.get_remote_app_data('internal-auth-url') - @property def admin_auth_url(self) -> str: """Return the admin_auth_url.""" return self.get_remote_app_data('admin-auth-url') - @property def public_auth_url(self) -> str: """Return the public_auth_url.""" return self.get_remote_app_data('public-auth-url') - def register_services(self, service_endpoints: dict, region: str) -> None: """Request access to the IdentityService server.""" @@ -355,7 +350,6 @@ class ReadyIdentityServiceClientsEvent(EventBase): self.service_endpoints = service_endpoints self.region = region self.client_app_name = client_app_name - def snapshot(self): return { @@ -417,10 +411,11 @@ class IdentityServiceProvides(Object): REQUIRED_KEYS = [ 'service-endpoints', 'region'] - + values = [ event.relation.data[event.relation.app].get(k) - for k in REQUIRED_KEYS ] + for k in REQUIRED_KEYS + ] # Validate data on the relation if all(values): service_eps = json.loads( diff --git a/charms/neutron-k8s/requirements.txt b/charms/neutron-k8s/requirements.txt index b1c1c363..f1f89572 100644 --- a/charms/neutron-k8s/requirements.txt +++ b/charms/neutron-k8s/requirements.txt @@ -1,19 +1,31 @@ -ops -jinja2 -# Get resources from github until cacerts issue is charmbuild image is fixed. -# git+https://opendev.org/openstack/charm-ops-openstack#egg=ops_openstack -# git+https://opendev.org/openstack/charm-ops-interface-tls-certificates#egg=interface_tls_certificates -# git+https://github.com/openstack/charm-ops-openstack#egg=ops_openstack -git+https://github.com/openstack/charm-ops-interface-tls-certificates#egg=interface_tls_certificates +# This file is managed centrally by release-tools and should not be modified +# within individual charm repos. See the 'global' dir contents for available +# choices of *requirements.txt files for OpenStack Charms: +# https://github.com/openstack-charmers/release-tools +# -git+https://github.com/openstack-charmers/advanced-sunbeam-openstack#egg=ops_sunbeam +# NOTE: newer versions of cryptography require a Rust compiler to build, +# see +# * https://github.com/openstack-charmers/zaza/issues/421 +# * https://mail.python.org/pipermail/cryptography-dev/2021-January/001003.html +# +cryptography<3.4 +jinja2 lightkube lightkube-models -cryptography < 3.4 +ops +git+https://github.com/openstack-charmers/advanced-sunbeam-openstack#egg=ops_sunbeam + +python-keystoneclient # keystone-k8s + +# Used for Traefik +# Note: Remove when traefik-k8s-operator v1 library is released +serialized_data_interface + +# Get resources from github until cacerts issue is charmbuild image is fixed. +git+https://github.com/openstack/charm-ops-interface-tls-certificates#egg=interface_tls_certificates + +# Note: Required for cinder-k8s, cinder-ceph-k8s, glance-k8s, nova-k8s git+https://github.com/openstack/charm-ops-interface-ceph-client#egg=interface_ceph_client # Charmhelpers is only present as interface_ceph_client uses it. git+https://github.com/juju/charm-helpers.git#egg=charmhelpers - -# Used for Traefik -serialized_data_interface - diff --git a/charms/neutron-k8s/run_tests b/charms/neutron-k8s/run_tests deleted file mode 100755 index 985f7472..00000000 --- a/charms/neutron-k8s/run_tests +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh -e -# Copyright 2021 Canonical Ltd. -# See LICENSE file for licensing details. - -if [ -z "$VIRTUAL_ENV" -a -d venv/ ]; then - . venv/bin/activate -fi - -if [ -z "$PYTHONPATH" ]; then - export PYTHONPATH="lib:src" -else - export PYTHONPATH="lib:src:$PYTHONPATH" -fi - -flake8 -coverage run --branch --source=src -m unittest -v "$@" -coverage report -m diff --git a/charms/neutron-k8s/src/templates/wsgi-neutron-api.conf.j2 b/charms/neutron-k8s/src/templates/wsgi-neutron-api.conf.j2 index f1938b24..6883c231 100644 --- a/charms/neutron-k8s/src/templates/wsgi-neutron-api.conf.j2 +++ b/charms/neutron-k8s/src/templates/wsgi-neutron-api.conf.j2 @@ -3,7 +3,7 @@ Listen {{ wsgi_config.public_port }} WSGIDaemonProcess glance processes=4 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \ display-name=%{GROUP} WSGIProcessGroup glance - {% if ingress_internal.ingress_path -%} + {% if ingress_internal and ingress_internal.ingress_path -%} WSGIScriptAlias {{ ingress_internal.ingress_path }} {{ wsgi_config.wsgi_public_script }} {% endif -%} WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }} diff --git a/charms/neutron-k8s/test-requirements.txt b/charms/neutron-k8s/test-requirements.txt index 19ac89d8..35f58ad6 100644 --- a/charms/neutron-k8s/test-requirements.txt +++ b/charms/neutron-k8s/test-requirements.txt @@ -1,16 +1,10 @@ -# This file is managed centrally. If you find the need to modify this as a -# one-off, please don't. Intead, consult #openstack-charms and ask about -# requirements management in charms via bot-control. Thank you. -coverage>=3.6 -mock>=1.2 -flake8>=2.2.4,<=2.4.1 -pyflakes==2.1.1 -stestr>=2.2.0 -requests>=2.18.4 -psutil -# oslo.i18n dropped py35 support -oslo.i18n<4.0.0 -git+https://github.com/openstack-charmers/zaza.git#egg=zaza -git+https://github.com/openstack-charmers/zaza-openstack-tests.git#egg=zaza.openstack -pytz # workaround for 14.04 pip/tox -pyudev # for ceph-* charm unit tests (not mocked?) +# This file is managed centrally by release-tools and should not be modified +# within individual charm repos. See the 'global' dir contents for available +# choices of *requirements.txt files for OpenStack Charms: +# https://github.com/openstack-charmers/release-tools +# + +coverage +mock +flake8 +stestr diff --git a/charms/neutron-k8s/unit_tests/__init__.py b/charms/neutron-k8s/tests/unit/__init__.py similarity index 100% rename from charms/neutron-k8s/unit_tests/__init__.py rename to charms/neutron-k8s/tests/unit/__init__.py diff --git a/charms/neutron-k8s/unit_tests/test_neutron_charm.py b/charms/neutron-k8s/tests/unit/test_neutron_charm.py similarity index 97% rename from charms/neutron-k8s/unit_tests/test_neutron_charm.py rename to charms/neutron-k8s/tests/unit/test_neutron_charm.py index 124efc16..04009ef9 100644 --- a/charms/neutron-k8s/unit_tests/test_neutron_charm.py +++ b/charms/neutron-k8s/tests/unit/test_neutron_charm.py @@ -15,10 +15,6 @@ # limitations under the License. import mock -import sys - -sys.path.append('lib') # noqa -sys.path.append('src') # noqa import charm import ops_sunbeam.test_utils as test_utils diff --git a/charms/neutron-k8s/tox.ini b/charms/neutron-k8s/tox.ini index 6ce762a7..7044cca0 100644 --- a/charms/neutron-k8s/tox.ini +++ b/charms/neutron-k8s/tox.ini @@ -1,78 +1,76 @@ -# Operator charm (with zaza): tox.ini +# Source charm: ./tox.ini +# This file is managed centrally by release-tools and should not be modified +# within individual charm repos. See the 'global' dir contents for available +# choices of tox.ini for OpenStack Charms: +# https://github.com/openstack-charmers/release-tools [tox] -envlist = pep8,py3 skipsdist = True -# NOTE: Avoid build/test env pollution by not enabling sitepackages. +envlist = pep8,py3 sitepackages = False -# NOTE: Avoid false positives by not skipping missing interpreters. skip_missing_interpreters = False -# NOTES: -# * We avoid the new dependency resolver by pinning pip < 20.3, see -# https://github.com/pypa/pip/issues/9187 -# * Pinning dependencies requires tox >= 3.2.0, see -# https://tox.readthedocs.io/en/latest/config.html#conf-requires -# * It is also necessary to pin virtualenv as a newer virtualenv would still -# lead to fetching the latest pip in the func* tox targets, see -# https://stackoverflow.com/a/38133283 -requires = pip < 20.3 - virtualenv < 20.0 -# NOTE: https://wiki.canonical.com/engineering/OpenStack/InstallLatestToxOnOsci minversion = 3.18.0 +[vars] +src_path = {toxinidir}/src/ +tst_path = {toxinidir}/tests/ +lib_path = {toxinidir}/lib/ + [testenv] -setenv = VIRTUAL_ENV={envdir} - PYTHONHASHSEED=0 - CHARM_DIR={envdir} +basepython = python3 +setenv = + PYTHONPATH = {toxinidir}:{[vars]lib_path}:{[vars]src_path} +passenv = + PYTHONPATH install_command = pip install {opts} {packages} commands = stestr run --slowest {posargs} -whitelist_externals = - git - add-to-archive.py - bash - charmcraft -passenv = HOME TERM CS_* OS_* TEST_* -deps = -r{toxinidir}/test-requirements.txt +allowlist_externals = + git + charmcraft + fetch-libs.sh +deps = + -r{toxinidir}/test-requirements.txt + +[testenv:build] +basepython = python3 +deps = +commands = + charmcraft clean + charmcraft -v pack [testenv:fetch] basepython = python3 deps = commands = - ./fetch-libs.sh - -[testenv:py3.8] -basepython = python3.8 -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt - -[testenv:py3.9] -basepython = python3.9 -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt - -[testenv:py3.10] -basepython = python3.10 -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt + {toxinidir}/fetch-libs.sh [testenv:py3] basepython = python3 -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt +deps = + {[testenv]deps} + -r{toxinidir}/requirements.txt + +[testenv:py3.8] +basepython = python3.8 +deps = {[testenv:py3]deps} + +[testenv:py3.9] +basepython = python3.9 +deps = {[testenv:py3]deps} + +[testenv:py3.10] +basepython = python3.10 +deps = {[testenv:py3]deps} [testenv:pep8] basepython = python3 -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt -commands = flake8 {posargs} src unit_tests tests +deps = {[testenv]deps} +commands = flake8 {posargs} {[vars]src_path} {[vars]tst_path} [testenv:cover] -# Technique based heavily upon -# https://github.com/openstack/nova/blob/master/tox.ini basepython = python3 -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt +deps = {[testenv:py3]deps} setenv = {[testenv]setenv} PYTHON=coverage run @@ -92,45 +90,8 @@ source = . omit = .tox/* - */charmhelpers/* - unit_tests/* + tests/* src/templates/* -[testenv:venv] -basepython = python3 -commands = {posargs} - -[testenv:build] -basepython = python3 -deps = -r{toxinidir}/build-requirements.txt -commands = - charmcraft build - -[testenv:func-noop] -basepython = python3 -commands = - functest-run-suite --help - -[testenv:func] -basepython = python3 -commands = - functest-run-suite --keep-model - -[testenv:func-smoke] -basepython = python3 -commands = - functest-run-suite --keep-model --smoke - -[testenv:func-dev] -basepython = python3 -commands = - functest-run-suite --keep-model --dev - -[testenv:func-target] -basepython = python3 -commands = - functest-run-suite --keep-model --bundle {posargs} - [flake8] -# Ignore E902 because the unit_tests directory is missing in the built charm. -ignore = E402,E226,E902 +ignore=E226,W504