Migrate documentation to Sphinx
This commit is contained in:
parent
0ff2a038af
commit
0bbca02eec
@ -31,6 +31,9 @@ matrix:
|
||||
# Run coverage checks.
|
||||
- python: 3.5
|
||||
env: TOX_ENV=cover
|
||||
# Generate docs.
|
||||
- python: 3.5
|
||||
env: TOX_ENV=docs
|
||||
|
||||
install:
|
||||
# Install tox in a virtualenv to ensure we have an up to date version.
|
||||
|
120
README.md
120
README.md
@ -1,120 +0,0 @@
|
||||
# Tenks
|
||||
|
||||
Tenks is a utility that manages virtual bare metal clusters for development and
|
||||
testing purposes.
|
||||
|
||||
## Getting Started
|
||||
|
||||
### Pre-Requisites
|
||||
|
||||
Tenks has dependencies on Ansible roles that are hosted by Ansible Galaxy.
|
||||
Given that your virtualenv of choice is active and Ansible (>=2.6) is
|
||||
installed inside it, Tenks' role dependencies can be installed by
|
||||
`ansible-galaxy install --role-file=requirements.yml
|
||||
--roles-path=ansible/roles/`.
|
||||
|
||||
### Hosts
|
||||
|
||||
Tenks uses Ansible inventory to manage hosts. A multi-host setup is therefore
|
||||
supported, although the default hosts configuration will deploy an all-in-one
|
||||
setup on the host where the `ansible-playbook` command is executed
|
||||
(`localhost`).
|
||||
|
||||
* Configuration management of the Tenks cluster is always performed on
|
||||
`localhost`.
|
||||
* The `hypervisors` group should not directly contain any hosts. Its sub-groups
|
||||
must contain one or more system. Systems in its sub-groups will host a subset
|
||||
of the nodes deployed by Tenks.
|
||||
|
||||
* The `libvirt` group is a sub-group of `hypervisors`. Systems in this
|
||||
group will act as hypervisors using the Libvirt provider.
|
||||
|
||||
### Configuration
|
||||
|
||||
An override file should be created to configure Tenks. Any variables specified
|
||||
in this file will take precedence over their default settings in Tenks. This
|
||||
will allow you to set options as necessary for your setup, without needing to
|
||||
directly modify Tenks' variable files. An example override file can be found
|
||||
in `ansible/override.yml.example`.
|
||||
|
||||
Most of the configuration you will need to do relates to variables defined in
|
||||
`ansible/host_vars/localhost`. You can set your own values for these in your
|
||||
override file (mentioned above). In addition to other options, you will need to
|
||||
define the types of node you'd like to be able to manage as a dict in
|
||||
`node_types`, as well as the desired deployment specifications in `specs`.
|
||||
Format and guidance for available options will be found within the variable
|
||||
file.
|
||||
|
||||
Broadly, most variables in `ansible/group_vars/*` have sensible defaults which
|
||||
may be left as-is unless you have a particular need to configure them. A
|
||||
notable exception to this is the variable `physnet_mappings` in
|
||||
`ansible/group_vars/hypervisors`, which should map physical network names to
|
||||
the device to use for that network: this can be a network interface, or an
|
||||
existing OVS or Linux bridge. If these mappings are the same for all hosts in
|
||||
your `hypervisors` group, you may set a single dict `physnet_mappings` in your
|
||||
overrides file, and this will be used for all hosts. If different mappings are
|
||||
required for different hosts, you will need to individually specify them: for a
|
||||
host with hostname *myhost*, set `physnet_mappings` within the file
|
||||
`ansible/host_vars/myhost`.
|
||||
|
||||
### Commands
|
||||
|
||||
Tenks has a variable `cmd` which specifies the command to be run. This variable
|
||||
can be set in your override file (see above). The possible values it can take
|
||||
are:
|
||||
|
||||
* `deploy`: create a virtual cluster to the specification given. This is the
|
||||
default command.
|
||||
* `teardown`: tear down any existing virtual cluster with the specification
|
||||
given.
|
||||
|
||||
### Running Tenks
|
||||
|
||||
Currently, Tenks does not have a CLI or wrapper. Deployment can be run by
|
||||
calling `ansible-playbook --inventory ansible/inventory ansible/deploy.yml
|
||||
--extra-vars=@override.yml`, where `override.yml` is the path to your override
|
||||
file.
|
||||
|
||||
The `deploy.yml` playbook will run deployment from start to finish;
|
||||
`teardown.yml` is `deploy.yml`'s "mirror image" to tear down a cluster. These
|
||||
playbooks automatically set `cmd` appropriately, and they contain various
|
||||
constituent playbooks which perform different parts of the deployment. An
|
||||
individual section of Tenks can be run separately by substituting
|
||||
`ansible/deploy.yml` in the command above with the path to the playbook(s) you
|
||||
want to run. The current playbooks can be seen in the Ansible structure diagram
|
||||
in the *Development* section. Bear in mind that you will have to set `cmd` in
|
||||
your override file if you are running any of the sub-playbooks individually.
|
||||
|
||||
Once a cluster has been deployed, it can be reconfigured by modifying the Tenks
|
||||
configuration and rerunning `deploy.yml`. Node specs can be changed (including
|
||||
increasing/decreasing the number of nodes); node types can also be
|
||||
reconfigured. Existing nodes will be preserved where possible.
|
||||
|
||||
## Limitations
|
||||
|
||||
The following is a non-exhaustive list of current known limitations of Tenks:
|
||||
|
||||
* When using the Libvirt provider (currently the only provider), Tenks
|
||||
hypervisors cannot co-exist with a containerised Libvirt daemon (for example,
|
||||
as deployed by Kolla in the nova-libvirt container). Tenks will configure an
|
||||
uncontainerised Libvirt daemon instance on the hypervisor, and this may
|
||||
conflict with an existing containerised daemon. A workaround is to disable
|
||||
the Nova virtualised compute service on each Tenks hypervisor if it is
|
||||
present (for example, `docker stop nova_libvirt`) before running Tenks.
|
||||
|
||||
## Development
|
||||
|
||||
A diagram representing the Ansible structure of Tenks can be seen below. Blue
|
||||
rectangles represent playbooks, green rounded rectangles represent task books,
|
||||
red ellipses represent roles and yellow rhombi represent action plugins.
|
||||
|
||||
<!---
|
||||
This diagram will need to be updated when the Ansible structure changes. The
|
||||
original draw.io diagram can be found below. The link below contains the
|
||||
diagram's XML which can be imported into draw.io and edited, then a new PNG
|
||||
artifact can be produced.
|
||||
|
||||
https://drive.google.com/file/d/1MlmaTvJ2BPkhrOCLin4GPH265JDJqD1E/view?usp=sharing
|
||||
-->
|
||||
|
||||
![Tenks Ansible structure](assets/tenks_ansible_structure.png)
|
8
README.rst
Normal file
8
README.rst
Normal file
@ -0,0 +1,8 @@
|
||||
Tenks
|
||||
=====
|
||||
|
||||
Tenks is a utility that manages virtual bare metal clusters for development and
|
||||
testing purposes.
|
||||
|
||||
Refer to the documentation in ``doc/`` for installation instructions,
|
||||
configuration guidance and other information.
|
1
doc/requirements.txt
Normal file
1
doc/requirements.txt
Normal file
@ -0,0 +1 @@
|
||||
sphinx>=1.8.0 # BSD
|
Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 93 KiB |
BIN
doc/source/_static/tenks_networking_structure.png
Normal file
BIN
doc/source/_static/tenks_networking_structure.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 98 KiB |
49
doc/source/architecture.rst
Normal file
49
doc/source/architecture.rst
Normal file
@ -0,0 +1,49 @@
|
||||
.. _architecture:
|
||||
|
||||
Architecture
|
||||
============
|
||||
|
||||
Ansible
|
||||
-------
|
||||
|
||||
A diagram representing the Ansible structure of Tenks can be seen below. Blue
|
||||
rectangles represent playbooks, green rounded rectangles represent task books,
|
||||
red ellipses represent roles and yellow rhombi represent action plugins.
|
||||
|
||||
.. This diagram will need to be updated when the Ansible structure changes. The
|
||||
original draw.io diagram can be found below. The link below contains the
|
||||
diagram's XML which can be imported into draw.io and edited, then a new PNG
|
||||
artifact can be produced.
|
||||
https://drive.google.com/file/d/1MlmaTvJ2BPkhrOCLin4GPH265JDJqD1E/view?usp=sharing
|
||||
|
||||
.. image:: _static/tenks_ansible_structure.png
|
||||
:target: _static/tenks_ansible_structure.png
|
||||
|
||||
Networking
|
||||
----------
|
||||
|
||||
Tenks has a concept of 'physical network' which currently must map one-to-one
|
||||
to the hardware networks plugged into the hypervisors. It requires device
|
||||
mappings to be specified on a hypervisor for each physical network that is to
|
||||
be connected to nodes on that hypervisor. This device can be an interface, a
|
||||
Linux bridge or an Open vSwitch bridge. For each physical network that is give
|
||||
a mapping on a hypervisor, a new Tenks-managed Open vSwitch bridge is created.
|
||||
If the device mapped to this physnet is an interface, it is plugged directly
|
||||
into the new bridge. If the device is an existing Linux bridge, a veth pair is
|
||||
created to connect the existing bridge to the new bridge. If the device is an
|
||||
existing Open vSwitch bridge, an Open vSwitch patch port is created to link th
|
||||
two bridges.
|
||||
|
||||
A new veth pair is created for each physical network that each node on each
|
||||
hypervisor is connected to, and one end of the pair is plugged into the Tenks
|
||||
Open vSwitch bridge for that physical network; the other end will be plugged
|
||||
into the node itself. Creation of these veth pairs is necessary (at least for
|
||||
the Libvirt provider) to ensure that an interface is present in Open vSwitch
|
||||
even when the node itself is powered off.
|
||||
|
||||
An example of the networking structure of Tenks is shown below. In this
|
||||
example, one node was requested to be connected to physnet0 and physnet1, and
|
||||
two nodes were requested to be connected just to physnet1.
|
||||
|
||||
.. image:: _static/tenks_networking_structure.png
|
||||
:target: _static/tenks_networking_structure.png
|
173
doc/source/conf.py
Normal file
173
doc/source/conf.py
Normal file
@ -0,0 +1,173 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Configuration file for the Sphinx documentation builder.
|
||||
#
|
||||
# This file does only contain a selection of the most common options. For a
|
||||
# full list see the documentation:
|
||||
# http://www.sphinx-doc.org/en/master/config
|
||||
|
||||
# -- Path setup --------------------------------------------------------------
|
||||
|
||||
# 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
|
||||
# sys.path.insert(0, os.path.abspath('.'))
|
||||
|
||||
|
||||
# -- Project information -----------------------------------------------------
|
||||
|
||||
project = u'Tenks'
|
||||
copyright = u'2018, Will Miller'
|
||||
author = u'Will Miller'
|
||||
|
||||
# The short X.Y version
|
||||
version = u''
|
||||
# The full version, including alpha/beta/rc tags
|
||||
release = u''
|
||||
|
||||
|
||||
# -- General configuration ---------------------------------------------------
|
||||
|
||||
# If your documentation needs a minimal Sphinx version, state it here.
|
||||
#
|
||||
# needs_sphinx = '1.0'
|
||||
|
||||
# Add any Sphinx extension module names here, as strings. They can be
|
||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||
# ones.
|
||||
extensions = [
|
||||
]
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ['_templates']
|
||||
|
||||
# The suffix(es) of source filenames.
|
||||
# You can specify multiple suffix as a list of string:
|
||||
#
|
||||
# source_suffix = ['.rst', '.md']
|
||||
source_suffix = '.rst'
|
||||
|
||||
# The master toctree document.
|
||||
master_doc = 'index'
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
#
|
||||
# This is also used if you do content translation via gettext catalogs.
|
||||
# Usually you set "language" from the command line for these cases.
|
||||
language = None
|
||||
|
||||
# List of patterns, relative to source directory, that match files and
|
||||
# directories to ignore when looking for source files.
|
||||
# This pattern also affects html_static_path and html_extra_path.
|
||||
exclude_patterns = []
|
||||
|
||||
# The name of the Pygments (syntax highlighting) style to use.
|
||||
pygments_style = None
|
||||
|
||||
|
||||
# -- Options for HTML output -------------------------------------------------
|
||||
|
||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||
# a list of builtin themes.
|
||||
#
|
||||
html_theme = 'alabaster'
|
||||
|
||||
# Theme options are theme-specific and customize the look and feel of a theme
|
||||
# further. For a list of options available for each theme, see the
|
||||
# documentation.
|
||||
#
|
||||
# html_theme_options = {}
|
||||
|
||||
# Add any paths that contain custom static files (such as style sheets) here,
|
||||
# relative to this directory. They are copied after the builtin static files,
|
||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||
html_static_path = ['_static']
|
||||
|
||||
# Custom sidebar templates, must be a dictionary that maps document names
|
||||
# to template names.
|
||||
#
|
||||
# The default sidebars (for documents that don't match any pattern) are
|
||||
# defined by theme itself. Builtin themes are using these templates by
|
||||
# default: ``['localtoc.html', 'relations.html', 'sourcelink.html',
|
||||
# 'searchbox.html']``.
|
||||
#
|
||||
# html_sidebars = {}
|
||||
|
||||
|
||||
# -- Options for HTMLHelp output ---------------------------------------------
|
||||
|
||||
# Output file base name for HTML help builder.
|
||||
htmlhelp_basename = 'Tenksdoc'
|
||||
|
||||
|
||||
# -- Options for LaTeX output ------------------------------------------------
|
||||
|
||||
latex_elements = {
|
||||
# The paper size ('letterpaper' or 'a4paper').
|
||||
#
|
||||
# 'papersize': 'letterpaper',
|
||||
|
||||
# The font size ('10pt', '11pt' or '12pt').
|
||||
#
|
||||
# 'pointsize': '10pt',
|
||||
|
||||
# Additional stuff for the LaTeX preamble.
|
||||
#
|
||||
# 'preamble': '',
|
||||
|
||||
# Latex figure (float) alignment
|
||||
#
|
||||
# 'figure_align': 'htbp',
|
||||
}
|
||||
|
||||
# Grouping the document tree into LaTeX files. List of tuples
|
||||
# (source start file, target name, title,
|
||||
# author, documentclass [howto, manual, or own class]).
|
||||
latex_documents = [
|
||||
(master_doc, 'Tenks.tex', u'Tenks Documentation',
|
||||
u'Will Miller', 'manual'),
|
||||
]
|
||||
|
||||
|
||||
# -- Options for manual page output ------------------------------------------
|
||||
|
||||
# One entry per manual page. List of tuples
|
||||
# (source start file, name, description, authors, manual section).
|
||||
man_pages = [
|
||||
(master_doc, 'tenks', u'Tenks Documentation',
|
||||
[author], 1)
|
||||
]
|
||||
|
||||
|
||||
# -- Options for Texinfo output ----------------------------------------------
|
||||
|
||||
# Grouping the document tree into Texinfo files. List of tuples
|
||||
# (source start file, target name, title, author,
|
||||
# dir menu entry, description, category)
|
||||
texinfo_documents = [
|
||||
(master_doc, 'Tenks', u'Tenks Documentation',
|
||||
author, 'Tenks', 'One line description of project.',
|
||||
'Miscellaneous'),
|
||||
]
|
||||
|
||||
|
||||
# -- Options for Epub output -------------------------------------------------
|
||||
|
||||
# Bibliographic Dublin Core info.
|
||||
epub_title = project
|
||||
|
||||
# The unique identifier of the text. This can be a ISBN number
|
||||
# or the project homepage.
|
||||
#
|
||||
# epub_identifier = ''
|
||||
|
||||
# A unique identification for the text.
|
||||
#
|
||||
# epub_uid = ''
|
||||
|
||||
# A list of files that should not be packed into the epub file.
|
||||
epub_exclude_files = ['search.html']
|
50
doc/source/configuration.rst
Normal file
50
doc/source/configuration.rst
Normal file
@ -0,0 +1,50 @@
|
||||
.. _configuration:
|
||||
|
||||
Configuration
|
||||
=============
|
||||
|
||||
Hosts
|
||||
-----
|
||||
|
||||
Tenks uses Ansible inventory to manage hosts. A multi-host setup is therefore
|
||||
supported, although the default hosts configuration will deploy an all-in-one
|
||||
setup on the host where the ``ansible-playbook`` command is executed
|
||||
(*localhost*).
|
||||
|
||||
* Configuration management of the Tenks cluster is always performed on
|
||||
*localhost*.
|
||||
* The ``hypervisors`` group should not directly contain any hosts. Its sub-groups
|
||||
must contain one or more system. Systems in its sub-groups will host a subset
|
||||
of the nodes deployed by Tenks.
|
||||
|
||||
* The ``libvirt`` group is a sub-group of ``hypervisors``. Systems in this
|
||||
group will act as hypervisors using the Libvirt provider.
|
||||
|
||||
Variable Configuration
|
||||
----------------------
|
||||
|
||||
An override file should be created to configure Tenks. Any variables specified
|
||||
in this file will take precedence over their default settings in Tenks. This
|
||||
will allow you to set options as necessary for your setup, without needing to
|
||||
directly modify Tenks' variable files. An example override file can be found
|
||||
in ``ansible/override.yml.example``.
|
||||
|
||||
Most of the configuration you will need to do relates to variables defined in
|
||||
``ansible/host_vars/localhost``. You can set your own values for these in your
|
||||
override file (mentioned above). In addition to other options, you will need to
|
||||
define the types of node you'd like to be able to manage as a dict in
|
||||
``node_types``, as well as the desired deployment specifications in ``specs``.
|
||||
Format and guidance for available options will be found within the variable
|
||||
file.
|
||||
|
||||
Broadly, most variables in ``ansible/group_vars/*`` have sensible defaults which
|
||||
may be left as-is unless you have a particular need to configure them. A
|
||||
notable exception to this is the variable ``physnet_mappings`` in
|
||||
``ansible/group_vars/hypervisors``, which should map physical network names to
|
||||
the device to use for that network: this can be a network interface, or an
|
||||
existing OVS or Linux bridge. If these mappings are the same for all hosts in
|
||||
your ``hypervisors`` group, you may set a single dict ``physnet_mappings`` in your
|
||||
overrides file, and this will be used for all hosts. If different mappings are
|
||||
required for different hosts, you will need to individually specify them: for a
|
||||
host with hostname *myhost*, set ``physnet_mappings`` within the file
|
||||
``ansible/host_vars/myhost``.
|
10
doc/source/development.rst
Normal file
10
doc/source/development.rst
Normal file
@ -0,0 +1,10 @@
|
||||
Development
|
||||
===========
|
||||
|
||||
Contribution
|
||||
------------
|
||||
|
||||
Contribution to Tenks' development is welcomed. Currently, the correct workflow
|
||||
is to raise an issue in the `GitHub repository
|
||||
<https://github.com/stackhpc/tenks/>`_. Patches should be submitted for review
|
||||
using a GitHub pull request.
|
20
doc/source/index.rst
Normal file
20
doc/source/index.rst
Normal file
@ -0,0 +1,20 @@
|
||||
.. Tenks documentation master file, created by
|
||||
sphinx-quickstart on Thu Sep 20 15:43:21 2018.
|
||||
You can adapt this file completely to your liking, but it should at least
|
||||
contain the root `toctree` directive.
|
||||
|
||||
Welcome to Tenks's documentation!
|
||||
=================================
|
||||
|
||||
Tenks is a utility that manages virtual bare metal clusters for development and
|
||||
testing purposes.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
architecture
|
||||
configuration
|
||||
development
|
||||
install
|
||||
limitations
|
||||
run
|
8
doc/source/install.rst
Normal file
8
doc/source/install.rst
Normal file
@ -0,0 +1,8 @@
|
||||
Installation
|
||||
===============
|
||||
|
||||
Tenks has dependencies on Ansible roles that are hosted by Ansible Galaxy.
|
||||
Given that your virtualenv of choice is active and Ansible (>=2.6) is
|
||||
installed inside it, Tenks' role dependencies can be installed by
|
||||
``ansible-galaxy install --role-file=requirements.yml
|
||||
--roles-path=ansible/roles/``.
|
12
doc/source/limitations.rst
Normal file
12
doc/source/limitations.rst
Normal file
@ -0,0 +1,12 @@
|
||||
Limitations
|
||||
===========
|
||||
|
||||
The following is a non-exhaustive list of current known limitations of Tenks:
|
||||
|
||||
* When using the Libvirt provider (currently the only provider), Tenks
|
||||
hypervisors cannot co-exist with a containerised Libvirt daemon (for example,
|
||||
as deployed by Kolla in the nova-libvirt container). Tenks will configure an
|
||||
uncontainerised Libvirt daemon instance on the hypervisor, and this may
|
||||
conflict with an existing containerised daemon. A workaround is to disable
|
||||
the Nova virtualised compute service on each Tenks hypervisor if it is
|
||||
present (for example, ``docker stop nova_libvirt``) before running Tenks.
|
38
doc/source/run.rst
Normal file
38
doc/source/run.rst
Normal file
@ -0,0 +1,38 @@
|
||||
Running Tenks
|
||||
=============
|
||||
|
||||
Commands
|
||||
--------
|
||||
|
||||
Tenks has a variable ``cmd`` which specifies the command to be run. This
|
||||
variable can be set in your override file (see :ref:`configuration`). The
|
||||
possible values it can take are:
|
||||
|
||||
* ``deploy``: create a virtual cluster to the specification given. This is the
|
||||
default command.
|
||||
* ``teardown``: tear down any existing virtual cluster with the specification
|
||||
given.
|
||||
|
||||
Execution
|
||||
---------
|
||||
|
||||
Currently, Tenks does not have a CLI or wrapper. Deployment can be run by
|
||||
calling ``ansible-playbook --inventory ansible/inventory ansible/deploy.yml
|
||||
--extra-vars=@override.yml``, where ``override.yml`` is the path to your
|
||||
override file.
|
||||
|
||||
The ``deploy.yml`` playbook will run deployment from start to finish;
|
||||
``teardown.yml`` is ``deploy.yml``'s "mirror image" to tear down a cluster.
|
||||
These playbooks automatically set ``cmd`` appropriately, and they contain
|
||||
various constituent playbooks which perform different parts of the deployment.
|
||||
An individual section of Tenks can be run separately by substituting
|
||||
``ansible/deploy.yml`` in the command above with the path to the playbook(s)
|
||||
you want to run. The current playbooks can be seen in the Ansible structure
|
||||
diagram in :ref:`architecture`. Bear in mind that you will have to set
|
||||
``cmd`` in your override file if you are running any of the sub-playbooks
|
||||
individually.
|
||||
|
||||
Once a cluster has been deployed, it can be reconfigured by modifying the Tenks
|
||||
configuration and rerunning ``deploy.yml``. Node specs can be changed
|
||||
(including increasing/decreasing the number of nodes); node types can also be
|
||||
reconfigured. Existing nodes will be preserved where possible.
|
@ -2,7 +2,7 @@
|
||||
name = tenks
|
||||
summary = Deployment of virtual bare metal clusters with Tenks
|
||||
description-file =
|
||||
README.md
|
||||
README.rst
|
||||
author = Will Miller
|
||||
author-email = willm@stackhpc.com
|
||||
home-page = https://stackhpc.com
|
||||
|
8
tox.ini
8
tox.ini
@ -29,6 +29,14 @@ basepython = python2.7
|
||||
commands =
|
||||
flake8 {posargs}
|
||||
|
||||
[testenv:docs]
|
||||
basepython = python3
|
||||
deps =
|
||||
-c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt?h=stable/rocky}
|
||||
-r{toxinidir}/requirements.txt
|
||||
-r{toxinidir}/doc/requirements.txt
|
||||
commands = sphinx-build -W -b html doc/source doc/build/html
|
||||
|
||||
[testenv:cover]
|
||||
basepython = python3
|
||||
setenv =
|
||||
|
Loading…
Reference in New Issue
Block a user