diff --git a/doc/requirements.txt b/doc/requirements.txt index 838d03441..5131250a4 100644 --- a/doc/requirements.txt +++ b/doc/requirements.txt @@ -5,10 +5,5 @@ # As openstack job build-reno-releasenotes and Read The Docs page support only # one single requirements file for a project, we need to have one such file # which will include all project requirements --r ../requirements.txt --r ../extra-requirements.txt -oslo.log>=3.36.0 # Apache-2.0 -oslotest>=3.2.0 # Apache-2.0 -reno>=2.5.0 # Apache-2.0 -sphinx!=1.6.6,!=1.6.7,>=1.6.2;python_version>='3.4' # BSD -sphinx_rtd_theme>=0.4.2,< 1 # Apache-2.0 +reno>=3.2.0 # Apache-2.0 +sphinx>=3.4.2 # BSD diff --git a/doc/source/conf.py b/doc/source/conf.py index 1c39cc6db..b2dab34b9 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -23,14 +23,23 @@ # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -# + import os import sys + BASE_DIR = os.path.dirname(os.path.abspath(__file__)) TOBIKO_DIR = os.path.abspath(os.path.join(BASE_DIR, "..", "..")) sys.path.insert(0, TOBIKO_DIR) +# -- Python logging ---------------------------------------------------------- + +import logging +from tools import common + +common.setup_logging(level=logging.INFO) + + # -- Project information ----------------------------------------------------- project = 'Tobiko' @@ -41,11 +50,17 @@ author = "Tobiko's Team" # |version| and |release|, also used in various other places throughout the # built documents. # -# Version info -from tobiko import version -release = version.release -# The short X.Y version. -version = version.version + +from tools import get_version +release = get_version.get_version() +version = '.'.join(release.split('.', 2)[:2]) + + +# -- Install requirements ---------------------------------------------------- + +from tools import install +install.pip_install('sphinx_rtd_theme>=0.5.1,<1') # Apache-2.0 +install.install_tobiko() # -- General configuration --------------------------------------------------- @@ -126,7 +141,7 @@ def _get_config_generator_config_definition(conf): # oslo_config.sphinxconfiggen appends '.conf.sample' to the filename, # strip file extentension (.conf or .ini). output_file_path = '_static/config-samples/%s' % conf.rsplit('.', 1)[0] - return (config_file_path, output_file_path) + return config_file_path, output_file_path config_generator_config_file = [ diff --git a/extra-requirements.txt b/extra-requirements.txt index 2f508340f..e4da5a41a 100644 --- a/extra-requirements.txt +++ b/extra-requirements.txt @@ -1,2 +1,5 @@ +ansi2html # LGPLv3+ pandas # BSD +podman # Apache-2.0 +pytest-rerunfailures # MPL-2.0 validations-libs # APACHE-2.0 diff --git a/lower-constraints.txt b/lower-constraints.txt index 53a1b0bd9..0b7c3b203 100644 --- a/lower-constraints.txt +++ b/lower-constraints.txt @@ -1,4 +1,4 @@ -# Tobiko framework requirements +# from requirements.txt docker==4.4.1 fixtures==3.0.0 @@ -21,3 +21,14 @@ six==1.15.0 sshtunnel==0.3.1 stestr==3.1.0 testtools==2.4.0 + + +# from test-requirements.txt + +ansi2html==1.6.0 +coverage==5.3.1 +mock==3.0.5 +psutil==5.8.0 +pytest==6.2.1 +pytest-html==3.1.1 +pytest-xdist==2.2.0 diff --git a/releasenotes/source/conf.py b/releasenotes/source/conf.py index 9550aff66..066ff38ca 100644 --- a/releasenotes/source/conf.py +++ b/releasenotes/source/conf.py @@ -23,13 +23,21 @@ # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -# + import os import sys + BASE_DIR = os.path.dirname(os.path.abspath(__file__)) TOBIKO_DIR = os.path.abspath(os.path.join(BASE_DIR, "..", "..")) sys.path.insert(0, TOBIKO_DIR) +# -- Python logging ---------------------------------------------------------- + +import logging +from tools import common + +common.setup_logging(level=logging.INFO) + # -- Project information ----------------------------------------------------- @@ -41,11 +49,16 @@ author = "Tobiko's Team" # |version| and |release|, also used in various other places throughout the # built documents. # -# Version info -from tobiko import version -release = version.release -# The short X.Y version. -version = version.version + +from tools import get_version +release = get_version.get_version() +version = '.'.join(release.split('.', 2)[:2]) + + +# -- Install requirements ---------------------------------------------------- + +from tools import install +install.pip_install('sphinx_rtd_theme>=0.5.1,<1') # Apache-2.0 # -- General configuration --------------------------------------------------- diff --git a/requirements.txt b/requirements.txt index 86472ec29..82d482964 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,7 +10,6 @@ oslo.config>=8.4.0 # Apache-2.0 oslo.log>=4.4.0 # Apache-2.0 paramiko>=2.7.2 # LGPLv2.1 pbr>=5.5.1 # Apache-2.0 -podman>=1.6.0 # Apache-2.0 python-glanceclient>=3.2.2 # Apache-2.0 python-heatclient>=2.3.0 # Apache-2.0 python-neutronclient>=7.2.1 # Apache-2.0 diff --git a/test-requirements.txt b/test-requirements.txt index fb9a558ef..60d17c430 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1,10 +1,8 @@ # Unit tests requirements -ansi2html>=1.6.0 # LGPLv3+ -coverage>=4.5.0 # Apache-2.0 -mock>=2.0.0 # BSD -psutil>=5.7.2 # BSD -pytest>=6.0.0 # MIT -pytest-html>=3.0.0 # MPL-2.0 -pytest-rerunfailures>=9.0.0 # MPL-2.0 -pytest-xdist[psutil]>=2.0.0 # MIT +coverage>=5.3.1 # Apache-2.0 +mock>=3.0.5 # BSD +psutil>=5.8.0 # BSD +pytest>=6.2.1 # MIT +pytest-html>=3.1.1 # MPL-2.0 +pytest-xdist[psutil]>=2.2.0 # MIT diff --git a/tobiko/openstack/topology/_topology.py b/tobiko/openstack/topology/_topology.py index 443415883..557e5cef1 100644 --- a/tobiko/openstack/topology/_topology.py +++ b/tobiko/openstack/topology/_topology.py @@ -23,8 +23,6 @@ import six from six.moves.urllib import parse import tobiko -from tobiko import docker -from tobiko import podman from tobiko.shell import files from tobiko.shell import ip from tobiko.shell import sh @@ -157,6 +155,7 @@ class OpenStackTopologyNode(object): def docker_client(self): docker_client = self._docker_client if not docker_client: + from tobiko import docker self._docker_client = docker_client = docker.get_docker_client( ssh_client=self.ssh_client) return docker_client @@ -165,6 +164,7 @@ class OpenStackTopologyNode(object): def podman_client(self): podman_client = self._podman_client if not podman_client: + from tobiko import podman self._podman_client = podman_client = podman.get_podman_client( ssh_client=self.ssh_client) return podman_client diff --git a/tobiko/tripleo/_overcloud.py b/tobiko/tripleo/_overcloud.py index 548cbfa47..f4f1b4367 100644 --- a/tobiko/tripleo/_overcloud.py +++ b/tobiko/tripleo/_overcloud.py @@ -17,7 +17,6 @@ import io import os from oslo_log import log -import pandas import six import tobiko @@ -184,6 +183,7 @@ def get_overcloud_nodes_dataframe(oc_node_df_function): :return: dataframe of all overcloud nodes processes """ + import pandas oc_nodes_selection = list_overcloud_nodes() oc_nodes_names = [node.name for node in oc_nodes_selection] oc_nodes_dfs = [oc_node_df_function(node_name) for diff --git a/tools/common.py b/tools/common.py index 432b37209..9013b6974 100644 --- a/tools/common.py +++ b/tools/common.py @@ -33,7 +33,7 @@ def get_logger(name): return logging.getLogger(name) -def setup_logging(main_script=None, level=logging.DEBUG): +def setup_logging(main_script=None, level=logging.DEBUG) -> object: main_script = main_script or sys.modules['__main__'].__file__ logging.basicConfig( level=level, diff --git a/tools/get_version.py b/tools/get_version.py new file mode 100755 index 000000000..9430523ea --- /dev/null +++ b/tools/get_version.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 +# Copyright 2018 Red Hat +# +# 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. +from __future__ import absolute_import + +import os +import sys + +TOP_DIR = os.path.realpath(os.path.dirname(os.path.dirname(__file__))) + +if TOP_DIR not in sys.path: + sys.path.insert(0, TOP_DIR) + +from tools import common # noqa + + +def main(): + version = get_version() + sys.stdout.write(f'{version}\n') + + +CACHE = {} + + +def get_version(): + version = CACHE.get('version') + if not version: + CACHE['version'] = version = common.execute( + f"git -C '{TOP_DIR}' describe").splitlines()[0] + return version + + +if __name__ == '__main__': + main() diff --git a/tools/install.py b/tools/install.py new file mode 100755 index 000000000..da9ced08a --- /dev/null +++ b/tools/install.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python3 +# Copyright 2018 Red Hat +# +# 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. +from __future__ import absolute_import + +import os +import sys + +TOP_DIR = os.path.realpath(os.path.dirname(os.path.dirname(__file__))) + +if TOP_DIR not in sys.path: + sys.path.insert(0, TOP_DIR) + +from tools import common # noqa +from tools import get_version # noqa + +LOG = common.get_logger(__name__) + +TOX_VERSION = os.environ.get('TOX_VERSION') or '>=3.8.0' + +TOX_CONSTRAINTS_FILE = ( + os.environ.get('TOX_CONSTRAINTS_FILE') or + 'https://opendev.org/openstack/requirements/raw/branch/master/upper-constraints.txt') + +TOX_CONSTRAINTS = ( + os.environ.get('TOX_CONSTRAINTS') or f"'-c{TOX_CONSTRAINTS_FILE}'") + + +def main(): + common.setup_logging() + install_tox() + install_bindeps() + install_tobiko() + + +def install_tox(version=TOX_VERSION): + LOG.info(f"Installing Tox... (version: {version})") + pip_install(f"'tox{version}'") + + +def install_bindeps(): + LOG.info(f"Installing Tobiko binary dependencies...") + common.execute(os.path.join(TOP_DIR, 'tools', 'install-bindeps.sh'), + capture_stdout=False) + + +def install_tobiko(): + version = get_version.get_version() + LOG.info(f"Installing Tobiko version {version}...") + pip_install(f"-e '{TOP_DIR}'") + + +def pip_install(args): + LOG.debug(f"Installing packages: {args}...") + common.execute_python(f"-m pip install {TOX_CONSTRAINTS} {args}", + capture_stdout=False) + + +if __name__ == '__main__': + main() diff --git a/tox.ini b/tox.ini index a6a2a1e12..e735c6966 100644 --- a/tox.ini +++ b/tox.ini @@ -275,30 +275,55 @@ deps = -r{toxinidir}/doc/requirements.txt +[testenv:linkcheck] + +allowlist_externals = sh +basepython = {[docs]basepython} +envdir = {[docs]envdir} +deps = {[docs]deps} +commands = + sh -c 'cd {toxinidir}/doc/source && sphinx-build -W -b linkcheck . ../build/linkcheck' +# Do not install any requirements. We want this to be fast and work even if +# system dependencies are missing, since it's used to tell you what system +# dependencies are missing! This also means that bindep must be installed +# separately, outside of the requirements files. +usedevelop = false +skipdist = true +skip_install = true + + [testenv:docs] +allowlist_externals = sh basepython = {[docs]basepython} envdir = {[docs]envdir} deps = {[docs]deps} changedir = doc/source -commands = sphinx-build -W -b html . ../build/html - - -[testenv:linkcheck] - -basepython = {[docs]basepython} -envdir = {[docs]envdir} -deps = {[docs]deps} -commands = sphinx-build -W -b linkcheck doc/source doc/build/linkcheck +commands = + {[testenv:linkcheck]commands} + sphinx-build -W -b html . ../build/html +# Do not install any requirements. We want this to be fast and work even if +# system dependencies are missing, since it's used to tell you what system +# dependencies are missing! This also means that bindep must be installed +# separately, outside of the requirements files. +usedevelop = false +skipdist = true +skip_install = true [testenv:releasenotes] basepython = {[docs]basepython} -envdir = {[docs]envdir} deps = {[docs]deps} commands = sphinx-build -a -E -W -d releasenotes/build/doctrees -b html releasenotes/source releasenotes/build/html +# Do not install any requirements. We want this to be fast and work even if +# system dependencies are missing, since it's used to tell you what system +# dependencies are missing! This also means that bindep must be installed +# separately, outside of the requirements files. +usedevelop = false +skipdist = true +skip_install = true # --- CI report environments -------------------------------------------------- diff --git a/zuul.d/project.yaml b/zuul.d/project.yaml index ff4b529d9..e5054505c 100644 --- a/zuul.d/project.yaml +++ b/zuul.d/project.yaml @@ -2,12 +2,13 @@ templates: - ansible-role-jobs - build-openstack-docs-pti + - build-release-notes-jobs-python3 + - check-requirements - docs-on-readthedocs - openstack-cover-jobs - openstack-lower-constraints-jobs - openstack-python3-wallaby-jobs - publish-to-pypi - - build-release-notes-jobs-python3 vars: rtd_webhook_id: '84947'