From 07b46b6038d022d0e16ee65d5d58c81d7313d5d7 Mon Sep 17 00:00:00 2001 From: Hemanth Nakkina Date: Tue, 26 Jul 2022 15:40:25 +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 * Remove run_tests script * Restructure unit tests directory --- charms/horizon-k8s/.stestr.conf | 4 +- charms/horizon-k8s/CONTRIBUTING.md | 4 +- .../v0/cloud_credentials.py | 27 ++-- .../v0/identity_service.py | 38 +++-- charms/horizon-k8s/requirements.txt | 28 +++- charms/horizon-k8s/run_tests | 17 --- charms/horizon-k8s/src/charm.py | 7 +- charms/horizon-k8s/test-requirements.txt | 26 ++-- .../{unit_tests => tests/unit}/__init__.py | 0 .../unit}/test_dashboard_charm.py | 4 - charms/horizon-k8s/tox.ini | 144 ++++++------------ 11 files changed, 122 insertions(+), 177 deletions(-) delete mode 100755 charms/horizon-k8s/run_tests rename charms/horizon-k8s/{unit_tests => tests/unit}/__init__.py (100%) rename charms/horizon-k8s/{unit_tests => tests/unit}/test_dashboard_charm.py (97%) diff --git a/charms/horizon-k8s/.stestr.conf b/charms/horizon-k8s/.stestr.conf index 5fcccaca..e4750de4 100644 --- a/charms/horizon-k8s/.stestr.conf +++ b/charms/horizon-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/horizon-k8s/CONTRIBUTING.md b/charms/horizon-k8s/CONTRIBUTING.md index 9e8c34e8..35bc87fb 100644 --- a/charms/horizon-k8s/CONTRIBUTING.md +++ b/charms/horizon-k8s/CONTRIBUTING.md @@ -32,9 +32,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/horizon-k8s/lib/charms/sunbeam_keystone_operator/v0/cloud_credentials.py b/charms/horizon-k8s/lib/charms/sunbeam_keystone_operator/v0/cloud_credentials.py index 275c321d..7d9c706a 100644 --- a/charms/horizon-k8s/lib/charms/sunbeam_keystone_operator/v0/cloud_credentials.py +++ b/charms/horizon-k8s/lib/charms/sunbeam_keystone_operator/v0/cloud_credentials.py @@ -75,6 +75,17 @@ class IdentityServiceClientCharm(CharmBase): ``` """ +import logging + +from ops.framework import ( + StoredState, + EventBase, + ObjectEvents, + EventSource, + Object, +) +from ops.model import Relation + # The unique Charmhub library identifier, never change it LIBID = "deadbeef" @@ -85,22 +96,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__) diff --git a/charms/horizon-k8s/lib/charms/sunbeam_keystone_operator/v0/identity_service.py b/charms/horizon-k8s/lib/charms/sunbeam_keystone_operator/v0/identity_service.py index 536b8c01..e80e5a04 100644 --- a/charms/horizon-k8s/lib/charms/sunbeam_keystone_operator/v0/identity_service.py +++ b/charms/horizon-k8s/lib/charms/sunbeam_keystone_operator/v0/identity_service.py @@ -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__) @@ -324,7 +323,6 @@ class IdentityServiceRequires(Object): """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.""" @@ -352,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 { @@ -414,14 +411,13 @@ 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): - print(event.relation.id) - print(event.relation.name) service_eps = json.loads( event.relation.data[event.relation.app]['service-endpoints']) self.on.ready_identity_service_clients.emit( diff --git a/charms/horizon-k8s/requirements.txt b/charms/horizon-k8s/requirements.txt index bc0e5734..f1f89572 100644 --- a/charms/horizon-k8s/requirements.txt +++ b/charms/horizon-k8s/requirements.txt @@ -1,7 +1,31 @@ -ops +# 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 +# + +# 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 -git+https://github.com/openstack-charmers/advanced-sunbeam-openstack#egg=ops_sunbeam lightkube lightkube-models +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 diff --git a/charms/horizon-k8s/run_tests b/charms/horizon-k8s/run_tests deleted file mode 100755 index 985f7472..00000000 --- a/charms/horizon-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/horizon-k8s/src/charm.py b/charms/horizon-k8s/src/charm.py index c29ddf01..40b49666 100755 --- a/charms/horizon-k8s/src/charm.py +++ b/charms/horizon-k8s/src/charm.py @@ -34,7 +34,7 @@ class WSGIDashboardPebbleHandler(sunbeam_chandlers.WSGIPebbleHandler): logging.debug(f'Output from a2dissite: \n{out}') except ops.pebble.ExecError: logger.exception( - f"Failed to disable default site in apache" + "Failed to disable default site in apache" ) super().init_service(context) @@ -64,12 +64,12 @@ class OpenstackDashboardOperatorCharm(sunbeam_charm.OSBaseOperatorAPICharm): @property def apache_vhost(self) -> str: """Service default configuration file.""" - return f"/etc/apache2/sites-enabled/openstack-dashboard.conf" + return "/etc/apache2/sites-enabled/openstack-dashboard.conf" @property def service_conf(self) -> str: """Service default configuration file.""" - return f"/etc/openstack-dashboard/local_settings.py" + return "/etc/openstack-dashboard/local_settings.py" @property def service_user(self) -> str: @@ -119,6 +119,7 @@ class OpenstackDashboardXenaOperatorCharm(OpenstackDashboardOperatorCharm): openstack_release = 'xena' + if __name__ == "__main__": # Note: use_juju_for_storage=True required per # https://github.com/canonical/operator/issues/506 diff --git a/charms/horizon-k8s/test-requirements.txt b/charms/horizon-k8s/test-requirements.txt index 19ac89d8..35f58ad6 100644 --- a/charms/horizon-k8s/test-requirements.txt +++ b/charms/horizon-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/horizon-k8s/unit_tests/__init__.py b/charms/horizon-k8s/tests/unit/__init__.py similarity index 100% rename from charms/horizon-k8s/unit_tests/__init__.py rename to charms/horizon-k8s/tests/unit/__init__.py diff --git a/charms/horizon-k8s/unit_tests/test_dashboard_charm.py b/charms/horizon-k8s/tests/unit/test_dashboard_charm.py similarity index 97% rename from charms/horizon-k8s/unit_tests/test_dashboard_charm.py rename to charms/horizon-k8s/tests/unit/test_dashboard_charm.py index adae13cb..ccee0c00 100644 --- a/charms/horizon-k8s/unit_tests/test_dashboard_charm.py +++ b/charms/horizon-k8s/tests/unit/test_dashboard_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/horizon-k8s/tox.ini b/charms/horizon-k8s/tox.ini index 417a2b50..7044cca0 100644 --- a/charms/horizon-k8s/tox.ini +++ b/charms/horizon-k8s/tox.ini @@ -1,83 +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:py35] -basepython = python3.5 -# python3.5 is irrelevant on a focal+ charm. -commands = /bin/true - -[testenv:py36] -basepython = python3.6 -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt - -[testenv:py37] -basepython = python3.7 -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt - -[testenv:py38] -basepython = python3.8 -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 @@ -97,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