Provide oslo.policies
Add policies to the api based on oslo.policies. Small changes in documentation. Provide generator for sample policies file. Add policies for agent and admin. Story: 200112 Task: 4807 Depends-On: I76d737bf9d1216b041bc1a518cc2098f28e7da7b Change-Id: Idf5c4ec1b663ad9ed3ab25744bdf0b7f28cdb1a2
This commit is contained in:
parent
5321635049
commit
32c4560c3b
.gitignore.testr.conf
api-guide/source
api-ref
config-generator
doc
api-samples
source
.gitignore.gitkeep
_static
admin
cli
code
conf.pyconfiguration
contributor
glossary.rstindex.rstinstall
user
etc/monasca
monasca_events_api
releasenotes
requirements.txtsetup.cfgtest-requirements.txttox.ini
1
.gitignore
vendored
1
.gitignore
vendored
@ -32,3 +32,4 @@ log/
|
|||||||
*config*.yml
|
*config*.yml
|
||||||
db/config.yml
|
db/config.yml
|
||||||
.coverage.*
|
.coverage.*
|
||||||
|
*.sample
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
test_command=OS_STDOUT_CAPTURE=${OS_STDOUT_CAPTURE:-1} \
|
test_command=OS_STDOUT_CAPTURE=${OS_STDOUT_CAPTURE:-1} \
|
||||||
OS_STDERR_CAPTURE=${OS_STDERR_CAPTURE:-1} \
|
OS_STDERR_CAPTURE=${OS_STDERR_CAPTURE:-1} \
|
||||||
OS_TEST_TIMEOUT=${OS_TEST_TIMEOUT:-60} \
|
OS_TEST_TIMEOUT=${OS_TEST_TIMEOUT:-60} \
|
||||||
${PYTHON:-python} -m subunit.run discover monasca $LISTOPT $IDOPTION
|
${PYTHON:-python} -m subunit.run discover $PWD $LISTOPT $IDOPTION
|
||||||
|
|
||||||
test_id_option=--load-list $IDFILE
|
test_id_option=--load-list $IDFILE
|
||||||
test_list_option=--list
|
test_list_option=--list
|
||||||
group_regex=monasca_events_api\.tests(?:\.|_)([^_]+)
|
group_regex=monasca_events_api\.tests\.unit(?:\.|_)([^_]+)
|
||||||
|
@ -1,259 +0,0 @@
|
|||||||
# 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.
|
|
||||||
#
|
|
||||||
# Key Manager API documentation build configuration file
|
|
||||||
#
|
|
||||||
# All configuration values have a default; values that are commented out
|
|
||||||
# serve to show the default.
|
|
||||||
|
|
||||||
# -- General configuration ------------------------------------------------
|
|
||||||
|
|
||||||
# If your documentation needs a minimal Sphinx version, state it here.
|
|
||||||
needs_sphinx = '1.6'
|
|
||||||
|
|
||||||
# Add any Sphinx extension module names here, as strings. They can be
|
|
||||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
|
||||||
# ones.
|
|
||||||
extensions = [
|
|
||||||
'openstackdocstheme'
|
|
||||||
]
|
|
||||||
|
|
||||||
# Add any paths that contain templates here, relative to this directory.
|
|
||||||
templates_path = ['_templates']
|
|
||||||
|
|
||||||
# The suffix of source filenames.
|
|
||||||
source_suffix = '.rst'
|
|
||||||
|
|
||||||
# The encoding of source files.
|
|
||||||
source_encoding = 'utf-8'
|
|
||||||
|
|
||||||
# The master toctree document.
|
|
||||||
master_doc = 'index'
|
|
||||||
|
|
||||||
# General details about project
|
|
||||||
repository_name = u'openstack/monasca-events-api'
|
|
||||||
project = u'Monasca Events API Guide'
|
|
||||||
bug_project = u'monasca-events-api'
|
|
||||||
bug_tag = u'api-guide'
|
|
||||||
copyright = u'2014, OpenStack Foundation'
|
|
||||||
|
|
||||||
from monasca_events_api.version import version_info
|
|
||||||
version = version_info.version_string()
|
|
||||||
release = version_info.release_string()
|
|
||||||
|
|
||||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
|
||||||
# for a list of supported languages.
|
|
||||||
# language = None
|
|
||||||
|
|
||||||
# There are two options for replacing |today|: either, you set today to some
|
|
||||||
# non-false value, then it is used:
|
|
||||||
# today = ''
|
|
||||||
# Else, today_fmt is used as the format for a strftime call.
|
|
||||||
# today_fmt = '%B %d, %Y'
|
|
||||||
|
|
||||||
# List of patterns, relative to source directory, that match files and
|
|
||||||
# directories to ignore when looking for source files.
|
|
||||||
exclude_patterns = []
|
|
||||||
|
|
||||||
# The reST default role (used for this markup: `text`) to use for all
|
|
||||||
# documents.
|
|
||||||
# default_role = None
|
|
||||||
|
|
||||||
# If true, '()' will be appended to :func: etc. cross-reference text.
|
|
||||||
# add_function_parentheses = True
|
|
||||||
|
|
||||||
# If true, the current module name will be prepended to all description
|
|
||||||
# unit titles (such as .. function::).
|
|
||||||
# add_module_names = True
|
|
||||||
|
|
||||||
# If true, sectionauthor and moduleauthor directives will be shown in the
|
|
||||||
# output. They are ignored by default.
|
|
||||||
# show_authors = False
|
|
||||||
|
|
||||||
# The name of the Pygments (syntax highlighting) style to use.
|
|
||||||
pygments_style = 'sphinx'
|
|
||||||
|
|
||||||
# A list of ignored prefixes for module index sorting.
|
|
||||||
# modindex_common_prefix = []
|
|
||||||
|
|
||||||
# If true, keep warnings as "system message" paragraphs in the built documents.
|
|
||||||
# keep_warnings = False
|
|
||||||
|
|
||||||
|
|
||||||
# -- 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 = 'openstackdocs'
|
|
||||||
|
|
||||||
# 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 = {}
|
|
||||||
|
|
||||||
# A shorter title for the navigation bar. Default is the same as html_title.
|
|
||||||
html_short_title = 'API Guide'
|
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to place at the top
|
|
||||||
# of the sidebar.
|
|
||||||
# html_logo = None
|
|
||||||
|
|
||||||
# The name of an image file (within the static path) to use as favicon of the
|
|
||||||
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
|
||||||
# pixels large.
|
|
||||||
# html_favicon = None
|
|
||||||
|
|
||||||
# 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 = []
|
|
||||||
|
|
||||||
# Add any extra paths that contain custom files (such as robots.txt or
|
|
||||||
# .htaccess) here, relative to this directory. These files are copied
|
|
||||||
# directly to the root of the documentation.
|
|
||||||
# html_extra_path = []
|
|
||||||
|
|
||||||
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
|
||||||
# using the given strftime format.
|
|
||||||
html_last_updated_fmt = '%Y-%m-%d %H:%M'
|
|
||||||
|
|
||||||
# If true, SmartyPants will be used to convert quotes and dashes to
|
|
||||||
# typographically correct entities.
|
|
||||||
# html_use_smartypants = True
|
|
||||||
|
|
||||||
# Custom sidebar templates, maps document names to template names.
|
|
||||||
# html_sidebars = {}
|
|
||||||
|
|
||||||
# Additional templates that should be rendered to pages, maps page names to
|
|
||||||
# template names.
|
|
||||||
# html_additional_pages = {}
|
|
||||||
|
|
||||||
# If false, no module index is generated.
|
|
||||||
# html_domain_indices = True
|
|
||||||
|
|
||||||
# If false, no index is generated.
|
|
||||||
html_use_index = True
|
|
||||||
|
|
||||||
# If true, the index is split into individual pages for each letter.
|
|
||||||
# html_split_index = False
|
|
||||||
|
|
||||||
# If true, links to the reST sources are added to the pages.
|
|
||||||
# html_show_sourcelink = True
|
|
||||||
|
|
||||||
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
|
|
||||||
# html_show_sphinx = True
|
|
||||||
|
|
||||||
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
|
|
||||||
# html_show_copyright = True
|
|
||||||
|
|
||||||
# If true, an OpenSearch description file will be output, and all pages will
|
|
||||||
# contain a <link> tag referring to it. The value of this option must be the
|
|
||||||
# base URL from which the finished HTML is served.
|
|
||||||
# html_use_opensearch = ''
|
|
||||||
|
|
||||||
# This is the file name suffix for HTML files (e.g. ".xhtml").
|
|
||||||
# html_file_suffix = None
|
|
||||||
|
|
||||||
# Output file base name for HTML help builder.
|
|
||||||
htmlhelp_basename = 'monascaeventsapi-api-guide'
|
|
||||||
|
|
||||||
|
|
||||||
# -- 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': '',
|
|
||||||
}
|
|
||||||
|
|
||||||
# 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 = [
|
|
||||||
('index', 'MonascaEventsApiAPI.tex', u'Key Manager API Documentation',
|
|
||||||
u'OpenStack Foundation', 'manual'),
|
|
||||||
]
|
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to place at the top of
|
|
||||||
# the title page.
|
|
||||||
# latex_logo = None
|
|
||||||
|
|
||||||
# For "manual" documents, if this is true, then toplevel headings are parts,
|
|
||||||
# not chapters.
|
|
||||||
# latex_use_parts = False
|
|
||||||
|
|
||||||
# If true, show page references after internal links.
|
|
||||||
# latex_show_pagerefs = False
|
|
||||||
|
|
||||||
# If true, show URL addresses after external links.
|
|
||||||
# latex_show_urls = False
|
|
||||||
|
|
||||||
# Documents to append as an appendix to all manuals.
|
|
||||||
# latex_appendices = []
|
|
||||||
|
|
||||||
# If false, no module index is generated.
|
|
||||||
# latex_domain_indices = True
|
|
||||||
|
|
||||||
|
|
||||||
# -- Options for manual page output ---------------------------------------
|
|
||||||
|
|
||||||
# One entry per manual page. List of tuples
|
|
||||||
# (source start file, name, description, authors, manual section).
|
|
||||||
man_pages = [
|
|
||||||
('index', 'monascaeventsapiapi', u'Monasca Events API Documentation',
|
|
||||||
[u'OpenStack Foundation'], 1)
|
|
||||||
]
|
|
||||||
|
|
||||||
# If true, show URL addresses after external links.
|
|
||||||
# man_show_urls = False
|
|
||||||
|
|
||||||
|
|
||||||
# -- 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 = [
|
|
||||||
('index', 'MonascaEventsApiAPIGuide', u'Monasca Events API Guide',
|
|
||||||
u'OpenStack Foundation', 'APIGuide',
|
|
||||||
'This guide teaches OpenStack Monasca Events service users concepts about '
|
|
||||||
'managing keys in an OpenStack cloud with the Monasca Events API.',
|
|
||||||
'Miscellaneous'),
|
|
||||||
]
|
|
||||||
|
|
||||||
# Documents to append as an appendix to all manuals.
|
|
||||||
# texinfo_appendices = []
|
|
||||||
|
|
||||||
# If false, no module index is generated.
|
|
||||||
# texinfo_domain_indices = True
|
|
||||||
|
|
||||||
# How to display URL addresses: 'footnote', 'no', or 'inline'.
|
|
||||||
# texinfo_show_urls = 'footnote'
|
|
||||||
|
|
||||||
# If true, do not generate a @detailmenu in the "Top" node's menu.
|
|
||||||
# texinfo_no_detailmenu = False
|
|
||||||
|
|
||||||
# -- Options for Internationalization output ------------------------------
|
|
||||||
locale_dirs = ['locale/']
|
|
||||||
|
|
||||||
# -- Options for PDF output --------------------------------------------------
|
|
||||||
|
|
||||||
pdf_documents = [
|
|
||||||
('index', u'MonascaEventsApiAPIGuide', u'Key Manager API Guide', u'OpenStack '
|
|
||||||
'contributors')
|
|
||||||
]
|
|
@ -1,35 +0,0 @@
|
|||||||
..
|
|
||||||
Copyright 2017 Fujitsu LIMITED
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
==================
|
|
||||||
Monasca Events API
|
|
||||||
==================
|
|
||||||
|
|
||||||
The monasca-events-api project has a RESTful HTTP service called the
|
|
||||||
Monasca Events API. To this API , services (agents) can send events collected
|
|
||||||
from OpenStack message bus.
|
|
||||||
|
|
||||||
This guide covers the concepts in the Monasca Events API.
|
|
||||||
For a full reference listing, please see:
|
|
||||||
`Monasca Events API Reference <http://developer.openstack.org/api-ref/monasca/#monasca-events-api>`__.
|
|
||||||
|
|
||||||
We welcome feedback, comments and bug reports at
|
|
||||||
`storyboard/monasca <https://storyboard.openstack.org/#!/project_group/866>`__.
|
|
||||||
|
|
||||||
|
|
||||||
Contents
|
|
||||||
========
|
|
||||||
.. toctree::
|
|
||||||
:maxdepth: 2
|
|
@ -16,6 +16,8 @@
|
|||||||
# All configuration values have a default; values that are commented out
|
# All configuration values have a default; values that are commented out
|
||||||
# serve to show the default.
|
# serve to show the default.
|
||||||
|
|
||||||
|
from monasca_events_api.version import version_info
|
||||||
|
|
||||||
# -- General configuration ------------------------------------------------
|
# -- General configuration ------------------------------------------------
|
||||||
|
|
||||||
# If your documentation needs a minimal Sphinx version, state it here.
|
# If your documentation needs a minimal Sphinx version, state it here.
|
||||||
@ -43,18 +45,13 @@ master_doc = 'index'
|
|||||||
|
|
||||||
# General details about project
|
# General details about project
|
||||||
repository_name = u'openstack/monasca-events-api'
|
repository_name = u'openstack/monasca-events-api'
|
||||||
project = u'Monasca Events Ref Guide'
|
project = u'Monitoring Events API Reference'
|
||||||
bug_project = u'monasca-events-api'
|
version = version_info.canonical_version_string()
|
||||||
bug_tag = u'api-ref'
|
release = version_info.version_string_with_vcs()
|
||||||
copyright = u'2014, OpenStack Foundation'
|
bug_project = u'866'
|
||||||
|
bug_tag = u''
|
||||||
# The version info for the project you're documenting, acts as replacement for
|
copyright = u'2014-present, OpenStack Foundation'
|
||||||
# |version| and |release|, also used in various other places throughout the
|
author = u'OpenStack Foundation'
|
||||||
# built documents.
|
|
||||||
#
|
|
||||||
from monasca_events_api.version import version_info
|
|
||||||
version = version_info.version_string()
|
|
||||||
release = version_info.release_string()
|
|
||||||
|
|
||||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
# for a list of supported languages.
|
# for a list of supported languages.
|
||||||
@ -173,8 +170,7 @@ html_use_index = True
|
|||||||
# html_file_suffix = None
|
# html_file_suffix = None
|
||||||
|
|
||||||
# Output file base name for HTML help builder.
|
# Output file base name for HTML help builder.
|
||||||
htmlhelp_basename = 'monascaeventsapi-api-ref'
|
htmlhelp_basename = 'MonitoringEventsApiRefDoc'
|
||||||
|
|
||||||
|
|
||||||
# -- Options for LaTeX output ---------------------------------------------
|
# -- Options for LaTeX output ---------------------------------------------
|
||||||
|
|
||||||
@ -193,8 +189,8 @@ latex_elements = {
|
|||||||
# (source start file, target name, title,
|
# (source start file, target name, title,
|
||||||
# author, documentclass [howto, manual, or own class]).
|
# author, documentclass [howto, manual, or own class]).
|
||||||
latex_documents = [
|
latex_documents = [
|
||||||
(master_doc, 'MonascaEventsApi.tex', u'Monasca Events API Documentation',
|
(master_doc, 'MonitoringEventsApiRef.tex', u'Monitoring Events API Reference',
|
||||||
u'OpenStack Foundation', 'manual'),
|
[author], 'manual'),
|
||||||
]
|
]
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to place at the top of
|
# The name of an image file (relative to this directory) to place at the top of
|
||||||
@ -217,42 +213,5 @@ latex_documents = [
|
|||||||
# If false, no module index is generated.
|
# If false, no module index is generated.
|
||||||
# latex_domain_indices = True
|
# latex_domain_indices = True
|
||||||
|
|
||||||
|
|
||||||
# -- 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, 'monascaeventsapi', u'Monasca Events API Documentation',
|
|
||||||
[u'OpenStack Foundation'], 1)
|
|
||||||
]
|
|
||||||
|
|
||||||
# If true, show URL addresses after external links.
|
|
||||||
# man_show_urls = False
|
|
||||||
|
|
||||||
|
|
||||||
# -- 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, 'MonascaEventsAPI', u'Monasca Events API Documentation',
|
|
||||||
u'OpenStack Foundation', 'MonascaEventsAPI', 'Monasca Events API',
|
|
||||||
'Miscellaneous'),
|
|
||||||
]
|
|
||||||
|
|
||||||
# Documents to append as an appendix to all manuals.
|
|
||||||
# texinfo_appendices = []
|
|
||||||
|
|
||||||
# If false, no module index is generated.
|
|
||||||
# texinfo_domain_indices = True
|
|
||||||
|
|
||||||
# How to display URL addresses: 'footnote', 'no', or 'inline'.
|
|
||||||
# texinfo_show_urls = 'footnote'
|
|
||||||
|
|
||||||
# If true, do not generate a @detailmenu in the "Top" node's menu.
|
|
||||||
# texinfo_no_detailmenu = False
|
|
||||||
|
|
||||||
# -- Options for Internationalization output ------------------------------
|
# -- Options for Internationalization output ------------------------------
|
||||||
locale_dirs = ['locale/']
|
locale_dirs = ['locale/']
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
:tocdepth: 2
|
:tocdepth: 2
|
||||||
|
|
||||||
..
|
..
|
||||||
Copyright 2014-2017 Fujitsu LIMITED
|
Copyright 2017 Fujitsu LIMITED
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License"); you may
|
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
|
not use this file except in compliance with the License. You may obtain
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
# config-generator
|
|
||||||
|
|
||||||
To generate sample configuration execute
|
|
||||||
|
|
||||||
```bash
|
|
||||||
tox -e genconfig
|
|
||||||
```
|
|
11
config-generator/README.rst
Normal file
11
config-generator/README.rst
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
================
|
||||||
|
config-generator
|
||||||
|
================
|
||||||
|
|
||||||
|
To generate sample configuration execute::
|
||||||
|
|
||||||
|
tox -e genconfig
|
||||||
|
|
||||||
|
To generate the sample policies execute::
|
||||||
|
|
||||||
|
tox -e genpolicy
|
@ -4,3 +4,4 @@ width = 80
|
|||||||
format = ini
|
format = ini
|
||||||
namespace = events.api
|
namespace = events.api
|
||||||
namespace = oslo.log
|
namespace = oslo.log
|
||||||
|
namespace = oslo.policy
|
3
config-generator/policy.conf
Normal file
3
config-generator/policy.conf
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[DEFAULT]
|
||||||
|
output_file = etc/monasca/events-policy.yaml.sample
|
||||||
|
namespace = events.api
|
0
doc/api-samples/.gitkeep
Normal file
0
doc/api-samples/.gitkeep
Normal file
1
doc/source/.gitignore
vendored
Normal file
1
doc/source/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
_static/
|
0
doc/source/.gitkeep
Normal file
0
doc/source/.gitkeep
Normal file
@ -1,114 +0,0 @@
|
|||||||
[DEFAULT]
|
|
||||||
|
|
||||||
#
|
|
||||||
# From oslo.log
|
|
||||||
#
|
|
||||||
|
|
||||||
# If set to true, the logging level will be set to DEBUG instead of
|
|
||||||
# the default INFO level. (boolean value)
|
|
||||||
# Note: This option can be changed without restarting.
|
|
||||||
#debug = false
|
|
||||||
|
|
||||||
# The name of a logging configuration file. This file is appended to
|
|
||||||
# any existing logging configuration files. For details about logging
|
|
||||||
# configuration files, see the Python logging module documentation.
|
|
||||||
# Note that when logging configuration files are used then all logging
|
|
||||||
# configuration is set in the configuration file and other logging
|
|
||||||
# configuration options are ignored (for example,
|
|
||||||
# logging_context_format_string). (string value)
|
|
||||||
# Note: This option can be changed without restarting.
|
|
||||||
# Deprecated group/name - [DEFAULT]/log_config
|
|
||||||
#log_config_append = <None>
|
|
||||||
|
|
||||||
# Defines the format string for %%(asctime)s in log records. Default:
|
|
||||||
# %(default)s . This option is ignored if log_config_append is set.
|
|
||||||
# (string value)
|
|
||||||
#log_date_format = %Y-%m-%d %H:%M:%S
|
|
||||||
|
|
||||||
# (Optional) Name of log file to send logging output to. If no default
|
|
||||||
# is set, logging will go to stderr as defined by use_stderr. This
|
|
||||||
# option is ignored if log_config_append is set. (string value)
|
|
||||||
# Deprecated group/name - [DEFAULT]/logfile
|
|
||||||
#log_file = <None>
|
|
||||||
|
|
||||||
# (Optional) The base directory used for relative log_file paths.
|
|
||||||
# This option is ignored if log_config_append is set. (string value)
|
|
||||||
# Deprecated group/name - [DEFAULT]/logdir
|
|
||||||
#log_dir = <None>
|
|
||||||
|
|
||||||
# Uses logging handler designed to watch file system. When log file is
|
|
||||||
# moved or removed this handler will open a new log file with
|
|
||||||
# specified path instantaneously. It makes sense only if log_file
|
|
||||||
# option is specified and Linux platform is used. This option is
|
|
||||||
# ignored if log_config_append is set. (boolean value)
|
|
||||||
#watch_log_file = false
|
|
||||||
|
|
||||||
# Use syslog for logging. Existing syslog format is DEPRECATED and
|
|
||||||
# will be changed later to honor RFC5424. This option is ignored if
|
|
||||||
# log_config_append is set. (boolean value)
|
|
||||||
#use_syslog = false
|
|
||||||
|
|
||||||
# Enable journald for logging. If running in a systemd environment you
|
|
||||||
# may wish to enable journal support. Doing so will use the journal
|
|
||||||
# native protocol which includes structured metadata in addition to
|
|
||||||
# log messages.This option is ignored if log_config_append is set.
|
|
||||||
# (boolean value)
|
|
||||||
#use_journal = false
|
|
||||||
|
|
||||||
# Syslog facility to receive log lines. This option is ignored if
|
|
||||||
# log_config_append is set. (string value)
|
|
||||||
#syslog_log_facility = LOG_USER
|
|
||||||
|
|
||||||
# Log output to standard error. This option is ignored if
|
|
||||||
# log_config_append is set. (boolean value)
|
|
||||||
#use_stderr = false
|
|
||||||
|
|
||||||
# Format string to use for log messages with context. (string value)
|
|
||||||
#logging_context_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user_identity)s] %(instance)s%(message)s
|
|
||||||
|
|
||||||
# Format string to use for log messages when context is undefined.
|
|
||||||
# (string value)
|
|
||||||
#logging_default_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s
|
|
||||||
|
|
||||||
# Additional data to append to log message when logging level for the
|
|
||||||
# message is DEBUG. (string value)
|
|
||||||
#logging_debug_format_suffix = %(funcName)s %(pathname)s:%(lineno)d
|
|
||||||
|
|
||||||
# Prefix each line of exception output with this format. (string
|
|
||||||
# value)
|
|
||||||
#logging_exception_prefix = %(asctime)s.%(msecs)03d %(process)d ERROR %(name)s %(instance)s
|
|
||||||
|
|
||||||
# Defines the format string for %(user_identity)s that is used in
|
|
||||||
# logging_context_format_string. (string value)
|
|
||||||
#logging_user_identity_format = %(user)s %(tenant)s %(domain)s %(user_domain)s %(project_domain)s
|
|
||||||
|
|
||||||
# List of package logging levels in logger=LEVEL pairs. This option is
|
|
||||||
# ignored if log_config_append is set. (list value)
|
|
||||||
#default_log_levels = amqp=WARN,amqplib=WARN,boto=WARN,qpid=WARN,sqlalchemy=WARN,suds=INFO,oslo.messaging=INFO,oslo_messaging=INFO,iso8601=WARN,requests.packages.urllib3.connectionpool=WARN,urllib3.connectionpool=WARN,websocket=WARN,requests.packages.urllib3.util.retry=WARN,urllib3.util.retry=WARN,keystonemiddleware=WARN,routes.middleware=WARN,stevedore=WARN,taskflow=WARN,keystoneauth=WARN,oslo.cache=INFO,dogpile.core.dogpile=INFO
|
|
||||||
|
|
||||||
# Enables or disables publication of error events. (boolean value)
|
|
||||||
#publish_errors = false
|
|
||||||
|
|
||||||
# The format for an instance that is passed with the log message.
|
|
||||||
# (string value)
|
|
||||||
#instance_format = "[instance: %(uuid)s] "
|
|
||||||
|
|
||||||
# The format for an instance UUID that is passed with the log message.
|
|
||||||
# (string value)
|
|
||||||
#instance_uuid_format = "[instance: %(uuid)s] "
|
|
||||||
|
|
||||||
# Interval, number of seconds, of log rate limiting. (integer value)
|
|
||||||
#rate_limit_interval = 0
|
|
||||||
|
|
||||||
# Maximum number of logged messages per rate_limit_interval. (integer
|
|
||||||
# value)
|
|
||||||
#rate_limit_burst = 0
|
|
||||||
|
|
||||||
# Log level name used by rate limiting: CRITICAL, ERROR, INFO,
|
|
||||||
# WARNING, DEBUG or empty string. Logs with level greater or equal to
|
|
||||||
# rate_limit_except_level are not filtered. An empty string means that
|
|
||||||
# all levels are filtered. (string value)
|
|
||||||
#rate_limit_except_level = CRITICAL
|
|
||||||
|
|
||||||
# Enables or disables fatal status of deprecations. (boolean value)
|
|
||||||
#fatal_deprecations = false
|
|
6
doc/source/admin/index.rst
Normal file
6
doc/source/admin/index.rst
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
====================
|
||||||
|
Administration guide
|
||||||
|
====================
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
3
doc/source/cli/index.rst
Normal file
3
doc/source/cli/index.rst
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
======================
|
||||||
|
Command Line Interface
|
||||||
|
======================
|
@ -1,7 +0,0 @@
|
|||||||
monasca_events_api
|
|
||||||
==================
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:maxdepth: 4
|
|
||||||
|
|
||||||
monasca_events_api
|
|
@ -1,8 +0,0 @@
|
|||||||
monasca\_events\_api\.conf package
|
|
||||||
==================================
|
|
||||||
|
|
||||||
.. automodule:: monasca_events_api.conf
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
@ -1,35 +0,0 @@
|
|||||||
monasca\_events\_api package
|
|
||||||
============================
|
|
||||||
|
|
||||||
.. automodule:: monasca_events_api
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
Subpackages
|
|
||||||
-----------
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
|
|
||||||
monasca_events_api.conf
|
|
||||||
|
|
||||||
Submodules
|
|
||||||
----------
|
|
||||||
|
|
||||||
monasca\_events\_api\.config module
|
|
||||||
-----------------------------------
|
|
||||||
|
|
||||||
.. automodule:: monasca_events_api.config
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
monasca\_events\_api\.version module
|
|
||||||
------------------------------------
|
|
||||||
|
|
||||||
.. automodule:: monasca_events_api.version
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
#
|
#
|
||||||
# monasca-events-api documentation build configuration file, created by
|
# monasca-events-app documentation build configuration file, created by
|
||||||
# sphinx-quickstart on Wed Nov 18 12:02:03 2015.
|
# sphinx-quickstart on Wed Nov 18 12:02:03 2015.
|
||||||
#
|
#
|
||||||
# This file is execfile()d with the current directory set to its
|
# This file is execfile()d with the current directory set to its
|
||||||
@ -19,7 +19,9 @@ from monasca_events_api.version import version_info
|
|||||||
|
|
||||||
sys.path = [
|
sys.path = [
|
||||||
os.path.abspath('../..'),
|
os.path.abspath('../..'),
|
||||||
os.path.abspath('../../bin')
|
os.path.abspath('../../bin'),
|
||||||
|
os.path.abspath('./'),
|
||||||
|
os.path.abspath('../')
|
||||||
] + sys.path
|
] + sys.path
|
||||||
|
|
||||||
# -- General configuration ------------------------------------------------
|
# -- General configuration ------------------------------------------------
|
||||||
@ -37,25 +39,30 @@ extensions = [
|
|||||||
'sphinx.ext.autodoc',
|
'sphinx.ext.autodoc',
|
||||||
'sphinx.ext.viewcode',
|
'sphinx.ext.viewcode',
|
||||||
'oslo_config.sphinxconfiggen',
|
'oslo_config.sphinxconfiggen',
|
||||||
|
'oslo_policy.sphinxpolicygen',
|
||||||
'oslo_config.sphinxext',
|
'oslo_config.sphinxext',
|
||||||
'openstackdocstheme',
|
'openstackdocstheme',
|
||||||
]
|
]
|
||||||
|
|
||||||
# geeneral information about project
|
# geeneral information about project
|
||||||
repository_name = u'openstack/monasca-events-api'
|
repository_name = u'openstack/monasca-events-api'
|
||||||
project = u'Monasca Events Dev Docs'
|
project = u'monasca'
|
||||||
version = version_info.version_string()
|
version = version_info.canonical_version_string()
|
||||||
release = version_info.release_string()
|
release = version_info.version_string_with_vcs()
|
||||||
bug_project = u'monasca-events-api'
|
bug_project = u'866'
|
||||||
bug_tag = u'doc'
|
bug_tag = u''
|
||||||
copyright = u'2017-present, OpenStack Foundation'
|
copyright = u'2017-present, OpenStack Foundation'
|
||||||
author = u'OpenStack Foundation'
|
author = u'OpenStack Foundation'
|
||||||
|
|
||||||
# sample config
|
# sample config
|
||||||
config_generator_config_file = [
|
config_generator_config_file = [
|
||||||
('config-generator/monasca-events-api.conf', '_static/events-api')
|
('config-generator/config.conf', '_static/events-api')
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# sample policy file
|
||||||
|
policy_generator_config_file = 'config-generator/policy.conf'
|
||||||
|
sample_policy_basename = '_static/events-api'
|
||||||
|
|
||||||
# Add any paths that contain templates here, relative to this directory.
|
# Add any paths that contain templates here, relative to this directory.
|
||||||
templates_path = ['_templates']
|
templates_path = ['_templates']
|
||||||
|
|
||||||
@ -194,7 +201,7 @@ html_use_modindex = True
|
|||||||
#html_search_scorer = 'scorer.js'
|
#html_search_scorer = 'scorer.js'
|
||||||
|
|
||||||
# Output file base name for HTML help builder.
|
# Output file base name for HTML help builder.
|
||||||
htmlhelp_basename = 'monasca-events-apidoc'
|
htmlhelp_basename = 'MonitoringEventsApiDoc'
|
||||||
|
|
||||||
# -- Options for LaTeX output ---------------------------------------------
|
# -- Options for LaTeX output ---------------------------------------------
|
||||||
|
|
||||||
@ -216,8 +223,8 @@ latex_elements = {
|
|||||||
# (source start file, target name, title,
|
# (source start file, target name, title,
|
||||||
# author, documentclass [howto, manual, or own class]).
|
# author, documentclass [howto, manual, or own class]).
|
||||||
latex_documents = [
|
latex_documents = [
|
||||||
(master_doc, 'monasca-events-api.tex', u'monasca-events-api Documentation',
|
(master_doc, 'MonitoringEventsApi.tex', u'Monasca Events Documentation',
|
||||||
u'Openstack Foundation \\textless{}monasca@lists.launchpad.net\\textgreater{}', 'manual'),
|
[author], 'manual'),
|
||||||
]
|
]
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to place at the top of
|
# The name of an image file (relative to this directory) to place at the top of
|
||||||
@ -246,37 +253,12 @@ latex_documents = [
|
|||||||
# One entry per manual page. List of tuples
|
# One entry per manual page. List of tuples
|
||||||
# (source start file, name, description, authors, manual section).
|
# (source start file, name, description, authors, manual section).
|
||||||
man_pages = [
|
man_pages = [
|
||||||
(master_doc, 'monasca-events-api', u'monasca-events-api Documentation',
|
(master_doc, 'monitoringeventsapi', u'Monasca Events Documentation',
|
||||||
[author], 1)
|
[author], 1)
|
||||||
]
|
]
|
||||||
|
|
||||||
# If true, show URL addresses after external links.
|
# If true, show URL addresses after external links.
|
||||||
#man_show_urls = False
|
#man_show_urls = False
|
||||||
|
|
||||||
|
|
||||||
# -- 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, 'monasca-events-api', u'monasca-events-api Documentation',
|
|
||||||
author, 'monasca-events-api', 'Rest-API to collect events from your cloud.',
|
|
||||||
'Miscellaneous'),
|
|
||||||
]
|
|
||||||
|
|
||||||
# Documents to append as an appendix to all manuals.
|
|
||||||
#texinfo_appendices = []
|
|
||||||
|
|
||||||
# If false, no module index is generated.
|
|
||||||
#texinfo_domain_indices = True
|
|
||||||
|
|
||||||
# How to display URL addresses: 'footnote', 'no', or 'inline'.
|
|
||||||
#texinfo_show_urls = 'footnote'
|
|
||||||
|
|
||||||
# If true, do not generate a @detailmenu in the "Top" node's menu.
|
|
||||||
#texinfo_no_detailmenu = False
|
|
||||||
|
|
||||||
|
|
||||||
# Example configuration for intersphinx: refer to the Python standard library.
|
# Example configuration for intersphinx: refer to the Python standard library.
|
||||||
intersphinx_mapping = {'https://doc.python.org/': None}
|
intersphinx_mapping = {'https://doc.python.org/': None}
|
3
doc/source/configuration/index.rst
Normal file
3
doc/source/configuration/index.rst
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
=============
|
||||||
|
Configuration
|
||||||
|
=============
|
3
doc/source/contributor/.gitignore
vendored
Normal file
3
doc/source/contributor/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# codebase documentation is autogenerated
|
||||||
|
# do not track it
|
||||||
|
api/
|
19
doc/source/contributor/code.rst
Normal file
19
doc/source/contributor/code.rst
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
.. _codedocs:
|
||||||
|
|
||||||
|
======================
|
||||||
|
Codebase documentation
|
||||||
|
======================
|
||||||
|
|
||||||
|
Following section contains codebase documentation generated with, a little
|
||||||
|
bit of assistance, `sphinx.ext.autodoc`_.
|
||||||
|
|
||||||
|
.. _`sphinx.ext.autodoc`: http://www.sphinx-doc.org/en/stable/ext/autodoc.html
|
||||||
|
|
||||||
|
Modules
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
api/autoindex.rst
|
||||||
|
|
1
doc/source/contributor/history.rst
Normal file
1
doc/source/contributor/history.rst
Normal file
@ -0,0 +1 @@
|
|||||||
|
.. include:: ../../../ChangeLog
|
37
doc/source/contributor/index.rst
Normal file
37
doc/source/contributor/index.rst
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
=======================
|
||||||
|
Contribution Guidelines
|
||||||
|
=======================
|
||||||
|
|
||||||
|
In the Contributions Guide, you will find documented policies for
|
||||||
|
developing with monasca-events-api. This includes the processes we use for
|
||||||
|
blueprints and specs, bugs, contributor on boarding, core reviewer
|
||||||
|
memberships, and other procedural items.
|
||||||
|
|
||||||
|
monasca-events-api, as with all OpenStack projects, is written with the
|
||||||
|
following design guidelines in mind:
|
||||||
|
|
||||||
|
* **Component based architecture**: Quickly add new behaviors
|
||||||
|
* **Highly available**: Scale to very serious workloads
|
||||||
|
* **Fault tolerant**: Isolated processes avoid cascading failures
|
||||||
|
* **Recoverable**: Failures should be easy to diagnose, debug, and rectify
|
||||||
|
* **Open standards**: Be a reference implementation for a community-driven api
|
||||||
|
|
||||||
|
This documentation is generated by the Sphinx toolkit and lives in the source
|
||||||
|
tree. Additional documentation on monasca-events-api and other components of
|
||||||
|
OpenStack can be found on the `OpenStack wiki <http://wiki.openstack.org>`_.
|
||||||
|
|
||||||
|
Developer reference
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 1
|
||||||
|
|
||||||
|
code
|
||||||
|
|
||||||
|
Changelog
|
||||||
|
---------
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 1
|
||||||
|
|
||||||
|
history
|
3
doc/source/glossary.rst
Normal file
3
doc/source/glossary.rst
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
========
|
||||||
|
Glossary
|
||||||
|
========
|
@ -45,4 +45,3 @@ any specific prior release.
|
|||||||
:maxdepth: 1
|
:maxdepth: 1
|
||||||
|
|
||||||
glossary
|
glossary
|
||||||
|
|
||||||
|
6
doc/source/install/index.rst
Normal file
6
doc/source/install/index.rst
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
============
|
||||||
|
Installation
|
||||||
|
============
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
6
doc/source/user/index.rst
Normal file
6
doc/source/user/index.rst
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
==========
|
||||||
|
User guide
|
||||||
|
==========
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
@ -0,0 +1,31 @@
|
|||||||
|
# Copyright 2017 FUJITSU LIMITED
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
[DEFAULT]
|
||||||
|
name = main
|
||||||
|
|
||||||
|
[composite:main]
|
||||||
|
use = egg:Paste#urlmap
|
||||||
|
/: ea_version
|
||||||
|
/v1.0: ea_version_v1
|
||||||
|
|
||||||
|
[pipeline:ea_version_v1]
|
||||||
|
pipeline = request_id auth
|
||||||
|
|
||||||
|
|
||||||
|
[filter:request_id]
|
||||||
|
paste.filter_factory = oslo_middleware.request_id:RequestId.factory
|
||||||
|
|
||||||
|
[filter:auth]
|
||||||
|
paste.filter_factory = keystonemiddleware.auth_token:filter_factory
|
0
monasca_events_api/app/__init__.py
Normal file
0
monasca_events_api/app/__init__.py
Normal file
0
monasca_events_api/app/core/__init__.py
Normal file
0
monasca_events_api/app/core/__init__.py
Normal file
41
monasca_events_api/app/core/request.py
Normal file
41
monasca_events_api/app/core/request.py
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
# Copyright 2017 FUJITSU LIMITED
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
import falcon
|
||||||
|
|
||||||
|
from oslo_context import context
|
||||||
|
|
||||||
|
from monasca_events_api import policy
|
||||||
|
|
||||||
|
|
||||||
|
class Request(falcon.Request):
|
||||||
|
"""Variation of falcon. Request with context.
|
||||||
|
|
||||||
|
Following class enhances :py:class:`falcon.Request` with
|
||||||
|
:py:class:`context.RequestContext`
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, env, options=None):
|
||||||
|
"""Init an Request class."""
|
||||||
|
super(Request, self).__init__(env, options)
|
||||||
|
self.is_admin = None
|
||||||
|
self.context = context.RequestContext.from_environ(self.env)
|
||||||
|
|
||||||
|
if self.is_admin is None:
|
||||||
|
self.is_admin = policy.check_is_admin(self)
|
||||||
|
|
||||||
|
def to_policy_values(self):
|
||||||
|
policy = self.context.to_policy_values()
|
||||||
|
policy['is_admin'] = self.is_admin
|
||||||
|
return policy
|
@ -15,18 +15,16 @@
|
|||||||
import os
|
import os
|
||||||
import pkgutil
|
import pkgutil
|
||||||
|
|
||||||
from oslo_config import cfg
|
|
||||||
from oslo_log import log
|
from oslo_log import log
|
||||||
from oslo_utils import importutils
|
from oslo_utils import importutils
|
||||||
|
|
||||||
CONF = cfg.CONF
|
|
||||||
LOG = log.getLogger(__name__)
|
LOG = log.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def load_conf_modules():
|
def load_conf_modules():
|
||||||
"""Load all modules that contain configuration.
|
"""Load all modules that contain configuration.
|
||||||
|
|
||||||
Method iterates over modules of :py:module:`monasca_log_api.conf`
|
Method iterates over modules of :py:mod:`monasca_events_api.conf`
|
||||||
and imports only those that contain following methods:
|
and imports only those that contain following methods:
|
||||||
|
|
||||||
- list_opts (required by oslo_config.genconfig)
|
- list_opts (required by oslo_config.genconfig)
|
||||||
@ -62,7 +60,7 @@ def _list_module_names():
|
|||||||
return module_names
|
return module_names
|
||||||
|
|
||||||
|
|
||||||
def register_opts():
|
def register_opts(conf):
|
||||||
"""Register all conf modules opts.
|
"""Register all conf modules opts.
|
||||||
|
|
||||||
This method allows different modules to register
|
This method allows different modules to register
|
||||||
@ -70,7 +68,7 @@ def register_opts():
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
for mod in load_conf_modules():
|
for mod in load_conf_modules():
|
||||||
mod.register_opts(CONF)
|
mod.register_opts(conf)
|
||||||
|
|
||||||
|
|
||||||
def list_opts():
|
def list_opts():
|
||||||
|
@ -12,12 +12,14 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
from oslo_config import cfg
|
||||||
from oslo_log import log
|
from oslo_log import log
|
||||||
|
from oslo_policy import opts as policy_opts
|
||||||
|
|
||||||
from monasca_events_api import conf
|
from monasca_events_api import conf
|
||||||
from monasca_events_api import version
|
from monasca_events_api import version
|
||||||
|
|
||||||
CONF = conf.CONF
|
CONF = cfg.CONF
|
||||||
LOG = log.getLogger(__name__)
|
LOG = log.getLogger(__name__)
|
||||||
|
|
||||||
_CONF_LOADED = False
|
_CONF_LOADED = False
|
||||||
@ -39,15 +41,17 @@ def parse_args():
|
|||||||
log.set_defaults()
|
log.set_defaults()
|
||||||
log.register_options(CONF)
|
log.register_options(CONF)
|
||||||
|
|
||||||
CONF(prog='events-api',
|
CONF(args=[],
|
||||||
|
prog='events-app',
|
||||||
project='monasca',
|
project='monasca',
|
||||||
version=version.version_str,
|
version=version.version_str,
|
||||||
description='RESTful API to collect events from cloud')
|
description='RESTful API to collect events from cloud')
|
||||||
|
|
||||||
log.setup(CONF,
|
log.setup(CONF,
|
||||||
product_name='monasca-events-api',
|
product_name='monasca-events-app',
|
||||||
version=version.version_str)
|
version=version.version_str)
|
||||||
|
|
||||||
conf.register_opts()
|
conf.register_opts(CONF)
|
||||||
|
policy_opts.set_defaults(CONF)
|
||||||
|
|
||||||
_CONF_LOADED = True
|
_CONF_LOADED = True
|
||||||
|
58
monasca_events_api/policies/__init__.py
Normal file
58
monasca_events_api/policies/__init__.py
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
# Copyright 2017 FUJITSU LIMITED
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
import os
|
||||||
|
import pkgutil
|
||||||
|
|
||||||
|
from oslo_log import log
|
||||||
|
from oslo_utils import importutils
|
||||||
|
|
||||||
|
LOG = log.getLogger(__name__)
|
||||||
|
_BASE_MOD_PATH = 'monasca_events_api.policies.'
|
||||||
|
|
||||||
|
|
||||||
|
def load_policy_modules():
|
||||||
|
"""Load all modules that contain policies.
|
||||||
|
|
||||||
|
Method iterates over modules of :py:mod:`monasca_events_api.policies`
|
||||||
|
and imports only those that contain following methods:
|
||||||
|
|
||||||
|
- list_opts (required by oslo_config.genconfig)
|
||||||
|
- register_opts (required by :py:currentmodule:)
|
||||||
|
|
||||||
|
"""
|
||||||
|
for modname in _list_module_names():
|
||||||
|
mod = importutils.import_module(_BASE_MOD_PATH + modname)
|
||||||
|
if hasattr(mod, 'list_rules'):
|
||||||
|
yield mod
|
||||||
|
|
||||||
|
|
||||||
|
def _list_module_names():
|
||||||
|
package_path = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
for _, modname, ispkg in pkgutil.iter_modules(path=[package_path]):
|
||||||
|
if not (modname == "opts" and ispkg):
|
||||||
|
yield modname
|
||||||
|
|
||||||
|
|
||||||
|
def list_rules():
|
||||||
|
"""List all policy modules rules.
|
||||||
|
|
||||||
|
Goes through all policy modules and yields their rules
|
||||||
|
|
||||||
|
"""
|
||||||
|
all_rules = []
|
||||||
|
for mod in load_policy_modules():
|
||||||
|
rules = mod.list_rules()
|
||||||
|
all_rules.extend(rules)
|
||||||
|
return all_rules
|
30
monasca_events_api/policies/admin.py
Normal file
30
monasca_events_api/policies/admin.py
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
# Copyright 2017 FUJITSU LIMITED
|
||||||
|
#
|
||||||
|
# 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 oslo_policy import policy
|
||||||
|
|
||||||
|
|
||||||
|
admin_rules = [
|
||||||
|
policy.DocumentedRuleDefault(
|
||||||
|
name='admin_required',
|
||||||
|
check_str='role:admin or is_admin:1',
|
||||||
|
description='Admin role',
|
||||||
|
operations=[{'path': '/', 'method': 'POST'}]
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def list_rules():
|
||||||
|
"""List policy rules for admin access."""
|
||||||
|
return admin_rules
|
30
monasca_events_api/policies/agent.py
Normal file
30
monasca_events_api/policies/agent.py
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
# Copyright 2017 FUJITSU LIMITED
|
||||||
|
#
|
||||||
|
# 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 oslo_policy import policy
|
||||||
|
|
||||||
|
|
||||||
|
agent_policies = [
|
||||||
|
policy.DocumentedRuleDefault(
|
||||||
|
name='events_api:agent_required',
|
||||||
|
check_str='role:monasca_events_agent',
|
||||||
|
description='Send events to api',
|
||||||
|
operations=[{'path': '/v1.0/events', 'method': 'POST'}]
|
||||||
|
)
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def list_rules():
|
||||||
|
"""List policies rules for agent access."""
|
||||||
|
return agent_policies
|
148
monasca_events_api/policy.py
Normal file
148
monasca_events_api/policy.py
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
# Copyright 2017 FUJITSU LIMITED
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
import copy
|
||||||
|
|
||||||
|
from oslo_config import cfg
|
||||||
|
from oslo_log import log
|
||||||
|
from oslo_policy import policy
|
||||||
|
|
||||||
|
from monasca_events_api import policies
|
||||||
|
|
||||||
|
CONF = cfg.CONF
|
||||||
|
LOG = log.getLogger(__name__)
|
||||||
|
|
||||||
|
_ENFORCER = None
|
||||||
|
# oslo_policy will read the policy configuration file again when the file
|
||||||
|
# is changed in runtime so the old policy rules will be saved to
|
||||||
|
# saved_file_rules and used to compare with new rules to determine the
|
||||||
|
# rules whether were updated.
|
||||||
|
saved_file_rules = []
|
||||||
|
|
||||||
|
|
||||||
|
def reset():
|
||||||
|
"""Reset Enforcer class."""
|
||||||
|
global _ENFORCER
|
||||||
|
if _ENFORCER:
|
||||||
|
_ENFORCER.clear()
|
||||||
|
_ENFORCER = None
|
||||||
|
|
||||||
|
|
||||||
|
def init(policy_file=None, rules=None, default_rule=None, use_conf=True):
|
||||||
|
"""Init an Enforcer class."""
|
||||||
|
global _ENFORCER
|
||||||
|
global saved_file_rules
|
||||||
|
|
||||||
|
if not _ENFORCER:
|
||||||
|
_ENFORCER = policy.Enforcer(CONF,
|
||||||
|
policy_file=policy_file,
|
||||||
|
rules=rules,
|
||||||
|
default_rule=default_rule,
|
||||||
|
use_conf=use_conf
|
||||||
|
)
|
||||||
|
register_rules(_ENFORCER)
|
||||||
|
_ENFORCER.load_rules()
|
||||||
|
# Only the rules which are loaded from file may be changed
|
||||||
|
current_file_rules = _ENFORCER.file_rules
|
||||||
|
current_file_rules = _serialize_rules(current_file_rules)
|
||||||
|
|
||||||
|
if saved_file_rules != current_file_rules:
|
||||||
|
saved_file_rules = copy.deepcopy(current_file_rules)
|
||||||
|
|
||||||
|
|
||||||
|
def _serialize_rules(rules):
|
||||||
|
"""Serialize all the Rule object as string.
|
||||||
|
|
||||||
|
New string is used to compare the rules list.
|
||||||
|
"""
|
||||||
|
result = [(rule_name, str(rule)) for rule_name, rule in rules.items()]
|
||||||
|
return sorted(result, key=lambda rule: rule[0])
|
||||||
|
|
||||||
|
|
||||||
|
def register_rules(enforcer):
|
||||||
|
"""Register default policy rules."""
|
||||||
|
rules = policies.list_rules()
|
||||||
|
enforcer.register_defaults(rules)
|
||||||
|
|
||||||
|
|
||||||
|
def authorize(context, action, target, do_raise=True):
|
||||||
|
"""Verify that the action is valid on the target in this context.
|
||||||
|
|
||||||
|
:param context: monasca-events-api context
|
||||||
|
:param action: String representing the action to be checked. This
|
||||||
|
should be colon separated for clarity.
|
||||||
|
:param target: Dictionary representing the object of the action for
|
||||||
|
object creation. This should be a dictionary representing
|
||||||
|
the location of the object e.g.
|
||||||
|
``{'project_id': 'context.project_id'}``
|
||||||
|
:param do_raise: if True (the default), raises PolicyNotAuthorized,
|
||||||
|
if False returns False
|
||||||
|
:type context: object
|
||||||
|
:type action: str
|
||||||
|
:type target: dict
|
||||||
|
:type do_raise: bool
|
||||||
|
:return: returns a non-False value (not necessarily True) if authorized,
|
||||||
|
and the False if not authorized and do_raise if False
|
||||||
|
|
||||||
|
:raises oslo_policy.policy.PolicyNotAuthorized: if verification fails
|
||||||
|
"""
|
||||||
|
init()
|
||||||
|
credentials = context.to_policy_values()
|
||||||
|
|
||||||
|
try:
|
||||||
|
result = _ENFORCER.authorize(action, target, credentials,
|
||||||
|
do_raise=do_raise, action=action)
|
||||||
|
return result
|
||||||
|
except policy.PolicyNotRegistered:
|
||||||
|
LOG.exception('Policy not registered')
|
||||||
|
raise
|
||||||
|
except Exception:
|
||||||
|
LOG.debug('Policy check for %(action)s failed with credentials '
|
||||||
|
'%(credentials)s',
|
||||||
|
{'action': action, 'credentials': credentials})
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
def check_is_admin(context):
|
||||||
|
"""Check if roles contains 'admin' role according to policy settings."""
|
||||||
|
init()
|
||||||
|
credentials = context.to_policy_values()
|
||||||
|
target = credentials
|
||||||
|
return _ENFORCER.authorize('admin_required', target, credentials)
|
||||||
|
|
||||||
|
|
||||||
|
def set_rules(rules, overwrite=True, use_conf=False): # pragma: no cover
|
||||||
|
"""Set rules based on the provided dict of rules.
|
||||||
|
|
||||||
|
Note:
|
||||||
|
Used in tests only.
|
||||||
|
|
||||||
|
:param rules: New rules to use. It should be an instance of dict
|
||||||
|
:param overwrite: Whether to overwrite current rules or update them
|
||||||
|
with the new rules.
|
||||||
|
:param use_conf: Whether to reload rules from config file.
|
||||||
|
"""
|
||||||
|
init(use_conf=False)
|
||||||
|
_ENFORCER.set_rules(rules, overwrite, use_conf)
|
||||||
|
|
||||||
|
|
||||||
|
def get_rules(): # pragma: no cover
|
||||||
|
"""Get policy rules.
|
||||||
|
|
||||||
|
Note:
|
||||||
|
Used in tests only.
|
||||||
|
|
||||||
|
"""
|
||||||
|
if _ENFORCER:
|
||||||
|
return _ENFORCER.rules
|
0
monasca_events_api/tests/__init__.py
Normal file
0
monasca_events_api/tests/__init__.py
Normal file
0
monasca_events_api/tests/functional/__init__.py
Normal file
0
monasca_events_api/tests/functional/__init__.py
Normal file
0
monasca_events_api/tests/unit/__init__.py
Normal file
0
monasca_events_api/tests/unit/__init__.py
Normal file
95
monasca_events_api/tests/unit/base.py
Normal file
95
monasca_events_api/tests/unit/base.py
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
# Copyright 2017 FUJITSU LIMITED
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
import fixtures
|
||||||
|
from oslo_config import cfg
|
||||||
|
from oslo_config import fixture as config_fixture
|
||||||
|
from oslo_context import fixture as oc_fixture
|
||||||
|
from oslo_log.fixture import logging_error as log_fixture
|
||||||
|
from oslo_serialization import jsonutils
|
||||||
|
from oslotest import base
|
||||||
|
|
||||||
|
from monasca_events_api import config
|
||||||
|
from monasca_events_api import policies
|
||||||
|
from monasca_events_api import policy
|
||||||
|
|
||||||
|
CONF = cfg.CONF
|
||||||
|
|
||||||
|
|
||||||
|
class ConfigFixture(config_fixture.Config):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(ConfigFixture, self).setUp()
|
||||||
|
self.addCleanup(self._clean_config_loaded_flag)
|
||||||
|
config.parse_args()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _clean_config_loaded_flag():
|
||||||
|
config._CONF_LOADED = False
|
||||||
|
|
||||||
|
|
||||||
|
class BaseTestCase(base.BaseTestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(BaseTestCase, self).setUp()
|
||||||
|
self.useFixture(fixtures.NestedTempfile())
|
||||||
|
self.useFixture(fixtures.TempHomeDir())
|
||||||
|
self.useFixture(log_fixture.get_logging_handle_error_fixture())
|
||||||
|
self.useFixture(ConfigFixture(CONF))
|
||||||
|
self.useFixture(oc_fixture.ClearRequestContext())
|
||||||
|
self.useFixture(PolicyFixture())
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def conf_override(**kw):
|
||||||
|
"""Override flag variables for a test."""
|
||||||
|
group = kw.pop('group', None)
|
||||||
|
for k, v in kw.items():
|
||||||
|
CONF.set_override(k, v, group)
|
||||||
|
|
||||||
|
|
||||||
|
class PolicyFixture(fixtures.Fixture):
|
||||||
|
"""Override the policy with a completely new policy file.
|
||||||
|
|
||||||
|
This overrides the policy with a completely fake and synthetic
|
||||||
|
policy file.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(PolicyFixture, self).setUp()
|
||||||
|
self._prepare_policy()
|
||||||
|
policy.reset()
|
||||||
|
policy.init()
|
||||||
|
self.addCleanup(policy.reset)
|
||||||
|
|
||||||
|
def _prepare_policy(self):
|
||||||
|
policy_dir = self.useFixture(fixtures.TempDir())
|
||||||
|
policy_file = os.path.join(policy_dir.path, 'policy.yaml')
|
||||||
|
|
||||||
|
# load the fake_policy data and add the missing default rules.
|
||||||
|
policy_rules = jsonutils.loads('{}')
|
||||||
|
self.add_missing_default_rules(policy_rules)
|
||||||
|
with open(policy_file, 'w') as f:
|
||||||
|
jsonutils.dump(policy_rules, f)
|
||||||
|
|
||||||
|
BaseTestCase.conf_override(policy_file=policy_file,
|
||||||
|
group='oslo_policy')
|
||||||
|
BaseTestCase.conf_override(policy_dirs=[], group='oslo_policy')
|
||||||
|
|
||||||
|
def add_missing_default_rules(self, rules):
|
||||||
|
for rule in policies.list_rules():
|
||||||
|
if rule.name not in rules:
|
||||||
|
rules[rule.name] = rule.check_str
|
149
monasca_events_api/tests/unit/test_policy.py
Normal file
149
monasca_events_api/tests/unit/test_policy.py
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
# Copyright 2017 FUJITSU LIMITED
|
||||||
|
#
|
||||||
|
# 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 falcon import testing
|
||||||
|
|
||||||
|
from oslo_context import context
|
||||||
|
from oslo_policy import policy as os_policy
|
||||||
|
|
||||||
|
from monasca_events_api.app.core import request
|
||||||
|
from monasca_events_api import policy
|
||||||
|
from monasca_events_api.tests.unit import base
|
||||||
|
|
||||||
|
|
||||||
|
class TestPolicyFileCase(base.BaseTestCase):
|
||||||
|
def setUp(self):
|
||||||
|
super(TestPolicyFileCase, self).setUp()
|
||||||
|
self.context = context.RequestContext(user='fake',
|
||||||
|
tenant='fake',
|
||||||
|
is_admin=False)
|
||||||
|
self.target = {'tenant_id': 'fake'}
|
||||||
|
|
||||||
|
def test_modified_policy_reloads(self):
|
||||||
|
tmp_file = \
|
||||||
|
self.create_tempfiles(files=[('policies', '{}')], ext='.yaml')[0]
|
||||||
|
base.BaseTestCase.conf_override(policy_file=tmp_file,
|
||||||
|
group='oslo_policy')
|
||||||
|
|
||||||
|
policy.reset()
|
||||||
|
policy.init()
|
||||||
|
|
||||||
|
action = 'example:test'
|
||||||
|
rule = os_policy.RuleDefault(action, '')
|
||||||
|
policy._ENFORCER.register_defaults([rule])
|
||||||
|
|
||||||
|
with open(tmp_file, 'w') as policy_file:
|
||||||
|
policy_file.write('{"example:test": ""}')
|
||||||
|
policy.authorize(self.context, action, self.target)
|
||||||
|
|
||||||
|
with open(tmp_file, 'w') as policy_file:
|
||||||
|
policy_file.write('{"example:test": "!"}')
|
||||||
|
policy._ENFORCER.load_rules(True)
|
||||||
|
self.assertRaises(os_policy.PolicyNotAuthorized, policy.authorize,
|
||||||
|
self.context, action, self.target)
|
||||||
|
|
||||||
|
|
||||||
|
class TestPolicyCase(base.BaseTestCase):
|
||||||
|
def setUp(self):
|
||||||
|
super(TestPolicyCase, self).setUp()
|
||||||
|
rules = [
|
||||||
|
os_policy.RuleDefault("true", "@"),
|
||||||
|
os_policy.RuleDefault("example:allowed", "@"),
|
||||||
|
os_policy.RuleDefault("example:denied", "!"),
|
||||||
|
os_policy.RuleDefault("example:lowercase_admin",
|
||||||
|
"role:admin or role:sysadmin"),
|
||||||
|
os_policy.RuleDefault("example:uppercase_admin",
|
||||||
|
"role:ADMIN or role:sysadmin"),
|
||||||
|
]
|
||||||
|
policy.reset()
|
||||||
|
policy.init()
|
||||||
|
policy._ENFORCER.register_defaults(rules)
|
||||||
|
|
||||||
|
def test_authorize_nonexist_action_throws(self):
|
||||||
|
action = "example:noexist"
|
||||||
|
ctx = request.Request(
|
||||||
|
testing.create_environ(
|
||||||
|
path="/",
|
||||||
|
headers={
|
||||||
|
"X_USER_ID": "fake",
|
||||||
|
"X_PROJECT_ID": "fake",
|
||||||
|
"X_ROLES": "member"
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
self.assertRaises(os_policy.PolicyNotRegistered, policy.authorize,
|
||||||
|
ctx, action, {})
|
||||||
|
|
||||||
|
def test_authorize_bad_action_throws(self):
|
||||||
|
action = "example:denied"
|
||||||
|
ctx = request.Request(
|
||||||
|
testing.create_environ(
|
||||||
|
path="/",
|
||||||
|
headers={
|
||||||
|
"X_USER_ID": "fake",
|
||||||
|
"X_PROJECT_ID": "fake",
|
||||||
|
"X_ROLES": "member"
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
self.assertRaises(os_policy.PolicyNotAuthorized, policy.authorize,
|
||||||
|
ctx, action, {})
|
||||||
|
|
||||||
|
def test_authorize_bad_action_no_exception(self):
|
||||||
|
action = "example:denied"
|
||||||
|
ctx = request.Request(
|
||||||
|
testing.create_environ(
|
||||||
|
path="/",
|
||||||
|
headers={
|
||||||
|
"X_USER_ID": "fake",
|
||||||
|
"X_PROJECT_ID": "fake",
|
||||||
|
"X_ROLES": "member"
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
result = policy.authorize(ctx, action, {}, False)
|
||||||
|
self.assertFalse(result)
|
||||||
|
|
||||||
|
def test_authorize_good_action(self):
|
||||||
|
action = "example:allowed"
|
||||||
|
ctx = request.Request(
|
||||||
|
testing.create_environ(
|
||||||
|
path="/",
|
||||||
|
headers={
|
||||||
|
"X_USER_ID": "fake",
|
||||||
|
"X_PROJECT_ID": "fake",
|
||||||
|
"X_ROLES": "member"
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
result = policy.authorize(ctx, action, False)
|
||||||
|
self.assertTrue(result)
|
||||||
|
|
||||||
|
def test_ignore_case_role_check(self):
|
||||||
|
lowercase_action = "example:lowercase_admin"
|
||||||
|
uppercase_action = "example:uppercase_admin"
|
||||||
|
|
||||||
|
admin_context = request.Request(
|
||||||
|
testing.create_environ(
|
||||||
|
path="/",
|
||||||
|
headers={
|
||||||
|
"X_USER_ID": "admin",
|
||||||
|
"X_PROJECT_ID": "fake",
|
||||||
|
"X_ROLES": "AdMiN"
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
self.assertTrue(policy.authorize(admin_context, lowercase_action,
|
||||||
|
{}))
|
||||||
|
self.assertTrue(policy.authorize(admin_context, uppercase_action,
|
||||||
|
{}))
|
68
monasca_events_api/tests/unit/test_request.py
Normal file
68
monasca_events_api/tests/unit/test_request.py
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
# Copyright 2017 FUJITSU LIMITED
|
||||||
|
#
|
||||||
|
# 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 falcon import testing
|
||||||
|
|
||||||
|
from monasca_events_api.app.core import request
|
||||||
|
from monasca_events_api.tests.unit import base
|
||||||
|
|
||||||
|
|
||||||
|
class TestRequest(base.BaseTestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(TestRequest, self).setUp()
|
||||||
|
|
||||||
|
def test_use_context_from_request(self):
|
||||||
|
req = request.Request(
|
||||||
|
testing.create_environ(
|
||||||
|
path='/',
|
||||||
|
headers={
|
||||||
|
'X_AUTH_TOKEN': '1111',
|
||||||
|
'X_USER_ID': '2222',
|
||||||
|
'X_PROJECT_ID': '3333',
|
||||||
|
'X_ROLES': 'goku,vegeta'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
self.assertEqual('1111', req.context.auth_token)
|
||||||
|
self.assertEqual('2222', req.context.user_id)
|
||||||
|
self.assertEqual('3333', req.context.project_id)
|
||||||
|
self.assertItemsEqual(['goku', 'vegeta'], req.context.roles)
|
||||||
|
|
||||||
|
def test_check_is_admin_from_request(self):
|
||||||
|
req = request.Request(
|
||||||
|
testing.create_environ(
|
||||||
|
path='/',
|
||||||
|
headers={
|
||||||
|
'X_USER_ID': '2222',
|
||||||
|
'X_PROJECT_ID': '3333',
|
||||||
|
'X_ROLES': 'admin,burger'
|
||||||
|
}
|
||||||
|
),
|
||||||
|
|
||||||
|
)
|
||||||
|
self.assertTrue(req.is_admin)
|
||||||
|
|
||||||
|
def test_request_context_admin_uppercase(self):
|
||||||
|
req = request.Request(
|
||||||
|
testing.create_environ(
|
||||||
|
path='/',
|
||||||
|
headers={
|
||||||
|
'X_USER_ID': '1111',
|
||||||
|
'X_PROJECT_ID': '2222',
|
||||||
|
'X_ROLES': 'Admin,bob'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
self.assertTrue(req.is_admin)
|
@ -14,5 +14,5 @@
|
|||||||
|
|
||||||
import pbr.version
|
import pbr.version
|
||||||
|
|
||||||
version_info = pbr.version.VersionInfo('monasca-events-api')
|
version_info = pbr.version.VersionInfo('monasca-events-app')
|
||||||
version_str = version_info.version_string()
|
version_str = version_info.version_string()
|
||||||
|
9
releasenotes/notes/add_policies-24ddd2a505f3de6c.yaml
Normal file
9
releasenotes/notes/add_policies-24ddd2a505f3de6c.yaml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
Initial implementation of oslo.policies.
|
||||||
|
|
||||||
|
other:
|
||||||
|
- |
|
||||||
|
Add posibility to generate documentation with oslo-config-generator.
|
@ -11,6 +11,8 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
|
from monasca_events_api.version import version_info
|
||||||
|
|
||||||
# -- General configuration ------------------------------------------------
|
# -- General configuration ------------------------------------------------
|
||||||
|
|
||||||
# If your documentation needs a minimal Sphinx version, state it here.
|
# If your documentation needs a minimal Sphinx version, state it here.
|
||||||
@ -38,18 +40,13 @@ master_doc = 'index'
|
|||||||
|
|
||||||
# General information about the project.
|
# General information about the project.
|
||||||
repository_name = u'openstack/monasca-events-api'
|
repository_name = u'openstack/monasca-events-api'
|
||||||
project = u'Monasca Events Release Notes'
|
project = u'Openstack Monitoring Release Notes'
|
||||||
bug_project = u'monasca-events-api'
|
|
||||||
bug_tag = u'releasenotes'
|
|
||||||
copyright = u'2014, OpenStack Foundation'
|
|
||||||
|
|
||||||
# The version info for the project you're documenting, acts as replacement for
|
|
||||||
# |version| and |release|, also used in various other places throughout the
|
|
||||||
# built documents.
|
|
||||||
#
|
|
||||||
from monasca_events_api.version import version_info
|
|
||||||
version = version_info.canonical_version_string()
|
version = version_info.canonical_version_string()
|
||||||
release = version_info.version_string_with_vcs()
|
release = version_info.version_string_with_vcs()
|
||||||
|
bug_project = u'866'
|
||||||
|
bug_tag = u''
|
||||||
|
copyright = u'2014-present, OpenStack Foundation'
|
||||||
|
author = u'OpenStack Foundation'
|
||||||
|
|
||||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
# for a list of supported languages.
|
# for a list of supported languages.
|
||||||
@ -172,8 +169,7 @@ html_last_updated_fmt = '%Y-%m-%d %H:%M'
|
|||||||
# html_file_suffix = None
|
# html_file_suffix = None
|
||||||
|
|
||||||
# Output file base name for HTML help builder.
|
# Output file base name for HTML help builder.
|
||||||
htmlhelp_basename = 'MonascaEventsApiReleaseNotesdoc'
|
htmlhelp_basename = 'MonitoringEventsApiReleaseNotesDoc'
|
||||||
|
|
||||||
|
|
||||||
# -- Options for LaTeX output ---------------------------------------------
|
# -- Options for LaTeX output ---------------------------------------------
|
||||||
|
|
||||||
@ -191,11 +187,11 @@ latex_elements = {
|
|||||||
# Grouping the document tree into LaTeX files. List of tuples
|
# Grouping the document tree into LaTeX files. List of tuples
|
||||||
# (source start file, target name, title,
|
# (source start file, target name, title,
|
||||||
# author, documentclass [howto, manual, or own class]).
|
# author, documentclass [howto, manual, or own class]).
|
||||||
latex_documents = [
|
latex_documents = [(
|
||||||
('index', 'MonascaEventsApiReleaseNotes.tex',
|
master_doc, 'MonitoringEventsApiReleaseNotes.tex',
|
||||||
u'MonascaEventsApi Release Notes Documentation', u'OpenStack Foundation',
|
u'Openstack Monitoring Events API Release Notes Documentation', [author],
|
||||||
'manual'),
|
'manual'
|
||||||
]
|
)]
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to place at the top of
|
# The name of an image file (relative to this directory) to place at the top of
|
||||||
# the title page.
|
# the title page.
|
||||||
@ -223,36 +219,10 @@ latex_documents = [
|
|||||||
# One entry per manual page. List of tuples
|
# One entry per manual page. List of tuples
|
||||||
# (source start file, name, description, authors, manual section).
|
# (source start file, name, description, authors, manual section).
|
||||||
man_pages = [
|
man_pages = [
|
||||||
('index', 'barbicanreleasenotes', u'MonascaEventsApi Release Notes Documentation',
|
(master_doc, 'monitoringeventsapireleasenotes',
|
||||||
[u'OpenStack Foundation'], 1)
|
u'Openstack Monitoring Events API Release Notes', [author],
|
||||||
|
1)
|
||||||
]
|
]
|
||||||
|
|
||||||
# If true, show URL addresses after external links.
|
|
||||||
# man_show_urls = False
|
|
||||||
|
|
||||||
|
|
||||||
# -- 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 = [
|
|
||||||
('index', 'MonascaEventsApiReleaseNotes', u'MonascaEventsApi Release Notes Documentation',
|
|
||||||
u'OpenStack Foundation', 'MonascaEventsApiReleaseNotes',
|
|
||||||
'MonascaEventsApi Release Notes Documentation.', 'Miscellaneous'),
|
|
||||||
]
|
|
||||||
|
|
||||||
# Documents to append as an appendix to all manuals.
|
|
||||||
# texinfo_appendices = []
|
|
||||||
|
|
||||||
# If false, no module index is generated.
|
|
||||||
# texinfo_domain_indices = True
|
|
||||||
|
|
||||||
# How to display URL addresses: 'footnote', 'no', or 'inline'.
|
|
||||||
# texinfo_show_urls = 'footnote'
|
|
||||||
|
|
||||||
# If true, do not generate a @detailmenu in the "Top" node's menu.
|
|
||||||
# texinfo_no_detailmenu = False
|
|
||||||
|
|
||||||
# -- Options for Internationalization output ------------------------------
|
# -- Options for Internationalization output ------------------------------
|
||||||
locale_dirs = ['locale/']
|
locale_dirs = ['locale/']
|
||||||
|
@ -10,7 +10,8 @@ oslo.config!=4.3.0,!=4.4.0,>=4.0.0 # Apache-2.0
|
|||||||
oslo.context>=2.14.0 # Apache-2.0
|
oslo.context>=2.14.0 # Apache-2.0
|
||||||
oslo.middleware>=3.27.0 # Apache-2.0
|
oslo.middleware>=3.27.0 # Apache-2.0
|
||||||
oslo.log>=3.22.0 # Apache-2.0
|
oslo.log>=3.22.0 # Apache-2.0
|
||||||
oslo.serialization>=1.10.0 # Apache-2.0
|
oslo.policy>=1.23.0 # Apache-2.0
|
||||||
|
oslo.serialization>=1.10.0,!=2.19.1 # Apache-2.0
|
||||||
oslo.utils>=3.20.0 # Apache-2.0
|
oslo.utils>=3.20.0 # Apache-2.0
|
||||||
PasteDeploy>=1.5.0 # MIT
|
PasteDeploy>=1.5.0 # MIT
|
||||||
eventlet!=0.18.3,!=0.20.1,<0.21.0,>=0.18.2 # MIT
|
eventlet!=0.18.3,!=0.20.1,<0.21.0,>=0.18.2 # MIT
|
||||||
|
19
setup.cfg
19
setup.cfg
@ -36,21 +36,25 @@ data_files =
|
|||||||
oslo.config.opts =
|
oslo.config.opts =
|
||||||
events.api = monasca_events_api.conf:list_opts
|
events.api = monasca_events_api.conf:list_opts
|
||||||
|
|
||||||
|
oslo.policy.policies =
|
||||||
|
events.api = monasca_events_api.policies:list_rules
|
||||||
|
|
||||||
[build_sphinx]
|
[build_sphinx]
|
||||||
all_files = 1
|
all_files = 1
|
||||||
build-dir = doc/build
|
build-dir = doc/build
|
||||||
source-dir = doc/source
|
source-dir = doc/source
|
||||||
|
warning-is-error = 1
|
||||||
[build_apiguide]
|
|
||||||
all_files = 1
|
|
||||||
build-dir = api-guide/build
|
|
||||||
source-dir = api-guide/source
|
|
||||||
|
|
||||||
[build_apiref]
|
[build_apiref]
|
||||||
all_files = 1
|
all_files = 1
|
||||||
build-dir = api-ref/build
|
build-dir = api-ref/build
|
||||||
source-dir = api-ref/source
|
source-dir = api-ref/source
|
||||||
|
|
||||||
|
[build_releasenotes]
|
||||||
|
all_files = 1
|
||||||
|
build-dir = releasenotes/build
|
||||||
|
source-dir = releasenotes/source
|
||||||
|
|
||||||
[egg_info]
|
[egg_info]
|
||||||
tag_build =
|
tag_build =
|
||||||
tag_date = 0
|
tag_date = 0
|
||||||
@ -60,4 +64,7 @@ tag_svn_revision = 0
|
|||||||
universal = 1
|
universal = 1
|
||||||
|
|
||||||
[pbr]
|
[pbr]
|
||||||
warnerrors = True
|
autodoc_index_modules = True
|
||||||
|
autodoc_exclude_modules =
|
||||||
|
monasca_events_api.tests.*
|
||||||
|
api_doc_dir = contributor/api
|
@ -4,7 +4,6 @@
|
|||||||
|
|
||||||
# Install bounded pep8/pyflakes first, then let flake8 install
|
# Install bounded pep8/pyflakes first, then let flake8 install
|
||||||
hacking!=0.13.0,<0.14,>=0.12.0 # Apache-2.0
|
hacking!=0.13.0,<0.14,>=0.12.0 # Apache-2.0
|
||||||
flake8-docstrings==0.2.1.post1 # MIT
|
|
||||||
flake8-import-order==0.12 # LGPLv3
|
flake8-import-order==0.12 # LGPLv3
|
||||||
bandit>=1.1.0 # Apache-2.0
|
bandit>=1.1.0 # Apache-2.0
|
||||||
bashate>=0.2 # Apache-2.0
|
bashate>=0.2 # Apache-2.0
|
||||||
@ -21,4 +20,4 @@ doc8 # Apache-2.0
|
|||||||
sphinx>=1.6.2 # BSD
|
sphinx>=1.6.2 # BSD
|
||||||
os-api-ref>=1.0.0 # Apache-2.0
|
os-api-ref>=1.0.0 # Apache-2.0
|
||||||
reno!=2.3.1,>=1.8.0 # Apache-2.0
|
reno!=2.3.1,>=1.8.0 # Apache-2.0
|
||||||
openstackdocstheme>=1.11.0 # Apache-2.0
|
openstackdocstheme>=1.16.0 # Apache-2.0
|
||||||
|
33
tox.ini
33
tox.ini
@ -6,14 +6,14 @@ skipsdist = True
|
|||||||
[testenv]
|
[testenv]
|
||||||
usedevelop = True
|
usedevelop = True
|
||||||
setenv = VIRTUAL_ENV={envdir}
|
setenv = VIRTUAL_ENV={envdir}
|
||||||
OS_TEST_PATH=monasca_events_api/tests
|
OS_TEST_PATH=monasca_events_api/tests/unit
|
||||||
CLIENT_NAME=monasca-events-api
|
CLIENT_NAME=monasca-events-api
|
||||||
passenv = *_proxy
|
passenv = *_proxy
|
||||||
*_PROXY
|
*_PROXY
|
||||||
whitelist_externals = bash
|
whitelist_externals = bash
|
||||||
find
|
find
|
||||||
rm
|
rm
|
||||||
install_command = {toxinidir}/tools/tox_install.sh {env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt} {opts} {packages}
|
install_command = {toxinidir}/tools/tox_install.sh {env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt?master} {opts} {packages}
|
||||||
deps = -r{toxinidir}/test-requirements.txt
|
deps = -r{toxinidir}/test-requirements.txt
|
||||||
commands =
|
commands =
|
||||||
find ./ -type f -name '*.pyc' -delete
|
find ./ -type f -name '*.pyc' -delete
|
||||||
@ -46,7 +46,7 @@ commands =
|
|||||||
description = Allows to run unit-test with debug mode enabled
|
description = Allows to run unit-test with debug mode enabled
|
||||||
commands =
|
commands =
|
||||||
{[testenv]commands}
|
{[testenv]commands}
|
||||||
oslo_debug_helper -t {toxinidir}/monasca_events_api/tests {posargs}
|
oslo_debug_helper -t {env:OS_TEST_PATH} {posargs}
|
||||||
|
|
||||||
[testenv:bashate]
|
[testenv:bashate]
|
||||||
description = Validates (pep8-like) devstack plugins
|
description = Validates (pep8-like) devstack plugins
|
||||||
@ -76,20 +76,12 @@ commands =
|
|||||||
{[testenv:checkniceness]commands}
|
{[testenv:checkniceness]commands}
|
||||||
|
|
||||||
[testenv:docs]
|
[testenv:docs]
|
||||||
description = Builds api-ref, api-guide, releasenotes and devdocs
|
description = Builds api-ref, releasenotes and devdocs
|
||||||
commands =
|
commands =
|
||||||
{[testenv:devdocs]commands}
|
{[testenv:devdocs]commands}
|
||||||
{[testenv:api-guide]commands}
|
|
||||||
{[testenv:api-ref]commands}
|
{[testenv:api-ref]commands}
|
||||||
{[testenv:releasenotes]commands}
|
{[testenv:releasenotes]commands}
|
||||||
|
|
||||||
[testenv:api-guide]
|
|
||||||
description = Called from CI scripts to test and publish the API Guide
|
|
||||||
commands =
|
|
||||||
rm -rf api-guide/build
|
|
||||||
{[testenv:checkjson]commands}
|
|
||||||
sphinx-build -W -b html -d api-guide/build/doctrees api-guide/source api-guide/build/html
|
|
||||||
|
|
||||||
[testenv:api-ref]
|
[testenv:api-ref]
|
||||||
description = Called from CI scripts to test and publish the API Ref
|
description = Called from CI scripts to test and publish the API Ref
|
||||||
commands =
|
commands =
|
||||||
@ -107,16 +99,9 @@ commands =
|
|||||||
description = Builds developer documentation
|
description = Builds developer documentation
|
||||||
commands =
|
commands =
|
||||||
rm -rf doc/build
|
rm -rf doc/build
|
||||||
{[testenv:codedocs]commands}
|
|
||||||
{[testenv:checkjson]commands}
|
{[testenv:checkjson]commands}
|
||||||
python setup.py build_sphinx
|
python setup.py build_sphinx
|
||||||
|
|
||||||
[testenv:codedocs]
|
|
||||||
description = Generates codebase documentation
|
|
||||||
commands =
|
|
||||||
rm -rf doc/source/code
|
|
||||||
sphinx-apidoc -o doc/source/code -fPM {toxinidir}/monasca_events_api --ext-todo
|
|
||||||
|
|
||||||
[testenv:checkniceness]
|
[testenv:checkniceness]
|
||||||
description = Validates (pep-like) documentation
|
description = Validates (pep-like) documentation
|
||||||
skip_install = True
|
skip_install = True
|
||||||
@ -124,7 +109,6 @@ usedevelop = False
|
|||||||
commands =
|
commands =
|
||||||
doc8 --file-encoding utf-8 {toxinidir}/doc
|
doc8 --file-encoding utf-8 {toxinidir}/doc
|
||||||
doc8 --file-encoding utf-8 {toxinidir}/api-ref
|
doc8 --file-encoding utf-8 {toxinidir}/api-ref
|
||||||
doc8 --file-encoding utf-8 {toxinidir}/api-guide
|
|
||||||
doc8 --file-encoding utf-8 {toxinidir}/releasenotes
|
doc8 --file-encoding utf-8 {toxinidir}/releasenotes
|
||||||
|
|
||||||
[testenv:checkjson]
|
[testenv:checkjson]
|
||||||
@ -139,13 +123,18 @@ commands =
|
|||||||
|
|
||||||
[testenv:genconfig]
|
[testenv:genconfig]
|
||||||
description = Generates sample documentation file for monasca-events-api
|
description = Generates sample documentation file for monasca-events-api
|
||||||
commands = oslo-config-generator --config-file=config-generator/monasca-events-api.conf
|
commands = oslo-config-generator --config-file=config-generator/config.conf
|
||||||
|
|
||||||
|
[testenv:genpolicy]
|
||||||
|
description = Generates sample policy.yaml file for monasca-events-api
|
||||||
|
commands = oslopolicy-sample-generator --config-file=config-generator/policy.conf
|
||||||
|
|
||||||
[testenv:venv]
|
[testenv:venv]
|
||||||
commands = {posargs}
|
commands = {posargs}
|
||||||
|
|
||||||
[flake8]
|
[flake8]
|
||||||
exclude = .git,.gitignore,.tox,dist,doc,api-ref,api-guide,releasenotes,documentation,*.egg,build
|
exclude = .git,.gitignore,.tox,dist,doc,api-ref,releasenotes,*.egg,build,
|
||||||
|
__pycache__
|
||||||
show-source = True
|
show-source = True
|
||||||
enable-extensions = H203,H106
|
enable-extensions = H203,H106
|
||||||
ignore = D100,D104
|
ignore = D100,D104
|
||||||
|
Loading…
x
Reference in New Issue
Block a user