From 345e6d4a5ebc7779d0986bdd349af6fab6ef7f62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Rossigneux?= Date: Sat, 13 Jul 2013 00:49:40 +0200 Subject: [PATCH] Add documentation and migrate to PBR. Change-Id: I496965ddca3bfd140d82a81e8b1d83124e91f1ba --- .gitignore | 1 + CONTRIBUTING.rst | 17 + LICENSE | 176 +++++++ MANIFEST.in | 6 +- README | 5 - README.rst | 8 + bin/kwapi-api | 41 -- bin/kwapi-drivers | 40 -- bin/kwapi-rrd | 39 -- doc/Makefile | 157 +++++++ doc/source/_templates/.placeholder | 0 doc/source/architecture.rst | 202 +++++++++ doc/source/bus.png | Bin 0 -> 46099 bytes doc/source/collector.png | Bin 0 -> 7024 bytes doc/source/conf.py | 419 +++++++++++++++++ doc/source/configuration.rst | 161 +++++++ doc/source/contributing/areas.rst | 39 ++ doc/source/contributing/index.rst | 25 + doc/source/contributing/resources.rst | 29 ++ doc/source/contributing/source.rst | 55 +++ doc/source/contributing/user.rst | 45 ++ doc/source/glossary.rst | 36 ++ doc/source/index.rst | 65 +++ doc/source/install.rst | 50 ++ doc/source/layered_architecture.png | Bin 0 -> 10348 bytes doc/source/message_format.png | Bin 0 -> 4438 bytes doc/source/webpage.png | Bin 0 -> 272207 bytes kwapi/drivers/driver_manager.py | 19 + bin/kwapi-forwarder => kwapi/forwarder.py | 3 +- kwapi/openstack/common/excutils.py | 98 ++++ kwapi/openstack/common/fileutils.py | 110 +++++ kwapi/openstack/common/gettextutils.py | 230 +++++++++- kwapi/openstack/common/importutils.py | 68 +++ kwapi/openstack/common/jsonutils.py | 65 ++- kwapi/openstack/common/local.py | 2 +- kwapi/openstack/common/log.py | 138 ++++-- kwapi/openstack/common/notifier/__init__.py | 14 - kwapi/openstack/common/notifier/api.py | 183 -------- .../openstack/common/notifier/log_notifier.py | 35 -- .../common/notifier/no_op_notifier.py | 19 - .../common/notifier/rabbit_notifier.py | 29 -- .../openstack/common/notifier/rpc_notifier.py | 46 -- .../common/notifier/rpc_notifier2.py | 52 --- .../common/notifier/test_notifier.py | 22 - kwapi/openstack/common/policy.py | 429 ++++++++++-------- kwapi/openstack/common/setup.py | 359 --------------- kwapi/openstack/common/timeutils.py | 46 +- kwapi/plugins/api/app.py | 16 + kwapi/plugins/rrd/app.py | 20 + kwapi/policy.py | 12 - openstack-common.conf | 7 +- pip-requires => requirements.txt | 5 +- setup.cfg | 39 ++ setup.py | 50 +- tox.ini | 2 +- 55 files changed, 2514 insertions(+), 1220 deletions(-) create mode 100644 CONTRIBUTING.rst create mode 100644 LICENSE delete mode 100644 README create mode 100644 README.rst delete mode 100755 bin/kwapi-api delete mode 100755 bin/kwapi-drivers delete mode 100755 bin/kwapi-rrd create mode 100644 doc/Makefile create mode 100644 doc/source/_templates/.placeholder create mode 100644 doc/source/architecture.rst create mode 100644 doc/source/bus.png create mode 100644 doc/source/collector.png create mode 100644 doc/source/conf.py create mode 100644 doc/source/configuration.rst create mode 100644 doc/source/contributing/areas.rst create mode 100644 doc/source/contributing/index.rst create mode 100644 doc/source/contributing/resources.rst create mode 100644 doc/source/contributing/source.rst create mode 100644 doc/source/contributing/user.rst create mode 100644 doc/source/glossary.rst create mode 100644 doc/source/index.rst create mode 100644 doc/source/install.rst create mode 100644 doc/source/layered_architecture.png create mode 100644 doc/source/message_format.png create mode 100644 doc/source/webpage.png rename bin/kwapi-forwarder => kwapi/forwarder.py (97%) create mode 100644 kwapi/openstack/common/excutils.py create mode 100644 kwapi/openstack/common/fileutils.py create mode 100644 kwapi/openstack/common/importutils.py delete mode 100644 kwapi/openstack/common/notifier/__init__.py delete mode 100644 kwapi/openstack/common/notifier/api.py delete mode 100644 kwapi/openstack/common/notifier/log_notifier.py delete mode 100644 kwapi/openstack/common/notifier/no_op_notifier.py delete mode 100644 kwapi/openstack/common/notifier/rabbit_notifier.py delete mode 100644 kwapi/openstack/common/notifier/rpc_notifier.py delete mode 100644 kwapi/openstack/common/notifier/rpc_notifier2.py delete mode 100644 kwapi/openstack/common/notifier/test_notifier.py delete mode 100644 kwapi/openstack/common/setup.py rename pip-requires => requirements.txt (61%) create mode 100644 setup.cfg diff --git a/.gitignore b/.gitignore index ec91120..834401e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *.pyc *.egg-info .tox +doc/source/sourcecode diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst new file mode 100644 index 0000000..0b24608 --- /dev/null +++ b/CONTRIBUTING.rst @@ -0,0 +1,17 @@ +If you would like to contribute to the development of OpenStack, +you must follow the steps in the "If you're a developer, start here" +section of this page: + + http://wiki.openstack.org/HowToContribute + +Once those steps have been completed, changes to OpenStack +should be submitted for review via the Gerrit tool, following +the workflow documented at: + + http://wiki.openstack.org/GerritWorkflow + +Pull requests submitted through GitHub will be ignored. + +Bugs should be filed on Launchpad, not GitHub: + + https://bugs.launchpad.net/kwapi diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..68c771a --- /dev/null +++ b/LICENSE @@ -0,0 +1,176 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + diff --git a/MANIFEST.in b/MANIFEST.in index 18bfdc0..fd1306a 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1 +1,5 @@ -include etc/kwapi/*.conf +include AUTHORS +include CONTRIBUTING.rst +exclude .gitignore +exclude .gitreview +global-exclude *.pyc diff --git a/README b/README deleted file mode 100644 index 2de5f63..0000000 --- a/README +++ /dev/null @@ -1,5 +0,0 @@ -Energy Efficiency Architecture for XLcloud project. - -Blueprint: http://www.xlcloud.org/bin/view/XLcloudProjectManagement/EEA - -License: Apache. diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..3091678 --- /dev/null +++ b/README.rst @@ -0,0 +1,8 @@ +Kwapi +===== + +Documentation for the project can be found at: + https://kwapi.readthedocs.org + +The project home is at: + http://launchpad.net/kwapi diff --git a/bin/kwapi-api b/bin/kwapi-api deleted file mode 100755 index 05d61ce..0000000 --- a/bin/kwapi-api +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Author: François Rossigneux -# -# 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 sys - -from oslo.config import cfg - -from kwapi.plugins.api import app -from kwapi.openstack.common import log - -app_opts = [ - cfg.IntOpt('api_port', - required=True, - ), -] - -cfg.CONF.register_opts(app_opts) - -if __name__ == '__main__': - cfg.CONF(sys.argv[1:], - project='kwapi', - default_config_files=['/etc/kwapi/api.conf'] - ) - log.setup('kwapi') - log.setup('keystoneclient') - root = app.make_app() - root.run(host='0.0.0.0', port=cfg.CONF.api_port) diff --git a/bin/kwapi-drivers b/bin/kwapi-drivers deleted file mode 100755 index a20ee01..0000000 --- a/bin/kwapi-drivers +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Author: François Rossigneux -# -# 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 sys -import signal - -from oslo.config import cfg - -from kwapi.drivers import driver_manager -from kwapi.openstack.common import log - -if __name__ == "__main__": - cfg.CONF(sys.argv[1:], - project='kwapi', - default_config_files=['/etc/kwapi/drivers.conf']) - log.setup('kwapi') - - driver_manager.start_zmq_server() - driver_manager.load_all_drivers() - driver_manager.check_drivers_alive() - - signal.signal(signal.SIGTERM, driver_manager.signal_handler) - try: - signal.pause() - except KeyboardInterrupt: - driver_manager.terminate() diff --git a/bin/kwapi-rrd b/bin/kwapi-rrd deleted file mode 100755 index 5e73182..0000000 --- a/bin/kwapi-rrd +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Author: François Rossigneux -# -# 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 sys - -from oslo.config import cfg - -from kwapi.plugins.rrd import app -from kwapi.openstack.common import log - -app_opts = [ - cfg.IntOpt('rrd_port', - required=True, - ), -] - -cfg.CONF.register_opts(app_opts) - -if __name__ == '__main__': - cfg.CONF(sys.argv[1:], - project='kwapi', - default_config_files=['/etc/kwapi/rrd.conf']) - log.setup('kwapi') - root = app.make_app() - root.run(host='0.0.0.0', port=cfg.CONF.rrd_port) diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 0000000..811013e --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,157 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + +html: check-dependencies + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +.PHONY: check-dependencies +check-dependencies: + @python -c 'import sphinxcontrib.autohttp.flask' >/dev/null 2>&1 || (echo "ERROR: Missing Sphinx dependencies. Run: pip install sphinxcontrib-httpdomain" && exit 1) + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Kwapi.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Kwapi.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/Kwapi" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Kwapi" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." diff --git a/doc/source/_templates/.placeholder b/doc/source/_templates/.placeholder new file mode 100644 index 0000000..e69de29 diff --git a/doc/source/architecture.rst b/doc/source/architecture.rst new file mode 100644 index 0000000..cd3644a --- /dev/null +++ b/doc/source/architecture.rst @@ -0,0 +1,202 @@ +.. + Copyright 2013 François Rossigneux (Inria) + + 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. + +.. _architecture: + +=================== +System Architecture +=================== + +Overview of the global layered architecture: + +.. image:: ./layered_architecture.png + +Kwapi drivers +============= + +Kwapi supports different kinds of wattmeters (IPMI, Eaton PDU, Wattsup, etc). +Wattmeters communicate via IP networks or serial links. Each wattmeter has one +or more sensors (probes). Wattmeters send their values quite often (each +second), and they are listen by wattmeter drivers. Wattmeter drivers are +derived from a Driver superclass, itself derived from Thread. So drivers are +threads. At least one driver thread is instantiated for each wattmeter. Their +constructors takes as arguments a list of probe IDs, and kwargs (specific +arguments). + +Driver threads roles are: + +#. Setting up wattmeter. +#. Listening and decoding received data. +#. Calling a driver superclass method with measurements as argument. + This method appends signature to the measurements, and publishes them on the bus. + +Message format: + +.. image:: ./message_format.png + :width: 675px + +Driver manager +-------------- + +The driver manager is the loader and the checker of driver threads. It loads +all drivers according the configuration file, and checks regularly that driver +threads are alive. In case of crash, the event is logged and the driver thread +is reloaded. We can imagine that a driver will crash if a technician unplug a +wattmeter, for example. + +Bus +--- + +Currently, the internal Kwapi bus is ZeroMQ. Publishers are driver threads, and +subscribers are plugins. + +Kwapi plugins +============= + +Kwapi API plugin +---------------- + +API plugin allows Ceilometer pollster to get consumption data through a REST +API. This plugin contains a collector that computes kWh, and an API based on +Flask. + +Collector +^^^^^^^^^ + +The collector stores these values for each probe: + +.. image:: ./collector.png + :width: 675px + +Fields: + * Probe id: could be the hostname of the monitored machine. But it is a bit + more complicated because a probe can monitor several machines (PDU). + * Timestamp: is updated when a new value is received. + * KWh: is computed by taking into account the new watt value, and the elapsed + time since the previous update. It allows Ceilometer to compute average + consumption for a given duration (knowing the kWh consumed and the time + elapsed since its last check). + * Watts: offers the possibility to know instantaneous consumption of a + device, without having to query two times a probe in a small interval to + deduce it. This could be especially useful if a probe has a large refresh + interval: there is no need to wait its next value. + +No history is kept because Ceilometer already has a storage architecture. The +collector is cleaned periodically to prevent a deleted probe from being stored +indefinitely in the collector. So when a probe has not been updated for a long +time, it is deleted. + +API +^^^ + +==== =========================== ===================================== ================================================ +Verb URL Parameters Expected result +==== =========================== ===================================== ================================================ +GET /v1/ Returns detailed information about this specific + version of the API. +GET /v1/probe-ids/ Returns all known probe IDs. +GET /v1/probes/ Returns all information about all known probes. +GET /v1/probes// probe id Returns all information about this probe + (id, timestamp, kWh, W). +GET /v1/probes/// probe id, meter { timestamp, kwh, w } Returns the probe meter value. +==== =========================== ===================================== ================================================ + +Authentication +^^^^^^^^^^^^^^ + +The pollster provides a token (X-Auth-Token). The API plugin checks the token +(Keystone request), and if the token is valid, requested data are sent. +Responses are not signed because Ceilometer trusts Kwapi plugin. + +Ceilometer pollster +^^^^^^^^^^^^^^^^^^^ + +The API plugin is queried by a Ceilometer pollster. The Ceilometer pollster is +started periodically by Ceilometer central agent. It knows the Kwapi URL by +doing a Keystone request (endpoint-get). It queries probe values through Kwapi +API, using the GET /v1/probes/ call, so that it gets all detailed informations +about all probes in just one query. For each probe, it creates a counter object +and publishes it on the Ceilometer bus. + +Published counters: + * Energy (cumulative type): represents kWh. + * Power (gauge type): represents watts. + +Counter timestamps are Kwapi timestamps, so that Ceilometer doesn't store wrong +data if a probe is not updated. Ceilometer handles correctly the case where a +probe value is reset (kWh decrease), because of its cumulative type. + +Kwapi RRD plugin +---------------- + +Web interface +^^^^^^^^^^^^^ + +The visualization plugin provides a web interface with power consumption graphs. It is based on Flask and RRDtool. + +==== =========================== ========================================================= ========================================== +Verb URL Parameters Expected result +==== =========================== ========================================================= ========================================== +GET /last// period { minute, hour, day, week, month, year } Returns a webpage with a summary graph + and all probe graphs. +GET /probe// probe id Returns a webpage with all graphs about + this probe (all periods). +GET /graph// period { minute, hour, day, week, month, year } Returns a summary graph about this period. +GET /graph/// period { minute, hour, day, week, month, year }, probe id Returns a graph about this probe. +==== =========================== ========================================================= ========================================== + +Webpage with a summary graph and all probe graphs: + +.. image:: ./webpage.png + :width: 675px + +In the menu bar, you can choose the period for which you want to display graphs +(last minutes, hour, day, week, month or year). By clicking on a probe, you can +display all graphs available for this probe, with different resolutions. + +Graphs +^^^^^^ + +The summary graph shows the total power consumption (sum of all the probes). +Each colour corresponds to a probe. + +The legend contains: + * Minimum, maximum, average and last power consumption. + * Energy consumed (kWh). + * Cost. + +File sizes: + * RRD file: 10 Ko. + * Probe graph: 12 Ko. + * Summary graph: 24 Ko. + +A cache mechanism prevents graphs from being rebuilt uselessly. + +Kwapi forwarder +=============== + +The forwarder aims at decreasing the network traffic: if multiple plugins +listen the same probe, the metric is sent once on the network, and the +forwarder duplicate it and sends a copy to each listeners. The forwarder can +also be installed on a gateway machine, in order to connect isolated networks. + +The following diagram shows these two features: + +.. image:: ./bus.png + :width: 675px + +Using the forwarder is optional, and the plugins can be configured to subscribe +directly to the drivers. Direct subscribing without using the forwarder is +recommanded if the drivers and the plugins are running on the same machine. diff --git a/doc/source/bus.png b/doc/source/bus.png new file mode 100644 index 0000000000000000000000000000000000000000..9abc7eefedf141539eec14ff96ab4edbba75fc6e GIT binary patch literal 46099 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
3NQ(Vpj( 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 Nl;l)p3#AQw{|^rjQOp1U literal 0 HcmV?d00001 diff --git a/doc/source/collector.png b/doc/source/collector.png new file mode 100644 index 0000000000000000000000000000000000000000..60396edd016cfb723799c9097d0fd088931d617a GIT binary patch literal 7024 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 HRoH(4esbp? literal 0 HcmV?d00001 diff --git a/doc/source/conf.py b/doc/source/conf.py new file mode 100644 index 0000000..8b534cd --- /dev/null +++ b/doc/source/conf.py @@ -0,0 +1,419 @@ +# -*- coding: utf-8 -*- +# +# Kwapi documentation build configuration file, created by +# sphinx-quickstart on Thu Oct 27 11:38:59 2011. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys +import os + +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT = os.path.abspath(os.path.join(BASE_DIR, "..", "..")) + +sys.path.insert(0, ROOT) +sys.path.insert(0, BASE_DIR) + +# This is required for ReadTheDocs.org, but isn't a bad idea anyway. +os.environ['DJANGO_SETTINGS_MODULE'] = 'openstack_dashboard.settings' + + +def write_autodoc_index(): + + def find_autodoc_modules(module_name, sourcedir): + """Return a list of modules in the SOURCE directory.""" + modlist = [] + os.chdir(os.path.join(sourcedir, module_name)) + print "SEARCHING %s" % sourcedir + for root, dirs, files in os.walk("."): + for filename in files: + if filename.endswith(".py"): + # remove the pieces of the root + elements = root.split(os.path.sep) + # replace the leading "." with the module name + elements[0] = module_name + # and get the base module name + base, extension = os.path.splitext(filename) + if not (base == "__init__"): + elements.append(base) + result = ".".join(elements) + #print result + modlist.append(result) + return modlist + + RSTDIR = os.path.abspath(os.path.join(BASE_DIR, "sourcecode")) + SRCS = {'kwapi': ROOT} + + EXCLUDED_MODULES = ['kwapi.tests'] + CURRENT_SOURCES = {} + + if not(os.path.exists(RSTDIR)): + os.mkdir(RSTDIR) + CURRENT_SOURCES[RSTDIR] = ['autoindex.rst'] + + INDEXOUT = open(os.path.join(RSTDIR, "autoindex.rst"), "w") + INDEXOUT.write("=================\n") + INDEXOUT.write("Source Code Index\n") + INDEXOUT.write("=================\n") + + for modulename, path in SRCS.items(): + sys.stdout.write("Generating source documentation for %s\n" % + modulename) + INDEXOUT.write("\n%s\n" % modulename.capitalize()) + INDEXOUT.write("%s\n" % ("=" * len(modulename),)) + INDEXOUT.write(".. toctree::\n") + INDEXOUT.write(" :maxdepth: 1\n") + INDEXOUT.write("\n") + + MOD_DIR = os.path.join(RSTDIR, modulename) + CURRENT_SOURCES[MOD_DIR] = [] + if not(os.path.exists(MOD_DIR)): + os.mkdir(MOD_DIR) + for module in find_autodoc_modules(modulename, path): + if any([module.startswith(exclude) + for exclude + in EXCLUDED_MODULES]): + print "Excluded module %s." % module + print EXCLUDED_MODULES[0] + print module.startswith(EXCLUDED_MODULES[0]) + continue + mod_path = os.path.join(path, *module.split(".")) + generated_file = os.path.join(MOD_DIR, "%s.rst" % module) + + INDEXOUT.write(" %s/%s\n" % (modulename, module)) + + # Find the __init__.py module if this is a directory + if os.path.isdir(mod_path): + source_file = ".".join((os.path.join(mod_path, "__init__"), + "py",)) + else: + source_file = ".".join((os.path.join(mod_path), "py")) + + CURRENT_SOURCES[MOD_DIR].append("%s.rst" % module) + # Only generate a new file if the source has changed or we don't + # have a doc file to begin with. + if not os.access(generated_file, os.F_OK) or \ + os.stat(generated_file).st_mtime < \ + os.stat(source_file).st_mtime: + print "Module %s updated, generating new documentation." \ + % module + FILEOUT = open(generated_file, "w") + header = "The :mod:`%s` Module" % module + FILEOUT.write("%s\n" % ("=" * len(header),)) + FILEOUT.write("%s\n" % header) + FILEOUT.write("%s\n" % ("=" * len(header),)) + FILEOUT.write(".. automodule:: %s\n" % module) + FILEOUT.write(" :members:\n") + FILEOUT.write(" :undoc-members:\n") + FILEOUT.write(" :show-inheritance:\n") + FILEOUT.write(" :noindex:\n") + FILEOUT.close() + + INDEXOUT.close() + + # Delete auto-generated .rst files for sources which no longer exist + for directory, subdirs, files in list(os.walk(RSTDIR)): + for old_file in files: + if old_file not in CURRENT_SOURCES.get(directory, []): + print "Removing outdated file for %s" % old_file + os.remove(os.path.join(directory, old_file)) + + +write_autodoc_index() + +# 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. +#sys.path.insert(0, os.path.abspath('.')) + +# -- 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 = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.intersphinx', + 'sphinx.ext.todo', + 'sphinxcontrib.autohttp.flask', + 'wsmeext.sphinxext', + 'sphinx.ext.coverage', + 'sphinx.ext.pngmath', + 'sphinx.ext.viewcode', + 'sphinxcontrib.pecanwsme.rest', + 'oslo.sphinx', +] + +wsme_protocols = ['restjson', 'restxml'] + +todo_include_todos = True + +# Add any paths that contain templates here, relative to this directory. +if os.getenv('HUDSON_PUBLISH_DOCS'): + templates_path = ['_ga', '_templates'] +else: + templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'Kwapi' +copyright = u'2013, OpenStack, LLC' + +# 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 = [] + +primary_domain = 'py' +nitpicky = 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_path = ['.'] +# html_theme = '_theme' + +# 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 = { + "nosidebar": "false" +} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# 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 = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' +git_cmd = "git log --pretty=format:'%ad, commit %h' --date=local -n1" +html_last_updated_fmt = os.popen(git_cmd).read() + +# 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 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 = 'Kwapidoc' + + +# -- 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]). +latex_documents = [ + ('index', 'Kwapi.tex', u'Kwapi Documentation', + u'OpenStack, LLC', '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', 'kwapi', u'Kwapi Documentation', + [u'OpenStack'], 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', 'Kwapi', u'Kwapi Documentation', u'OpenStack', + 'Kwapi', 'One line description of project.', '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' + + +# -- Options for Epub output -------------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = u'Kwapi' +epub_author = u'OpenStack' +epub_publisher = u'OpenStack' +epub_copyright = u'2013, OpenStack' + +# The language of the text. It defaults to the language option +# or en if the language is not set. +#epub_language = '' + +# The scheme of the identifier. Typical schemes are ISBN or URL. +#epub_scheme = '' + +# The unique identifier of the text. This can be an ISBN number +# or the project homepage. +#epub_identifier = '' + +# A unique identification for the text. +#epub_uid = '' + +# A tuple containing the cover image and cover page html template filenames. +#epub_cover = () + +# HTML files that should be inserted before the pages created by sphinx. +# The format is a list of tuples containing the path and title. +#epub_pre_files = [] + +# HTML files shat should be inserted after the pages created by sphinx. +# The format is a list of tuples containing the path and title. +#epub_post_files = [] + +# A list of files that should not be packed into the epub file. +#epub_exclude_files = [] + +# The depth of the table of contents in toc.ncx. +#epub_tocdepth = 3 + +# Allow duplicate toc entries. +#epub_tocdup = True diff --git a/doc/source/configuration.rst b/doc/source/configuration.rst new file mode 100644 index 0000000..ed8427c --- /dev/null +++ b/doc/source/configuration.rst @@ -0,0 +1,161 @@ +.. + Copyright 2013 François Rossigneux (Inria) + + 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. + +===================== +Configuration Options +===================== + +Kwapi drivers specific +====================== + +The following table lists the Kwapi drivers specific options in the drivers +configuration file. Please note that Kwapi uses openstack-common extensively, +which requires that the other parameters are set appropriately. For information +we are listing the configuration elements that we use after the Kwapi drivers +specific elements. + +=============================== ==================================== ============================================================== +Parameter Default Note +=============================== ==================================== ============================================================== +probes_endpoint ipc:///tmp/kwapi-drivers Endpoint where the drivers send their measurements + ipc:// or tcp://: +enable_signing true Enable message signing between drivers and plugins +metering_secret change this or be hacked Secret value for signing metering messages +check_drivers_interval 60 Check drivers at the specified interval and restart them if + they are crashed +=============================== ==================================== ============================================================== + +The configuration file contains a section for each wattmeter. + +A sample configuration file can be found in `drivers.conf`_. + +.. _drivers.conf: https://github.com/stackforge/kwapi/blob/master/etc/kwapi/drivers.conf + +Kwapi plugin API specific +========================= + +The following table lists the Kwapi API specific options in the API +configuration file. Please note that Kwapi uses openstack-common extensively, +which requires that the other parameters are set appropriately. For information +we are listing the configuration elements that we use after the Kwapi API +specific elements. + +=============================== ==================================== ============================================================== +Parameter Default Note +=============================== ==================================== ============================================================== +api_port 5000 API port +probes_endpoint ipc:///tmp/kwapi-forwarder Endpoint where the measurements are received +signature_checking true Enable the verification of signed metering messages +driver_metering_secret change this or be hacked Secret value for verifying signed metering messages +acl_enabled true Check the Keystone tokens provided by the clients +policy_file /etc/kwapi/policy.json Policy file +cleaning_interval 300 Delete the probes that have not been updated during the + specified interval +=============================== ==================================== ============================================================== + +A sample configuration file can be found in `api.conf`_. + +.. _api.conf: https://github.com/stackforge/kwapi/blob/master/etc/kwapi/api.conf + +Keystone Middleware Authentication +---------------------------------- + +The following table lists the Keystone middleware authentication options which are used to get admin token. +Please note that these options need to be under [keystone_authtoken] section. + +=============================== ==================================== ============================================================== +Parameter Default Note +=============================== ==================================== ============================================================== +auth_host The host providing the Keystone service API endpoint for + validating and requesting tokens +auth_port 35357 The port used to validate tokens +auth_protocol https The protocol used to validate tokens +auth_uri auth_protocol://auth_host:auth_port The full URI used to validate tokens +admin_token Either this or the following three options are required. If + set, this is a single shared secret with the Keystone + configuration used to validate tokens. +admin_user User name for retrieving admin token +admin_password Password for retrieving admin token +admin_tenant_name Tenant name for retrieving admin token +signing_dir The cache directory for signing certificate +certfile Required if Keystone server requires client cert +keyfile Required if Keystone server requires client cert. This can be + the same as certfile if the certfile includes the private key. +=============================== ==================================== ============================================================== + +Kwapi plugin RRD specific +========================= + +The following table lists the Kwapi RRD specific options in the RRD +configuration file. Please note that Kwapi uses openstack-common extensively, +which requires that the other parameters are set appropriately. For information +we are listing the configuration elements that we use after the Kwapi RRD +specific elements. + +=============================== ==================================== ============================================================== +Parameter Default Note +=============================== ==================================== ============================================================== +rrd_port 8080 Port used to display webpages +probes_endpoint ipc:///tmp/kwapi-forwarder Endpoint where the measurements are received +signature_checking true Enable the verification of signed metering messages +driver_metering_secret change this or be hacked Secret value for verifying signed metering messages +png_dir /var/lib/kwapi/kwapi-png The directory where are stored PNG files +rrd_dir /var/lib/kwapi/kwapi-rrd The directory where are stored RRD files +currency € The currency symbol used in graphs +kwh_price 0.125 The kWh price used in graphs +hue 100 The hue of the graphs +max_watts 200 The maximum value of the summary graph +refresh_interval 5 The webpage auto-refresh interval +=============================== ==================================== ============================================================== + +A sample configuration file can be found in `rrd.conf`_. + +.. _rrd.conf: https://github.com/stackforge/kwapi/blob/master/etc/kwapi/rrd.conf + +General options +=============== + +The following is the list of openstack-common options that we use: + +=========================== ==================================== ============================================================== +Parameter Default Note +=========================== ==================================== ============================================================== +log_file Log output to a named file +verbose true Print more verbose output +=========================== ==================================== ============================================================== + +Kwapi forwarder specific +========================= + +The following table lists the Kwapi forwarder specific options in the forwarder +configuration file. Please note that Kwapi uses openstack-common extensively, +which requires that the other parameters are set appropriately. For information +we are listing the configuration elements that we use after the Kwapi forwarder +specific elements. + +=============================== ==================================== ============================================================== +Parameter Default Note +=============================== ==================================== ============================================================== +forwarder_endpoint ipc:///tmp/kwapi-forwarder Endpoint where the measurements are forwarded and where the + plugins subscriptions are received +probes_endpoint ipc:///tmp/kwapi-drivers Endpoint where the drivers send their measurements. + ipc:// or tcp://: +=============================== ==================================== ============================================================== + +The configuration file contains a section for each wattmeter. + +A sample configuration file can be found in `forwarder.conf`_. + +.. _forwarder.conf: https://github.com/stackforge/kwapi/blob/master/etc/kwapi/forwarder.conf diff --git a/doc/source/contributing/areas.rst b/doc/source/contributing/areas.rst new file mode 100644 index 0000000..39928d6 --- /dev/null +++ b/doc/source/contributing/areas.rst @@ -0,0 +1,39 @@ +.. + Copyright 2013 François Rossigneux (Inria) + + 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. + +=================== +Areas to Contribute +=================== + +Drivers +======= + +Kwapi aims at supporting various wattmeters. If you have a non-supported +wattmeter, you can easily contribute by writing a new one. + + +Plugins +======= + +Kwapi plugins process the metrics. You can contribute by writing new plugins to +bring new functionnalities. + +Testing +======= + +The first version of Kwapi has not yet unit tests and has not seen much +run-time in real environments. Setting up a copy of Kwapi to monitor a real +OpenStack installation or to perform some load testing would be especially +helpful. diff --git a/doc/source/contributing/index.rst b/doc/source/contributing/index.rst new file mode 100644 index 0000000..339bf42 --- /dev/null +++ b/doc/source/contributing/index.rst @@ -0,0 +1,25 @@ +.. + Copyright 2013 François Rossigneux (Inria) + + 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. + +============================ + Contributing to Kwapi +============================ + +.. toctree:: + + user + resources + areas + source diff --git a/doc/source/contributing/resources.rst b/doc/source/contributing/resources.rst new file mode 100644 index 0000000..8983260 --- /dev/null +++ b/doc/source/contributing/resources.rst @@ -0,0 +1,29 @@ +.. + Copyright 2013 François Rossigneux (Inria) + + 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. + +.. _resources: + +======================= +Project Hosting Details +======================= + +:Bug tracker: https://bugs.launchpad.net/kwapi +:Mailing list: http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev (prefix subjects with ``[energy]`` for faster responses) +:Code Hosting: https://github.com/stackforge/kwapi +:Code Review: https://review.openstack.org/#/q/status:open+project:stackforge/kwapi,n,z + +.. seealso:: + + * :ref:`user` diff --git a/doc/source/contributing/source.rst b/doc/source/contributing/source.rst new file mode 100644 index 0000000..7ec5c09 --- /dev/null +++ b/doc/source/contributing/source.rst @@ -0,0 +1,55 @@ +.. + Copyright 2013 François Rossigneux (Inria) + + 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. + +======================= +Working with the Source +======================= + +Setting up a Development Sandbox +================================ + +1. Set up a server or virtual machine to run OpenStack using + devstack_. + +.. _devstack: http://www.devstack.org/ + +2. Clone the kwapi project to the machine:: + + $ cd /opt/stack + $ git clone https://github.com/stackforge/kwapi.git + $ cd ./kwapi + +3. Once this is done, you need to setup the review process:: + + $ git remote add gerrit ssh://@review.openstack.org:29418/stackforge/kwapi.git + +4. If you are preparing a patch, create a topic branch and switch to + it before making any changes:: + + $ git checkout -b TOPIC-BRANCH + +Code Reviews +============ + +Kwapi uses the OpenStack review process for all code and +developer documentation contributions. Code reviews are managed +through gerrit. + +.. seealso:: + + * http://wiki.openstack.org/GerritWorkflow + * `OpenStack Gerrit instance`_. + +.. _OpenStack Gerrit instance: https://review.openstack.org/#/q/status:open+project:openstack/kwapi,n,z diff --git a/doc/source/contributing/user.rst b/doc/source/contributing/user.rst new file mode 100644 index 0000000..aaf7803 --- /dev/null +++ b/doc/source/contributing/user.rst @@ -0,0 +1,45 @@ +.. + Copyright 2013 François Rossigneux (Inria) + + 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. + +.. _user: + +=================== +Joining the Project +=================== + +Contributor License Agreement +============================= + +In order to contribute to the Kwapi project, you need to have +signed OpenStack's contributor's agreement. + +.. seealso:: + + * http://wiki.openstack.org/HowToContribute + * http://wiki.openstack.org/CLA + +LaunchPad Project +================= + +Most of the tools used for OpenStack depend on a launchpad.net ID for +authentication. After signing up for a launchpad account, join the +"openstack" team to have access to the mailing list and receive +notifications of important events. + +.. seealso:: + + * http://launchpad.net + * http://launchpad.net/kwapi + * http://launchpad.net/~openstack diff --git a/doc/source/glossary.rst b/doc/source/glossary.rst new file mode 100644 index 0000000..afa52d3 --- /dev/null +++ b/doc/source/glossary.rst @@ -0,0 +1,36 @@ +.. + Copyright 2013 François Rossigneux (Inria) + + 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. + +======== +Glossary +======== + +.. glossary:: + + driver + Software thread running querying a wattmeter and sending the results to + the plugins. + + forwarder + Component that forwards plugins subscriptions and metrics. + Used to minimize the network traffic, or to connect isolated networks + through a gateway. + + plugin + An action triggered whenever a meter reaches a certain threshold. + + probe + A wattmeter sensor. A wattmeter can have only one probe (usually the IPMI + cards), or multiple probes (usually the PDUs). diff --git a/doc/source/index.rst b/doc/source/index.rst new file mode 100644 index 0000000..5fcf349 --- /dev/null +++ b/doc/source/index.rst @@ -0,0 +1,65 @@ +.. + Copyright 2013 François Rossigneux (Inria) + + 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. + +=========================================== +Welcome to Kwapi's developer documentation! +=========================================== + +Kwapi is a framework designed for acquiring energy consumption metrics. It +allows to upload metrics from various wattmeters to Ceilometer. + +Its architecture is based on a layer of drivers, which retrieve measurements +from wattmeters, and a layer of plugins that collect and process them. The +communication between these two layers goes through a bus. In the case of a +distributed architecture, a plugin can listen to several drivers at remote +locations. + +Drivers and plugins are easily extensible to support other types of wattmeters, +and provide other services. + +What is the purpose of the project and vision for it? +===================================================== + +Kwapi could be used to do: + * Energy monitoring of data centers + * Usage-based billing + * Efficient scheduling + +It aims at supporting various wattmeters, being scalable and easily extensible. + +This documentation offers information on how Kwapi works and how to contribute +to the project. + +Table of contents +================= + +.. toctree:: + :maxdepth: 2 + + install + architecture + configuration + + contributing/index + glossary + +.. update index + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/doc/source/install.rst b/doc/source/install.rst new file mode 100644 index 0000000..1cff234 --- /dev/null +++ b/doc/source/install.rst @@ -0,0 +1,50 @@ +.. + Copyright 2013 François Rossigneux (Inria) + + 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. + +========== +Installing +========== + +Installing Kwapi +================ + +1. Clone the Kwapi git repository to the management server:: + + $ git clone https://github.com/stackforge/kwapi.git + +2. As a user with ``root`` permissions or ``sudo`` privileges, run the + Kwapi installer and copy the configuration files:: + + $ pip install kwapi + $ cp -r kwapi/etc/kwapi /etc/ + +Running Kwapi services +====================== + + Start the drivers on all the machines that can access wattmeters:: + + $ kwapi-drivers + + Start the forwarder on a remote machine (optional):: + + $ kwapi-forwarder + + Start the API plugin if you want to use Ceilometer:: + + $ kwapi-api + + Start the RRD plugin if you want to display graphs in a web browser:: + + $ kwapi-rrd diff --git a/doc/source/layered_architecture.png b/doc/source/layered_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..26522afca36c937dc7aac27a06e0b545114e1d6e GIT binary patch literal 10348 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 literal 0 HcmV?d00001 diff --git a/doc/source/message_format.png b/doc/source/message_format.png new file mode 100644 index 0000000000000000000000000000000000000000..9333791d6d5568a567e889eee6aa2fb6ade0f403 GIT binary patch literal 4438 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
@>8 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 60 or + exc.message != last_exc_message): + logging.exception( + _('Unexpected exception occurred %d time(s)... ' + 'retrying.') % exc_count) + last_log_time = cur_time + last_exc_message = exc.message + exc_count = 0 + # This should be a very rare event. In case it isn't, do + # a sleep. + time.sleep(1) + return inner_func diff --git a/kwapi/openstack/common/fileutils.py b/kwapi/openstack/common/fileutils.py new file mode 100644 index 0000000..2283490 --- /dev/null +++ b/kwapi/openstack/common/fileutils.py @@ -0,0 +1,110 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack Foundation. +# All Rights Reserved. +# +# 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 contextlib +import errno +import os + +from kwapi.openstack.common import excutils +from kwapi.openstack.common.gettextutils import _ # noqa +from kwapi.openstack.common import log as logging + +LOG = logging.getLogger(__name__) + +_FILE_CACHE = {} + + +def ensure_tree(path): + """Create a directory (and any ancestor directories required) + + :param path: Directory to create + """ + try: + os.makedirs(path) + except OSError as exc: + if exc.errno == errno.EEXIST: + if not os.path.isdir(path): + raise + else: + raise + + +def read_cached_file(filename, force_reload=False): + """Read from a file if it has been modified. + + :param force_reload: Whether to reload the file. + :returns: A tuple with a boolean specifying if the data is fresh + or not. + """ + global _FILE_CACHE + + if force_reload and filename in _FILE_CACHE: + del _FILE_CACHE[filename] + + reloaded = False + mtime = os.path.getmtime(filename) + cache_info = _FILE_CACHE.setdefault(filename, {}) + + if not cache_info or mtime > cache_info.get('mtime', 0): + LOG.debug(_("Reloading cached file %s") % filename) + with open(filename) as fap: + cache_info['data'] = fap.read() + cache_info['mtime'] = mtime + reloaded = True + return (reloaded, cache_info['data']) + + +def delete_if_exists(path): + """Delete a file, but ignore file not found error. + + :param path: File to delete + """ + + try: + os.unlink(path) + except OSError as e: + if e.errno == errno.ENOENT: + return + else: + raise + + +@contextlib.contextmanager +def remove_path_on_error(path): + """Protect code that wants to operate on PATH atomically. + Any exception will cause PATH to be removed. + + :param path: File to work with + """ + try: + yield + except Exception: + with excutils.save_and_reraise_exception(): + delete_if_exists(path) + + +def file_open(*args, **kwargs): + """Open file + + see built-in file() documentation for more details + + Note: The reason this is kept in a separate module is to easily + be able to provide a stub module that doesn't alter system + state at all (for unit tests) + """ + return file(*args, **kwargs) diff --git a/kwapi/openstack/common/gettextutils.py b/kwapi/openstack/common/gettextutils.py index 4f8e677..7912b9f 100644 --- a/kwapi/openstack/common/gettextutils.py +++ b/kwapi/openstack/common/gettextutils.py @@ -2,6 +2,7 @@ # Copyright 2012 Red Hat, Inc. # All Rights Reserved. +# Copyright 2013 IBM Corp. # # 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 @@ -23,11 +24,236 @@ Usual usage in an openstack.common module: from kwapi.openstack.common.gettextutils import _ """ +import copy import gettext +import logging.handlers +import os +import re +import UserString +import six -t = gettext.translation('openstack-common', 'locale', fallback=True) +_localedir = os.environ.get('kwapi'.upper() + '_LOCALEDIR') +_t = gettext.translation('kwapi', localedir=_localedir, fallback=True) def _(msg): - return t.ugettext(msg) + return _t.ugettext(msg) + + +def install(domain): + """Install a _() function using the given translation domain. + + Given a translation domain, install a _() function using gettext's + install() function. + + The main difference from gettext.install() is that we allow + overriding the default localedir (e.g. /usr/share/locale) using + a translation-domain-specific environment variable (e.g. + NOVA_LOCALEDIR). + """ + gettext.install(domain, + localedir=os.environ.get(domain.upper() + '_LOCALEDIR'), + unicode=True) + + +""" +Lazy gettext functionality. + +The following is an attempt to introduce a deferred way +to do translations on messages in OpenStack. We attempt to +override the standard _() function and % (format string) operation +to build Message objects that can later be translated when we have +more information. Also included is an example LogHandler that +translates Messages to an associated locale, effectively allowing +many logs, each with their own locale. +""" + + +def get_lazy_gettext(domain): + """Assemble and return a lazy gettext function for a given domain. + + Factory method for a project/module to get a lazy gettext function + for its own translation domain (i.e. nova, glance, cinder, etc.) + """ + + def _lazy_gettext(msg): + """Create and return a Message object. + + Message encapsulates a string so that we can translate it later when + needed. + """ + return Message(msg, domain) + + return _lazy_gettext + + +class Message(UserString.UserString, object): + """Class used to encapsulate translatable messages.""" + def __init__(self, msg, domain): + # _msg is the gettext msgid and should never change + self._msg = msg + self._left_extra_msg = '' + self._right_extra_msg = '' + self.params = None + self.locale = None + self.domain = domain + + @property + def data(self): + # NOTE(mrodden): this should always resolve to a unicode string + # that best represents the state of the message currently + + localedir = os.environ.get(self.domain.upper() + '_LOCALEDIR') + if self.locale: + lang = gettext.translation(self.domain, + localedir=localedir, + languages=[self.locale], + fallback=True) + else: + # use system locale for translations + lang = gettext.translation(self.domain, + localedir=localedir, + fallback=True) + + full_msg = (self._left_extra_msg + + lang.ugettext(self._msg) + + self._right_extra_msg) + + if self.params is not None: + full_msg = full_msg % self.params + + return six.text_type(full_msg) + + def _save_dictionary_parameter(self, dict_param): + full_msg = self.data + # look for %(blah) fields in string; + # ignore %% and deal with the + # case where % is first character on the line + keys = re.findall('(?:[^%]|^)%\((\w*)\)[a-z]', full_msg) + + # if we don't find any %(blah) blocks but have a %s + if not keys and re.findall('(?:[^%]|^)%[a-z]', full_msg): + # apparently the full dictionary is the parameter + params = copy.deepcopy(dict_param) + else: + params = {} + for key in keys: + try: + params[key] = copy.deepcopy(dict_param[key]) + except TypeError: + # cast uncopyable thing to unicode string + params[key] = unicode(dict_param[key]) + + return params + + def _save_parameters(self, other): + # we check for None later to see if + # we actually have parameters to inject, + # so encapsulate if our parameter is actually None + if other is None: + self.params = (other, ) + elif isinstance(other, dict): + self.params = self._save_dictionary_parameter(other) + else: + # fallback to casting to unicode, + # this will handle the problematic python code-like + # objects that cannot be deep-copied + try: + self.params = copy.deepcopy(other) + except TypeError: + self.params = unicode(other) + + return self + + # overrides to be more string-like + def __unicode__(self): + return self.data + + def __str__(self): + return self.data.encode('utf-8') + + def __getstate__(self): + to_copy = ['_msg', '_right_extra_msg', '_left_extra_msg', + 'domain', 'params', 'locale'] + new_dict = self.__dict__.fromkeys(to_copy) + for attr in to_copy: + new_dict[attr] = copy.deepcopy(self.__dict__[attr]) + + return new_dict + + def __setstate__(self, state): + for (k, v) in state.items(): + setattr(self, k, v) + + # operator overloads + def __add__(self, other): + copied = copy.deepcopy(self) + copied._right_extra_msg += other.__str__() + return copied + + def __radd__(self, other): + copied = copy.deepcopy(self) + copied._left_extra_msg += other.__str__() + return copied + + def __mod__(self, other): + # do a format string to catch and raise + # any possible KeyErrors from missing parameters + self.data % other + copied = copy.deepcopy(self) + return copied._save_parameters(other) + + def __mul__(self, other): + return self.data * other + + def __rmul__(self, other): + return other * self.data + + def __getitem__(self, key): + return self.data[key] + + def __getslice__(self, start, end): + return self.data.__getslice__(start, end) + + def __getattribute__(self, name): + # NOTE(mrodden): handle lossy operations that we can't deal with yet + # These override the UserString implementation, since UserString + # uses our __class__ attribute to try and build a new message + # after running the inner data string through the operation. + # At that point, we have lost the gettext message id and can just + # safely resolve to a string instead. + ops = ['capitalize', 'center', 'decode', 'encode', + 'expandtabs', 'ljust', 'lstrip', 'replace', 'rjust', 'rstrip', + 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'] + if name in ops: + return getattr(self.data, name) + else: + return UserString.UserString.__getattribute__(self, name) + + +class LocaleHandler(logging.Handler): + """Handler that can have a locale associated to translate Messages. + + A quick example of how to utilize the Message class above. + LocaleHandler takes a locale and a target logging.Handler object + to forward LogRecord objects to after translating the internal Message. + """ + + def __init__(self, locale, target): + """Initialize a LocaleHandler + + :param locale: locale to use for translating messages + :param target: logging.Handler object to forward + LogRecord objects to after translation + """ + logging.Handler.__init__(self) + self.locale = locale + self.target = target + + def emit(self, record): + if isinstance(record.msg, Message): + # set the locale and resolve to a string + record.msg.locale = self.locale + + self.target.emit(record) diff --git a/kwapi/openstack/common/importutils.py b/kwapi/openstack/common/importutils.py new file mode 100644 index 0000000..7a303f9 --- /dev/null +++ b/kwapi/openstack/common/importutils.py @@ -0,0 +1,68 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack Foundation. +# All Rights Reserved. +# +# 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 related utilities and helper functions. +""" + +import sys +import traceback + + +def import_class(import_str): + """Returns a class from a string including module and class.""" + mod_str, _sep, class_str = import_str.rpartition('.') + try: + __import__(mod_str) + return getattr(sys.modules[mod_str], class_str) + except (ValueError, AttributeError): + raise ImportError('Class %s cannot be found (%s)' % + (class_str, + traceback.format_exception(*sys.exc_info()))) + + +def import_object(import_str, *args, **kwargs): + """Import a class and return an instance of it.""" + return import_class(import_str)(*args, **kwargs) + + +def import_object_ns(name_space, import_str, *args, **kwargs): + """Tries to import object from default namespace. + + Imports a class and return an instance of it, first by trying + to find the class in a default namespace, then failing back to + a full path if not found in the default namespace. + """ + import_value = "%s.%s" % (name_space, import_str) + try: + return import_class(import_value)(*args, **kwargs) + except ImportError: + return import_class(import_str)(*args, **kwargs) + + +def import_module(import_str): + """Import a module.""" + __import__(import_str) + return sys.modules[import_str] + + +def try_import(import_str, default=None): + """Try to import a module and if it fails return default.""" + try: + return import_module(import_str) + except ImportError: + return default diff --git a/kwapi/openstack/common/jsonutils.py b/kwapi/openstack/common/jsonutils.py index 901a1b4..d804088 100644 --- a/kwapi/openstack/common/jsonutils.py +++ b/kwapi/openstack/common/jsonutils.py @@ -38,11 +38,24 @@ import functools import inspect import itertools import json +import types import xmlrpclib +import netaddr +import six + from kwapi.openstack.common import timeutils +_nasty_type_tests = [inspect.ismodule, inspect.isclass, inspect.ismethod, + inspect.isfunction, inspect.isgeneratorfunction, + inspect.isgenerator, inspect.istraceback, inspect.isframe, + inspect.iscode, inspect.isbuiltin, inspect.isroutine, + inspect.isabstract] + +_simple_types = (types.NoneType, int, basestring, bool, float, long) + + def to_primitive(value, convert_instances=False, convert_datetime=True, level=0, max_depth=3): """Convert a complex object into primitives. @@ -58,19 +71,32 @@ def to_primitive(value, convert_instances=False, convert_datetime=True, Therefore, convert_instances=True is lossy ... be aware. """ - nasty = [inspect.ismodule, inspect.isclass, inspect.ismethod, - inspect.isfunction, inspect.isgeneratorfunction, - inspect.isgenerator, inspect.istraceback, inspect.isframe, - inspect.iscode, inspect.isbuiltin, inspect.isroutine, - inspect.isabstract] - for test in nasty: - if test(value): - return unicode(value) + # handle obvious types first - order of basic types determined by running + # full tests on nova project, resulting in the following counts: + # 572754 + # 460353 + # 379632 + # 274610 + # 199918 + # 114200 + # 51817 + # 26164 + # 6491 + # 283 + # 19 + if isinstance(value, _simple_types): + return value - # value of itertools.count doesn't get caught by inspects - # above and results in infinite loop when list(value) is called. + if isinstance(value, datetime.datetime): + if convert_datetime: + return timeutils.strtime(value) + else: + return value + + # value of itertools.count doesn't get caught by nasty_type_tests + # and results in infinite loop when list(value) is called. if type(value) == itertools.count: - return unicode(value) + return six.text_type(value) # FIXME(vish): Workaround for LP bug 852095. Without this workaround, # tests that raise an exception in a mocked method that @@ -91,17 +117,18 @@ def to_primitive(value, convert_instances=False, convert_datetime=True, convert_datetime=convert_datetime, level=level, max_depth=max_depth) + if isinstance(value, dict): + return dict((k, recursive(v)) for k, v in value.iteritems()) + elif isinstance(value, (list, tuple)): + return [recursive(lv) for lv in value] + # It's not clear why xmlrpclib created their own DateTime type, but # for our purposes, make it a datetime type which is explicitly # handled if isinstance(value, xmlrpclib.DateTime): value = datetime.datetime(*tuple(value.timetuple())[:6]) - if isinstance(value, (list, tuple)): - return [recursive(v) for v in value] - elif isinstance(value, dict): - return dict((k, recursive(v)) for k, v in value.iteritems()) - elif convert_datetime and isinstance(value, datetime.datetime): + if convert_datetime and isinstance(value, datetime.datetime): return timeutils.strtime(value) elif hasattr(value, 'iteritems'): return recursive(dict(value.iteritems()), level=level + 1) @@ -111,12 +138,16 @@ def to_primitive(value, convert_instances=False, convert_datetime=True, # Likely an instance of something. Watch for cycles. # Ignore class member vars. return recursive(value.__dict__, level=level + 1) + elif isinstance(value, netaddr.IPAddress): + return six.text_type(value) else: + if any(test(value) for test in _nasty_type_tests): + return six.text_type(value) return value except TypeError: # Class objects are tricky since they may define something like # __iter__ defined but it isn't callable as list(). - return unicode(value) + return six.text_type(value) def dumps(value, default=to_primitive, **kwargs): diff --git a/kwapi/openstack/common/local.py b/kwapi/openstack/common/local.py index 8bdc837..f1bfc82 100644 --- a/kwapi/openstack/common/local.py +++ b/kwapi/openstack/common/local.py @@ -1,6 +1,6 @@ # vim: tabstop=4 shiftwidth=4 softtabstop=4 -# Copyright 2011 OpenStack LLC. +# Copyright 2011 OpenStack Foundation. # All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may diff --git a/kwapi/openstack/common/log.py b/kwapi/openstack/common/log.py index f8dba33..9d07c05 100644 --- a/kwapi/openstack/common/log.py +++ b/kwapi/openstack/common/log.py @@ -1,6 +1,6 @@ # vim: tabstop=4 shiftwidth=4 softtabstop=4 -# Copyright 2011 OpenStack LLC. +# Copyright 2011 OpenStack Foundation. # Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # All Rights Reserved. @@ -29,26 +29,24 @@ It also allows setting of formatting information through conf. """ -import cStringIO import inspect import itertools import logging import logging.config import logging.handlers import os -import stat import sys import traceback from oslo.config import cfg +from six import moves -from kwapi.openstack.common.gettextutils import _ +from kwapi.openstack.common.gettextutils import _ # noqa +from kwapi.openstack.common import importutils from kwapi.openstack.common import jsonutils from kwapi.openstack.common import local -from kwapi.openstack.common import notifier -_DEFAULT_LOG_FORMAT = "%(asctime)s %(levelname)8s [%(name)s] %(message)s" _DEFAULT_LOG_DATE_FORMAT = "%Y-%m-%d %H:%M:%S" common_cli_opts = [ @@ -73,11 +71,14 @@ logging_cli_opts = [ 'documentation for details on logging configuration ' 'files.'), cfg.StrOpt('log-format', - default=_DEFAULT_LOG_FORMAT, + default=None, metavar='FORMAT', - help='A logging.Formatter log message format string which may ' + help='DEPRECATED. ' + 'A logging.Formatter log message format string which may ' 'use any of the available logging.LogRecord attributes. ' - 'Default: %(default)s'), + 'This option is deprecated. Please use ' + 'logging_context_format_string and ' + 'logging_default_format_string instead.'), cfg.StrOpt('log-date-format', default=_DEFAULT_LOG_DATE_FORMAT, metavar='DATE_FORMAT', @@ -87,11 +88,11 @@ logging_cli_opts = [ metavar='PATH', deprecated_name='logfile', help='(Optional) Name of log file to output to. ' - 'If not set, logging will go to stdout.'), + 'If no default is set, logging will go to stdout.'), cfg.StrOpt('log-dir', deprecated_name='logdir', - help='(Optional) The directory to keep log files in ' - '(will be prepended to --log-file)'), + help='(Optional) The base directory used for relative ' + '--log-file paths'), cfg.BoolOpt('use-syslog', default=False, help='Use syslog for logging.'), @@ -103,17 +104,14 @@ logging_cli_opts = [ generic_log_opts = [ cfg.BoolOpt('use_stderr', default=True, - help='Log output to standard error'), - cfg.StrOpt('logfile_mode', - default='0644', - help='Default file mode used when creating log files'), + help='Log output to standard error') ] log_opts = [ cfg.StrOpt('logging_context_format_string', - default='%(asctime)s.%(msecs)03d %(levelname)s %(name)s ' - '[%(request_id)s %(user)s %(tenant)s] %(instance)s' - '%(message)s', + default='%(asctime)s.%(msecs)03d %(process)d %(levelname)s ' + '%(name)s [%(request_id)s %(user)s %(tenant)s] ' + '%(instance)s%(message)s', help='format string to use for log messages with context'), cfg.StrOpt('logging_default_format_string', default='%(asctime)s.%(msecs)03d %(process)d %(levelname)s ' @@ -210,7 +208,27 @@ def _get_log_file_path(binary=None): return '%s.log' % (os.path.join(logdir, binary),) -class ContextAdapter(logging.LoggerAdapter): +class BaseLoggerAdapter(logging.LoggerAdapter): + + def audit(self, msg, *args, **kwargs): + self.log(logging.AUDIT, msg, *args, **kwargs) + + +class LazyAdapter(BaseLoggerAdapter): + def __init__(self, name='unknown', version='unknown'): + self._logger = None + self.extra = {} + self.name = name + self.version = version + + @property + def logger(self): + if not self._logger: + self._logger = getLogger(self.name, self.version) + return self._logger + + +class ContextAdapter(BaseLoggerAdapter): warn = logging.LoggerAdapter.warning def __init__(self, logger, project_name, version_string): @@ -218,8 +236,9 @@ class ContextAdapter(logging.LoggerAdapter): self.project = project_name self.version = version_string - def audit(self, msg, *args, **kwargs): - self.log(logging.AUDIT, msg, *args, **kwargs) + @property + def handlers(self): + return self.logger.handlers def deprecated(self, msg, *args, **kwargs): stdmsg = _("Deprecated: %s") % msg @@ -303,17 +322,6 @@ class JSONFormatter(logging.Formatter): return jsonutils.dumps(message) -class PublishErrorsHandler(logging.Handler): - def emit(self, record): - if ('kwapi.openstack.common.notifier.log_notifier' in - CONF.notification_driver): - return - notifier.api.notify(None, 'error.publisher', - 'error_notification', - notifier.api.ERROR, - dict(error=record.msg)) - - def _create_logging_excepthook(product_name): def logging_excepthook(type, value, tb): extra = {} @@ -323,12 +331,32 @@ def _create_logging_excepthook(product_name): return logging_excepthook +class LogConfigError(Exception): + + message = _('Error loading logging config %(log_config)s: %(err_msg)s') + + def __init__(self, log_config, err_msg): + self.log_config = log_config + self.err_msg = err_msg + + def __str__(self): + return self.message % dict(log_config=self.log_config, + err_msg=self.err_msg) + + +def _load_log_config(log_config): + try: + logging.config.fileConfig(log_config) + except moves.configparser.Error as exc: + raise LogConfigError(log_config, str(exc)) + + def setup(product_name): """Setup logging.""" if CONF.log_config: - logging.config.fileConfig(CONF.log_config) + _load_log_config(CONF.log_config) else: - _setup_logging_from_conf(product_name) + _setup_logging_from_conf() sys.excepthook = _create_logging_excepthook(product_name) @@ -362,8 +390,8 @@ def _find_facility_from_conf(): return facility -def _setup_logging_from_conf(product_name): - log_root = getLogger(product_name).logger +def _setup_logging_from_conf(): + log_root = getLogger(None).logger for handler in log_root.handlers: log_root.removeHandler(handler) @@ -378,11 +406,6 @@ def _setup_logging_from_conf(product_name): filelog = logging.handlers.WatchedFileHandler(logpath) log_root.addHandler(filelog) - mode = int(CONF.logfile_mode, 8) - st = os.stat(logpath) - if st.st_mode != (stat.S_IFREG | mode): - os.chmod(logpath, mode) - if CONF.use_stderr: streamlog = ColorHandler() log_root.addHandler(streamlog) @@ -394,14 +417,22 @@ def _setup_logging_from_conf(product_name): log_root.addHandler(streamlog) if CONF.publish_errors: - log_root.addHandler(PublishErrorsHandler(logging.ERROR)) + handler = importutils.import_object( + "kwapi.openstack.common.log_handler.PublishErrorsHandler", + logging.ERROR) + log_root.addHandler(handler) + datefmt = CONF.log_date_format for handler in log_root.handlers: - datefmt = CONF.log_date_format + # NOTE(alaski): CONF.log_format overrides everything currently. This + # should be deprecated in favor of context aware formatting. if CONF.log_format: handler.setFormatter(logging.Formatter(fmt=CONF.log_format, datefmt=datefmt)) - handler.setFormatter(LegacyFormatter(datefmt=datefmt)) + log_root.info('Deprecated: log_format is now deprecated and will ' + 'be removed in the next release') + else: + handler.setFormatter(ContextFormatter(datefmt=datefmt)) if CONF.debug: log_root.setLevel(logging.DEBUG) @@ -410,14 +441,11 @@ def _setup_logging_from_conf(product_name): else: log_root.setLevel(logging.WARNING) - level = logging.NOTSET for pair in CONF.default_log_levels: mod, _sep, level_name = pair.partition('=') level = logging.getLevelName(level_name) logger = logging.getLogger(mod) logger.setLevel(level) - for handler in log_root.handlers: - logger.addHandler(handler) _loggers = {} @@ -430,6 +458,16 @@ def getLogger(name='unknown', version='unknown'): return _loggers[name] +def getLazyLogger(name='unknown', version='unknown'): + """Returns lazy logger. + + Creates a pass-through logger that does not create the real logger + until it is really needed and delegates all calls to the real logger + once it is created. + """ + return LazyAdapter(name, version) + + class WritableLogger(object): """A thin wrapper that responds to `write` and logs.""" @@ -441,7 +479,7 @@ class WritableLogger(object): self.logger.log(self.level, msg) -class LegacyFormatter(logging.Formatter): +class ContextFormatter(logging.Formatter): """A context.RequestContext aware formatter configured through flags. The flags used to set format strings are: logging_context_format_string @@ -482,7 +520,7 @@ class LegacyFormatter(logging.Formatter): if not record: return logging.Formatter.formatException(self, exc_info) - stringbuffer = cStringIO.StringIO() + stringbuffer = moves.StringIO() traceback.print_exception(exc_info[0], exc_info[1], exc_info[2], None, stringbuffer) lines = stringbuffer.getvalue().split('\n') diff --git a/kwapi/openstack/common/notifier/__init__.py b/kwapi/openstack/common/notifier/__init__.py deleted file mode 100644 index 482d54e..0000000 --- a/kwapi/openstack/common/notifier/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright 2011 OpenStack LLC. -# All Rights Reserved. -# -# 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. diff --git a/kwapi/openstack/common/notifier/api.py b/kwapi/openstack/common/notifier/api.py deleted file mode 100644 index d25dbe9..0000000 --- a/kwapi/openstack/common/notifier/api.py +++ /dev/null @@ -1,183 +0,0 @@ -# Copyright 2011 OpenStack LLC. -# All Rights Reserved. -# -# 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 uuid - -from oslo.config import cfg - -from kwapi.openstack.common import context -from kwapi.openstack.common.gettextutils import _ -from kwapi.openstack.common import importutils -from kwapi.openstack.common import jsonutils -from kwapi.openstack.common import log as logging -from kwapi.openstack.common import timeutils - - -LOG = logging.getLogger(__name__) - -notifier_opts = [ - cfg.MultiStrOpt('notification_driver', - default=[], - deprecated_name='list_notifier_drivers', - help='Driver or drivers to handle sending notifications'), - cfg.StrOpt('default_notification_level', - default='INFO', - help='Default notification level for outgoing notifications'), - cfg.StrOpt('default_publisher_id', - default='$host', - help='Default publisher_id for outgoing notifications'), -] - -CONF = cfg.CONF -CONF.register_opts(notifier_opts) - -WARN = 'WARN' -INFO = 'INFO' -ERROR = 'ERROR' -CRITICAL = 'CRITICAL' -DEBUG = 'DEBUG' - -log_levels = (DEBUG, WARN, INFO, ERROR, CRITICAL) - - -class BadPriorityException(Exception): - pass - - -def notify_decorator(name, fn): - """ decorator for notify which is used from utils.monkey_patch() - - :param name: name of the function - :param function: - object of the function - :returns: function -- decorated function - - """ - def wrapped_func(*args, **kwarg): - body = {} - body['args'] = [] - body['kwarg'] = {} - for arg in args: - body['args'].append(arg) - for key in kwarg: - body['kwarg'][key] = kwarg[key] - - ctxt = context.get_context_from_function_and_args(fn, args, kwarg) - notify(ctxt, - CONF.default_publisher_id, - name, - CONF.default_notification_level, - body) - return fn(*args, **kwarg) - return wrapped_func - - -def publisher_id(service, host=None): - if not host: - host = CONF.host - return "%s.%s" % (service, host) - - -def notify(context, publisher_id, event_type, priority, payload): - """Sends a notification using the specified driver - - :param publisher_id: the source worker_type.host of the message - :param event_type: the literal type of event (ex. Instance Creation) - :param priority: patterned after the enumeration of Python logging - levels in the set (DEBUG, WARN, INFO, ERROR, CRITICAL) - :param payload: A python dictionary of attributes - - Outgoing message format includes the above parameters, and appends the - following: - - message_id - a UUID representing the id for this notification - - timestamp - the GMT timestamp the notification was sent at - - The composite message will be constructed as a dictionary of the above - attributes, which will then be sent via the transport mechanism defined - by the driver. - - Message example:: - - {'message_id': str(uuid.uuid4()), - 'publisher_id': 'compute.host1', - 'timestamp': timeutils.utcnow(), - 'priority': 'WARN', - 'event_type': 'compute.create_instance', - 'payload': {'instance_id': 12, ... }} - - """ - if priority not in log_levels: - raise BadPriorityException( - _('%s not in valid priorities') % priority) - - # Ensure everything is JSON serializable. - payload = jsonutils.to_primitive(payload, convert_instances=True) - - msg = dict(message_id=str(uuid.uuid4()), - publisher_id=publisher_id, - event_type=event_type, - priority=priority, - payload=payload, - timestamp=str(timeutils.utcnow())) - - for driver in _get_drivers(): - try: - driver.notify(context, msg) - except Exception as e: - LOG.exception(_("Problem '%(e)s' attempting to " - "send to notification system. " - "Payload=%(payload)s") - % dict(e=e, payload=payload)) - - -_drivers = None - - -def _get_drivers(): - """Instantiate, cache, and return drivers based on the CONF.""" - global _drivers - if _drivers is None: - _drivers = {} - for notification_driver in CONF.notification_driver: - add_driver(notification_driver) - - return _drivers.values() - - -def add_driver(notification_driver): - """Add a notification driver at runtime.""" - # Make sure the driver list is initialized. - _get_drivers() - if isinstance(notification_driver, basestring): - # Load and add - try: - driver = importutils.import_module(notification_driver) - _drivers[notification_driver] = driver - except ImportError: - LOG.exception(_("Failed to load notifier %s. " - "These notifications will not be sent.") % - notification_driver) - else: - # Driver is already loaded; just add the object. - _drivers[notification_driver] = notification_driver - - -def _reset_drivers(): - """Used by unit tests to reset the drivers.""" - global _drivers - _drivers = None diff --git a/kwapi/openstack/common/notifier/log_notifier.py b/kwapi/openstack/common/notifier/log_notifier.py deleted file mode 100644 index 84b4a9b..0000000 --- a/kwapi/openstack/common/notifier/log_notifier.py +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright 2011 OpenStack LLC. -# All Rights Reserved. -# -# 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.config import cfg - -from kwapi.openstack.common import jsonutils -from kwapi.openstack.common import log as logging - - -CONF = cfg.CONF - - -def notify(_context, message): - """Notifies the recipient of the desired event given the model. - Log notifications using openstack's default logging system""" - - priority = message.get('priority', - CONF.default_notification_level) - priority = priority.lower() - logger = logging.getLogger( - 'kwapi.openstack.common.notification.%s' % - message['event_type']) - getattr(logger, priority)(jsonutils.dumps(message)) diff --git a/kwapi/openstack/common/notifier/no_op_notifier.py b/kwapi/openstack/common/notifier/no_op_notifier.py deleted file mode 100644 index ee1ddbd..0000000 --- a/kwapi/openstack/common/notifier/no_op_notifier.py +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright 2011 OpenStack LLC. -# All Rights Reserved. -# -# 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. - - -def notify(_context, message): - """Notifies the recipient of the desired event given the model""" - pass diff --git a/kwapi/openstack/common/notifier/rabbit_notifier.py b/kwapi/openstack/common/notifier/rabbit_notifier.py deleted file mode 100644 index 1ceebb3..0000000 --- a/kwapi/openstack/common/notifier/rabbit_notifier.py +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright 2012 Red Hat, Inc. -# All Rights Reserved. -# -# 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 kwapi.openstack.common.gettextutils import _ -from kwapi.openstack.common import log as logging -from kwapi.openstack.common.notifier import rpc_notifier - -LOG = logging.getLogger(__name__) - - -def notify(context, message): - """Deprecated in Grizzly. Please use rpc_notifier instead.""" - - LOG.deprecated(_("The rabbit_notifier is now deprecated." - " Please use rpc_notifier instead.")) - rpc_notifier.notify(context, message) diff --git a/kwapi/openstack/common/notifier/rpc_notifier.py b/kwapi/openstack/common/notifier/rpc_notifier.py deleted file mode 100644 index 98c41d1..0000000 --- a/kwapi/openstack/common/notifier/rpc_notifier.py +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright 2011 OpenStack LLC. -# All Rights Reserved. -# -# 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.config import cfg - -from kwapi.openstack.common import context as req_context -from kwapi.openstack.common.gettextutils import _ -from kwapi.openstack.common import log as logging -from kwapi.openstack.common import rpc - -LOG = logging.getLogger(__name__) - -notification_topic_opt = cfg.ListOpt( - 'notification_topics', default=['notifications', ], - help='AMQP topic used for openstack notifications') - -CONF = cfg.CONF -CONF.register_opt(notification_topic_opt) - - -def notify(context, message): - """Sends a notification via RPC""" - if not context: - context = req_context.get_admin_context() - priority = message.get('priority', - CONF.default_notification_level) - priority = priority.lower() - for topic in CONF.notification_topics: - topic = '%s.%s' % (topic, priority) - try: - rpc.notify(context, topic, message) - except Exception: - LOG.exception(_("Could not send notification to %(topic)s. " - "Payload=%(message)s"), locals()) diff --git a/kwapi/openstack/common/notifier/rpc_notifier2.py b/kwapi/openstack/common/notifier/rpc_notifier2.py deleted file mode 100644 index a6e6650..0000000 --- a/kwapi/openstack/common/notifier/rpc_notifier2.py +++ /dev/null @@ -1,52 +0,0 @@ -# Copyright 2011 OpenStack LLC. -# All Rights Reserved. -# -# 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. - -'''messaging based notification driver, with message envelopes''' - -from oslo.config import cfg - -from kwapi.openstack.common import context as req_context -from kwapi.openstack.common.gettextutils import _ -from kwapi.openstack.common import log as logging -from kwapi.openstack.common import rpc - -LOG = logging.getLogger(__name__) - -notification_topic_opt = cfg.ListOpt( - 'topics', default=['notifications', ], - help='AMQP topic(s) used for openstack notifications') - -opt_group = cfg.OptGroup(name='rpc_notifier2', - title='Options for rpc_notifier2') - -CONF = cfg.CONF -CONF.register_group(opt_group) -CONF.register_opt(notification_topic_opt, opt_group) - - -def notify(context, message): - """Sends a notification via RPC""" - if not context: - context = req_context.get_admin_context() - priority = message.get('priority', - CONF.default_notification_level) - priority = priority.lower() - for topic in CONF.rpc_notifier2.topics: - topic = '%s.%s' % (topic, priority) - try: - rpc.notify(context, topic, message, envelope=True) - except Exception: - LOG.exception(_("Could not send notification to %(topic)s. " - "Payload=%(message)s"), locals()) diff --git a/kwapi/openstack/common/notifier/test_notifier.py b/kwapi/openstack/common/notifier/test_notifier.py deleted file mode 100644 index 5e34880..0000000 --- a/kwapi/openstack/common/notifier/test_notifier.py +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright 2011 OpenStack LLC. -# All Rights Reserved. -# -# 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. - - -NOTIFICATIONS = [] - - -def notify(_context, message): - """Test notifier, stores notifications in memory for unittests.""" - NOTIFICATIONS.append(message) diff --git a/kwapi/openstack/common/policy.py b/kwapi/openstack/common/policy.py index 2e3fb7a..8a24cc5 100644 --- a/kwapi/openstack/common/policy.py +++ b/kwapi/openstack/common/policy.py @@ -1,6 +1,6 @@ # vim: tabstop=4 shiftwidth=4 softtabstop=4 -# Copyright (c) 2012 OpenStack, LLC. +# Copyright (c) 2012 OpenStack Foundation. # All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may @@ -57,33 +57,48 @@ as it allows particular rules to be explicitly disabled. """ import abc -import logging import re import urllib - import urllib2 -from kwapi.openstack.common.gettextutils import _ -from kwapi.openstack.common import jsonutils +from oslo.config import cfg +import six +from kwapi.openstack.common import fileutils +from kwapi.openstack.common.gettextutils import _ # noqa +from kwapi.openstack.common import jsonutils +from kwapi.openstack.common import log as logging + +policy_opts = [ + cfg.StrOpt('policy_file', + default='policy.json', + help=_('JSON file containing policy')), + cfg.StrOpt('policy_default_rule', + default='default', + help=_('Rule enforced when requested rule is not found')), +] + +CONF = cfg.CONF +CONF.register_opts(policy_opts) LOG = logging.getLogger(__name__) - -_rules = None _checks = {} +class PolicyNotAuthorized(Exception): + + def __init__(self, rule): + msg = _("Policy doesn't allow %s to be performed.") % rule + super(PolicyNotAuthorized, self).__init__(msg) + + class Rules(dict): - """ - A store for rules. Handles the default_rule setting directly. - """ + """A store for rules. Handles the default_rule setting directly.""" @classmethod def load_json(cls, data, default_rule=None): - """ - Allow loading of JSON rule data. - """ + """Allow loading of JSON rule data.""" # Suck in the JSON data and parse the rules rules = dict((k, parse_rule(v)) for k, v in @@ -123,87 +138,157 @@ class Rules(dict): return jsonutils.dumps(out_rules, indent=4) -# Really have to figure out a way to deprecate this -def set_rules(rules): - """Set the rules in use for policy checks.""" +class Enforcer(object): + """Responsible for loading and enforcing rules. - global _rules - - _rules = rules - - -# Ditto -def reset(): - """Clear the rules used for policy checks.""" - - global _rules - - _rules = None - - -def check(rule, target, creds, exc=None, *args, **kwargs): - """ - Checks authorization of a rule against the target and credentials. - - :param rule: The rule to evaluate. - :param target: As much information about the object being operated - on as possible, as a dictionary. - :param creds: As much information about the user performing the - action as possible, as a dictionary. - :param exc: Class of the exception to raise if the check fails. - Any remaining arguments passed to check() (both - positional and keyword arguments) will be passed to - the exception class. If exc is not provided, returns - False. - - :return: Returns False if the policy does not allow the action and - exc is not provided; otherwise, returns a value that - evaluates to True. Note: for rules using the "case" - expression, this True value will be the specified string - from the expression. + :param policy_file: Custom policy file to use, if none is + specified, `CONF.policy_file` will be + used. + :param rules: Default dictionary / Rules to use. It will be + considered just in the first instantiation. If + `load_rules(True)`, `clear()` or `set_rules(True)` + is called this will be overwritten. + :param default_rule: Default rule to use, CONF.default_rule will + be used if none is specified. """ - # Allow the rule to be a Check tree - if isinstance(rule, BaseCheck): - result = rule(target, creds) - elif not _rules: - # No rules to reference means we're going to fail closed - result = False - else: - try: - # Evaluate the rule - result = _rules[rule](target, creds) - except KeyError: - # If the rule doesn't exist, fail closed + def __init__(self, policy_file=None, rules=None, default_rule=None): + self.rules = Rules(rules) + self.default_rule = default_rule or CONF.policy_default_rule + + self.policy_path = None + self.policy_file = policy_file or CONF.policy_file + + def set_rules(self, rules, overwrite=True): + """Create a new Rules object based on the provided dict of rules. + + :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. + """ + + if not isinstance(rules, dict): + raise TypeError(_("Rules must be an instance of dict or Rules, " + "got %s instead") % type(rules)) + + if overwrite: + self.rules = Rules(rules) + else: + self.update(rules) + + def clear(self): + """Clears Enforcer rules, policy's cache and policy's path.""" + self.set_rules({}) + self.policy_path = None + + def load_rules(self, force_reload=False): + """Loads policy_path's rules. + + Policy file is cached and will be reloaded if modified. + + :param force_reload: Whether to overwrite current rules. + """ + + if not self.policy_path: + self.policy_path = self._get_policy_path() + + reloaded, data = fileutils.read_cached_file(self.policy_path, + force_reload=force_reload) + + if reloaded: + rules = Rules.load_json(data, self.default_rule) + self.set_rules(rules) + LOG.debug(_("Rules successfully reloaded")) + + def _get_policy_path(self): + """Locate the policy json data file. + + :param policy_file: Custom policy file to locate. + + :returns: The policy path + + :raises: ConfigFilesNotFoundError if the file couldn't + be located. + """ + policy_file = CONF.find_file(self.policy_file) + + if policy_file: + return policy_file + + raise cfg.ConfigFilesNotFoundError(path=CONF.policy_file) + + def enforce(self, rule, target, creds, do_raise=False, + exc=None, *args, **kwargs): + """Checks authorization of a rule against the target and credentials. + + :param rule: A string or BaseCheck instance specifying the rule + to evaluate. + :param target: As much information about the object being operated + on as possible, as a dictionary. + :param creds: As much information about the user performing the + action as possible, as a dictionary. + :param do_raise: Whether to raise an exception or not if check + fails. + :param exc: Class of the exception to raise if the check fails. + Any remaining arguments passed to check() (both + positional and keyword arguments) will be passed to + the exception class. If not specified, PolicyNotAuthorized + will be used. + + :return: Returns False if the policy does not allow the action and + exc is not provided; otherwise, returns a value that + evaluates to True. Note: for rules using the "case" + expression, this True value will be the specified string + from the expression. + """ + + # NOTE(flaper87): Not logging target or creds to avoid + # potential security issues. + LOG.debug(_("Rule %s will be now enforced") % rule) + + self.load_rules() + + # Allow the rule to be a Check tree + if isinstance(rule, BaseCheck): + result = rule(target, creds, self) + elif not self.rules: + # No rules to reference means we're going to fail closed result = False + else: + try: + # Evaluate the rule + result = self.rules[rule](target, creds, self) + except KeyError: + LOG.debug(_("Rule [%s] doesn't exist") % rule) + # If the rule doesn't exist, fail closed + result = False - # If it is False, raise the exception if requested - if exc and result is False: - raise exc(*args, **kwargs) + # If it is False, raise the exception if requested + if do_raise and not result: + if exc: + raise exc(*args, **kwargs) - return result + raise PolicyNotAuthorized(rule) + + return result class BaseCheck(object): - """ - Abstract base class for Check classes. - """ + """Abstract base class for Check classes.""" __metaclass__ = abc.ABCMeta @abc.abstractmethod def __str__(self): - """ - Retrieve a string representation of the Check tree rooted at - this node. - """ + """String representation of the Check tree rooted at this node.""" pass @abc.abstractmethod - def __call__(self, target, cred): - """ - Perform the check. Returns False to reject the access or a + def __call__(self, target, cred, enforcer): + """Triggers if instance of the class is called. + + Performs the check. Returns False to reject the access or a true value (not necessary True) to accept the access. """ @@ -211,44 +296,39 @@ class BaseCheck(object): class FalseCheck(BaseCheck): - """ - A policy check that always returns False (disallow). - """ + """A policy check that always returns False (disallow).""" def __str__(self): """Return a string representation of this check.""" return "!" - def __call__(self, target, cred): + def __call__(self, target, cred, enforcer): """Check the policy.""" return False class TrueCheck(BaseCheck): - """ - A policy check that always returns True (allow). - """ + """A policy check that always returns True (allow).""" def __str__(self): """Return a string representation of this check.""" return "@" - def __call__(self, target, cred): + def __call__(self, target, cred, enforcer): """Check the policy.""" return True class Check(BaseCheck): - """ - A base class to allow for user-defined policy checks. - """ + """A base class to allow for user-defined policy checks.""" def __init__(self, kind, match): - """ + """Initiates Check instance. + :param kind: The kind of the check, i.e., the field before the ':'. :param match: The match of the check, i.e., the field after @@ -265,14 +345,13 @@ class Check(BaseCheck): class NotCheck(BaseCheck): - """ + """Implements the "not" logical operator. + A policy check that inverts the result of another policy check. - Implements the "not" operator. """ def __init__(self, rule): - """ - Initialize the 'not' check. + """Initialize the 'not' check. :param rule: The rule to negate. Must be a Check. """ @@ -284,24 +363,23 @@ class NotCheck(BaseCheck): return "not %s" % self.rule - def __call__(self, target, cred): - """ - Check the policy. Returns the logical inverse of the wrapped - check. + def __call__(self, target, cred, enforcer): + """Check the policy. + + Returns the logical inverse of the wrapped check. """ - return not self.rule(target, cred) + return not self.rule(target, cred, enforcer) class AndCheck(BaseCheck): - """ - A policy check that requires that a list of other checks all - return True. Implements the "and" operator. + """Implements the "and" logical operator. + + A policy check that requires that a list of other checks all return True. """ def __init__(self, rules): - """ - Initialize the 'and' check. + """Initialize the 'and' check. :param rules: A list of rules that will be tested. """ @@ -313,10 +391,10 @@ class AndCheck(BaseCheck): return "(%s)" % ' and '.join(str(r) for r in self.rules) - def __call__(self, target, cred): - """ - Check the policy. Requires that all rules accept in order to - return True. + def __call__(self, target, cred, enforcer): + """Check the policy. + + Requires that all rules accept in order to return True. """ for rule in self.rules: @@ -326,7 +404,8 @@ class AndCheck(BaseCheck): return True def add_check(self, rule): - """ + """Adds rule to be tested. + Allows addition of another rule to the list of rules that will be tested. Returns the AndCheck object for convenience. """ @@ -336,14 +415,14 @@ class AndCheck(BaseCheck): class OrCheck(BaseCheck): - """ + """Implements the "or" operator. + A policy check that requires that at least one of a list of other - checks returns True. Implements the "or" operator. + checks returns True. """ def __init__(self, rules): - """ - Initialize the 'or' check. + """Initialize the 'or' check. :param rules: A list of rules that will be tested. """ @@ -355,10 +434,10 @@ class OrCheck(BaseCheck): return "(%s)" % ' or '.join(str(r) for r in self.rules) - def __call__(self, target, cred): - """ - Check the policy. Requires that at least one rule accept in - order to return True. + def __call__(self, target, cred, enforcer): + """Check the policy. + + Requires that at least one rule accept in order to return True. """ for rule in self.rules: @@ -368,7 +447,8 @@ class OrCheck(BaseCheck): return False def add_check(self, rule): - """ + """Adds rule to be tested. + Allows addition of another rule to the list of rules that will be tested. Returns the OrCheck object for convenience. """ @@ -378,9 +458,7 @@ class OrCheck(BaseCheck): def _parse_check(rule): - """ - Parse a single base check rule into an appropriate Check object. - """ + """Parse a single base check rule into an appropriate Check object.""" # Handle the special checks if rule == '!': @@ -391,7 +469,7 @@ def _parse_check(rule): try: kind, match = rule.split(':', 1) except Exception: - LOG.exception(_("Failed to understand rule %(rule)s") % locals()) + LOG.exception(_("Failed to understand rule %s") % rule) # If the rule is invalid, we'll fail closed return FalseCheck() @@ -406,9 +484,9 @@ def _parse_check(rule): def _parse_list_rule(rule): - """ - Provided for backwards compatibility. Translates the old - list-of-lists syntax into a tree of Check objects. + """Translates the old list-of-lists syntax into a tree of Check objects. + + Provided for backwards compatibility. """ # Empty rule defaults to True @@ -436,7 +514,7 @@ def _parse_list_rule(rule): or_list.append(AndCheck(and_list)) # If we have only one check, omit the "or" - if len(or_list) == 0: + if not or_list: return FalseCheck() elif len(or_list) == 1: return or_list[0] @@ -449,8 +527,7 @@ _tokenize_re = re.compile(r'\s+') def _parse_tokenize(rule): - """ - Tokenizer for the policy language. + """Tokenizer for the policy language. Most of the single-character tokens are specified in the _tokenize_re; however, parentheses need to be handled specially, @@ -499,16 +576,16 @@ def _parse_tokenize(rule): class ParseStateMeta(type): - """ - Metaclass for the ParseState class. Facilitates identifying - reduction methods. + """Metaclass for the ParseState class. + + Facilitates identifying reduction methods. """ def __new__(mcs, name, bases, cls_dict): - """ - Create the class. Injects the 'reducers' list, a list of - tuples matching token sequences to the names of the - corresponding reduction methods. + """Create the class. + + Injects the 'reducers' list, a list of tuples matching token sequences + to the names of the corresponding reduction methods. """ reducers = [] @@ -525,10 +602,10 @@ class ParseStateMeta(type): def reducer(*tokens): - """ - Decorator for reduction methods. Arguments are a sequence of - tokens, in order, which should trigger running this reduction - method. + """Decorator for reduction methods. + + Arguments are a sequence of tokens, in order, which should trigger running + this reduction method. """ def decorator(func): @@ -545,10 +622,10 @@ def reducer(*tokens): class ParseState(object): - """ - Implement the core of parsing the policy language. Uses a greedy - reduction algorithm to reduce a sequence of tokens into a single - terminal, the value of which will be the root of the Check tree. + """Implement the core of parsing the policy language. + + Uses a greedy reduction algorithm to reduce a sequence of tokens into + a single terminal, the value of which will be the root of the Check tree. Note: error reporting is rather lacking. The best we can get with this parser formulation is an overall "parse failed" error. @@ -565,11 +642,11 @@ class ParseState(object): self.values = [] def reduce(self): - """ - Perform a greedy reduction of the token stream. If a reducer - method matches, it will be executed, then the reduce() method - will be called recursively to search for any more possible - reductions. + """Perform a greedy reduction of the token stream. + + If a reducer method matches, it will be executed, then the + reduce() method will be called recursively to search for any more + possible reductions. """ for reduction, methname in self.reducers: @@ -599,9 +676,9 @@ class ParseState(object): @property def result(self): - """ - Obtain the final result of the parse. Raises ValueError if - the parse failed to reduce to a single result. + """Obtain the final result of the parse. + + Raises ValueError if the parse failed to reduce to a single result. """ if len(self.values) != 1: @@ -618,35 +695,31 @@ class ParseState(object): @reducer('check', 'and', 'check') def _make_and_expr(self, check1, _and, check2): - """ - Create an 'and_expr' from two checks joined by the 'and' - operator. + """Create an 'and_expr'. + + Join two checks by the 'and' operator. """ return [('and_expr', AndCheck([check1, check2]))] @reducer('and_expr', 'and', 'check') def _extend_and_expr(self, and_expr, _and, check): - """ - Extend an 'and_expr' by adding one more check. - """ + """Extend an 'and_expr' by adding one more check.""" return [('and_expr', and_expr.add_check(check))] @reducer('check', 'or', 'check') def _make_or_expr(self, check1, _or, check2): - """ - Create an 'or_expr' from two checks joined by the 'or' - operator. + """Create an 'or_expr'. + + Join two checks by the 'or' operator. """ return [('or_expr', OrCheck([check1, check2]))] @reducer('or_expr', 'or', 'check') def _extend_or_expr(self, or_expr, _or, check): - """ - Extend an 'or_expr' by adding one more check. - """ + """Extend an 'or_expr' by adding one more check.""" return [('or_expr', or_expr.add_check(check))] @@ -658,7 +731,8 @@ class ParseState(object): def _parse_text_rule(rule): - """ + """Parses policy to the tree. + Translates a policy written in the policy language into a tree of Check objects. """ @@ -676,16 +750,14 @@ def _parse_text_rule(rule): return state.result except ValueError: # Couldn't parse the rule - LOG.exception(_("Failed to understand rule %(rule)r") % locals()) + LOG.exception(_("Failed to understand rule %r") % rule) # Fail closed return FalseCheck() def parse_rule(rule): - """ - Parses a policy rule into a tree of Check objects. - """ + """Parses a policy rule into a tree of Check objects.""" # If the rule is a string, it's in the policy language if isinstance(rule, basestring): @@ -694,8 +766,7 @@ def parse_rule(rule): def register(name, func=None): - """ - Register a function or Check class as a policy check. + """Register a function or Check class as a policy check. :param name: Gives the name of the check type, e.g., 'rule', 'role', etc. If name is None, a default check type @@ -722,13 +793,11 @@ def register(name, func=None): @register("rule") class RuleCheck(Check): - def __call__(self, target, creds): - """ - Recursively checks credentials based on the defined rules. - """ + def __call__(self, target, creds, enforcer): + """Recursively checks credentials based on the defined rules.""" try: - return _rules[self.match](target, creds) + return enforcer.rules[self.match](target, creds, enforcer) except KeyError: # We don't have any matching rule; fail closed return False @@ -736,7 +805,7 @@ class RuleCheck(Check): @register("role") class RoleCheck(Check): - def __call__(self, target, creds): + def __call__(self, target, creds, enforcer): """Check that there is a matching role in the cred dict.""" return self.match.lower() in [x.lower() for x in creds['roles']] @@ -744,9 +813,8 @@ class RoleCheck(Check): @register('http') class HttpCheck(Check): - def __call__(self, target, creds): - """ - Check http: rules by calling to a remote server. + def __call__(self, target, creds, enforcer): + """Check http: rules by calling to a remote server. This example implementation simply verifies that the response is exactly 'True'. @@ -762,9 +830,8 @@ class HttpCheck(Check): @register(None) class GenericCheck(Check): - def __call__(self, target, creds): - """ - Check an individual match. + def __call__(self, target, creds, enforcer): + """Check an individual match. Matches look like: @@ -775,5 +842,5 @@ class GenericCheck(Check): # TODO(termie): do dict inspection via dot syntax match = self.match % target if self.kind in creds: - return match == unicode(creds[self.kind]) + return match == six.text_type(creds[self.kind]) return False diff --git a/kwapi/openstack/common/setup.py b/kwapi/openstack/common/setup.py deleted file mode 100644 index 80a0ece..0000000 --- a/kwapi/openstack/common/setup.py +++ /dev/null @@ -1,359 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2011 OpenStack LLC. -# Copyright 2012-2013 Hewlett-Packard Development Company, L.P. -# All Rights Reserved. -# -# 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. - -""" -Utilities with minimum-depends for use in setup.py -""" - -import email -import os -import re -import subprocess -import sys - -from setuptools.command import sdist - - -def parse_mailmap(mailmap='.mailmap'): - mapping = {} - if os.path.exists(mailmap): - with open(mailmap, 'r') as fp: - for l in fp: - try: - canonical_email, alias = re.match( - r'[^#]*?(<.+>).*(<.+>).*', l).groups() - except AttributeError: - continue - mapping[alias] = canonical_email - return mapping - - -def _parse_git_mailmap(git_dir, mailmap='.mailmap'): - mailmap = os.path.join(os.path.dirname(git_dir), mailmap) - return parse_mailmap(mailmap) - - -def canonicalize_emails(changelog, mapping): - """Takes in a string and an email alias mapping and replaces all - instances of the aliases in the string with their real email. - """ - for alias, email_address in mapping.iteritems(): - changelog = changelog.replace(alias, email_address) - return changelog - - -# Get requirements from the first file that exists -def get_reqs_from_files(requirements_files): - for requirements_file in requirements_files: - if os.path.exists(requirements_file): - with open(requirements_file, 'r') as fil: - return fil.read().split('\n') - return [] - - -def parse_requirements(requirements_files=['requirements.txt', - 'tools/pip-requires']): - requirements = [] - for line in get_reqs_from_files(requirements_files): - # For the requirements list, we need to inject only the portion - # after egg= so that distutils knows the package it's looking for - # such as: - # -e git://github.com/openstack/nova/master#egg=nova - if re.match(r'\s*-e\s+', line): - requirements.append(re.sub(r'\s*-e\s+.*#egg=(.*)$', r'\1', - line)) - # such as: - # http://github.com/openstack/nova/zipball/master#egg=nova - elif re.match(r'\s*https?:', line): - requirements.append(re.sub(r'\s*https?:.*#egg=(.*)$', r'\1', - line)) - # -f lines are for index locations, and don't get used here - elif re.match(r'\s*-f\s+', line): - pass - # argparse is part of the standard library starting with 2.7 - # adding it to the requirements list screws distro installs - elif line == 'argparse' and sys.version_info >= (2, 7): - pass - else: - requirements.append(line) - - return requirements - - -def parse_dependency_links(requirements_files=['requirements.txt', - 'tools/pip-requires']): - dependency_links = [] - # dependency_links inject alternate locations to find packages listed - # in requirements - for line in get_reqs_from_files(requirements_files): - # skip comments and blank lines - if re.match(r'(\s*#)|(\s*$)', line): - continue - # lines with -e or -f need the whole line, minus the flag - if re.match(r'\s*-[ef]\s+', line): - dependency_links.append(re.sub(r'\s*-[ef]\s+', '', line)) - # lines that are only urls can go in unmolested - elif re.match(r'\s*https?:', line): - dependency_links.append(line) - return dependency_links - - -def _run_shell_command(cmd, throw_on_error=False): - if os.name == 'nt': - output = subprocess.Popen(["cmd.exe", "/C", cmd], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - else: - output = subprocess.Popen(["/bin/sh", "-c", cmd], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - out = output.communicate() - if output.returncode and throw_on_error: - raise Exception("%s returned %d" % cmd, output.returncode) - if len(out) == 0: - return None - if len(out[0].strip()) == 0: - return None - return out[0].strip() - - -def _get_git_directory(): - parent_dir = os.path.dirname(__file__) - while True: - git_dir = os.path.join(parent_dir, '.git') - if os.path.exists(git_dir): - return git_dir - parent_dir, child = os.path.split(parent_dir) - if not child: # reached to root dir - return None - - -def write_git_changelog(): - """Write a changelog based on the git changelog.""" - new_changelog = 'ChangeLog' - git_dir = _get_git_directory() - if not os.getenv('SKIP_WRITE_GIT_CHANGELOG'): - if git_dir: - git_log_cmd = 'git --git-dir=%s log --stat' % git_dir - changelog = _run_shell_command(git_log_cmd) - mailmap = _parse_git_mailmap(git_dir) - with open(new_changelog, "w") as changelog_file: - changelog_file.write(canonicalize_emails(changelog, mailmap)) - else: - open(new_changelog, 'w').close() - - -def generate_authors(): - """Create AUTHORS file using git commits.""" - jenkins_email = 'jenkins@review.(openstack|stackforge).org' - old_authors = 'AUTHORS.in' - new_authors = 'AUTHORS' - git_dir = _get_git_directory() - if not os.getenv('SKIP_GENERATE_AUTHORS'): - if git_dir: - # don't include jenkins email address in AUTHORS file - git_log_cmd = ("git --git-dir=" + git_dir + - " log --format='%aN <%aE>' | sort -u | " - "egrep -v '" + jenkins_email + "'") - changelog = _run_shell_command(git_log_cmd) - mailmap = _parse_git_mailmap(git_dir) - with open(new_authors, 'w') as new_authors_fh: - new_authors_fh.write(canonicalize_emails(changelog, mailmap)) - if os.path.exists(old_authors): - with open(old_authors, "r") as old_authors_fh: - new_authors_fh.write('\n' + old_authors_fh.read()) - else: - open(new_authors, 'w').close() - - -_rst_template = """%(heading)s -%(underline)s - -.. automodule:: %(module)s - :members: - :undoc-members: - :show-inheritance: -""" - - -def get_cmdclass(): - """Return dict of commands to run from setup.py.""" - - cmdclass = dict() - - def _find_modules(arg, dirname, files): - for filename in files: - if filename.endswith('.py') and filename != '__init__.py': - arg["%s.%s" % (dirname.replace('/', '.'), - filename[:-3])] = True - - class LocalSDist(sdist.sdist): - """Builds the ChangeLog and Authors files from VC first.""" - - def run(self): - write_git_changelog() - generate_authors() - # sdist.sdist is an old style class, can't use super() - sdist.sdist.run(self) - - cmdclass['sdist'] = LocalSDist - - # If Sphinx is installed on the box running setup.py, - # enable setup.py to build the documentation, otherwise, - # just ignore it - try: - from sphinx.setup_command import BuildDoc - - class LocalBuildDoc(BuildDoc): - - builders = ['html', 'man'] - - def generate_autoindex(self): - print "**Autodocumenting from %s" % os.path.abspath(os.curdir) - modules = {} - option_dict = self.distribution.get_option_dict('build_sphinx') - source_dir = os.path.join(option_dict['source_dir'][1], 'api') - if not os.path.exists(source_dir): - os.makedirs(source_dir) - for pkg in self.distribution.packages: - if '.' not in pkg: - os.path.walk(pkg, _find_modules, modules) - module_list = modules.keys() - module_list.sort() - autoindex_filename = os.path.join(source_dir, 'autoindex.rst') - with open(autoindex_filename, 'w') as autoindex: - autoindex.write(""".. toctree:: - :maxdepth: 1 - -""") - for module in module_list: - output_filename = os.path.join(source_dir, - "%s.rst" % module) - heading = "The :mod:`%s` Module" % module - underline = "=" * len(heading) - values = dict(module=module, heading=heading, - underline=underline) - - print "Generating %s" % output_filename - with open(output_filename, 'w') as output_file: - output_file.write(_rst_template % values) - autoindex.write(" %s.rst\n" % module) - - def run(self): - if not os.getenv('SPHINX_DEBUG'): - self.generate_autoindex() - - for builder in self.builders: - self.builder = builder - self.finalize_options() - self.project = self.distribution.get_name() - self.version = self.distribution.get_version() - self.release = self.distribution.get_version() - BuildDoc.run(self) - - class LocalBuildLatex(LocalBuildDoc): - builders = ['latex'] - - cmdclass['build_sphinx'] = LocalBuildDoc - cmdclass['build_sphinx_latex'] = LocalBuildLatex - except ImportError: - pass - - return cmdclass - - -def _get_revno(git_dir): - """Return the number of commits since the most recent tag. - - We use git-describe to find this out, but if there are no - tags then we fall back to counting commits since the beginning - of time. - """ - describe = _run_shell_command( - "git --git-dir=%s describe --always" % git_dir) - if "-" in describe: - return describe.rsplit("-", 2)[-2] - - # no tags found - revlist = _run_shell_command( - "git --git-dir=%s rev-list --abbrev-commit HEAD" % git_dir) - return len(revlist.splitlines()) - - -def _get_version_from_git(pre_version): - """Return a version which is equal to the tag that's on the current - revision if there is one, or tag plus number of additional revisions - if the current revision has no tag.""" - - git_dir = _get_git_directory() - if git_dir: - if pre_version: - try: - return _run_shell_command( - "git --git-dir=" + git_dir + " describe --exact-match", - throw_on_error=True).replace('-', '.') - except Exception: - sha = _run_shell_command( - "git --git-dir=" + git_dir + " log -n1 --pretty=format:%h") - return "%s.a%s.g%s" % (pre_version, _get_revno(git_dir), sha) - else: - return _run_shell_command( - "git --git-dir=" + git_dir + " describe --always").replace( - '-', '.') - return None - - -def _get_version_from_pkg_info(package_name): - """Get the version from PKG-INFO file if we can.""" - try: - pkg_info_file = open('PKG-INFO', 'r') - except (IOError, OSError): - return None - try: - pkg_info = email.message_from_file(pkg_info_file) - except email.MessageError: - return None - # Check to make sure we're in our own dir - if pkg_info.get('Name', None) != package_name: - return None - return pkg_info.get('Version', None) - - -def get_version(package_name, pre_version=None): - """Get the version of the project. First, try getting it from PKG-INFO, if - it exists. If it does, that means we're in a distribution tarball or that - install has happened. Otherwise, if there is no PKG-INFO file, pull the - version from git. - - We do not support setup.py version sanity in git archive tarballs, nor do - we support packagers directly sucking our git repo into theirs. We expect - that a source tarball be made from our git repo - or that if someone wants - to make a source tarball from a fork of our repo with additional tags in it - that they understand and desire the results of doing that. - """ - version = os.environ.get("OSLO_PACKAGE_VERSION", None) - if version: - return version - version = _get_version_from_pkg_info(package_name) - if version: - return version - version = _get_version_from_git(pre_version) - if version: - return version - raise Exception("Versioning for this project requires either an sdist" - " tarball, or access to an upstream git repository.") diff --git a/kwapi/openstack/common/timeutils.py b/kwapi/openstack/common/timeutils.py index e2c2740..bd60489 100644 --- a/kwapi/openstack/common/timeutils.py +++ b/kwapi/openstack/common/timeutils.py @@ -1,6 +1,6 @@ # vim: tabstop=4 shiftwidth=4 softtabstop=4 -# Copyright 2011 OpenStack LLC. +# Copyright 2011 OpenStack Foundation. # All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may @@ -23,24 +23,29 @@ import calendar import datetime import iso8601 +import six -TIME_FORMAT = "%Y-%m-%dT%H:%M:%S" -PERFECT_TIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%f" +# ISO 8601 extended time format with microseconds +_ISO8601_TIME_FORMAT_SUBSECOND = '%Y-%m-%dT%H:%M:%S.%f' +_ISO8601_TIME_FORMAT = '%Y-%m-%dT%H:%M:%S' +PERFECT_TIME_FORMAT = _ISO8601_TIME_FORMAT_SUBSECOND -def isotime(at=None): - """Stringify time in ISO 8601 format""" +def isotime(at=None, subsecond=False): + """Stringify time in ISO 8601 format.""" if not at: at = utcnow() - str = at.strftime(TIME_FORMAT) + st = at.strftime(_ISO8601_TIME_FORMAT + if not subsecond + else _ISO8601_TIME_FORMAT_SUBSECOND) tz = at.tzinfo.tzname(None) if at.tzinfo else 'UTC' - str += ('Z' if tz == 'UTC' else tz) - return str + st += ('Z' if tz == 'UTC' else tz) + return st def parse_isotime(timestr): - """Parse time from ISO 8601 format""" + """Parse time from ISO 8601 format.""" try: return iso8601.parse_date(timestr) except iso8601.ParseError as e: @@ -62,7 +67,7 @@ def parse_strtime(timestr, fmt=PERFECT_TIME_FORMAT): def normalize_time(timestamp): - """Normalize time in arbitrary timezone to UTC naive object""" + """Normalize time in arbitrary timezone to UTC naive object.""" offset = timestamp.utcoffset() if offset is None: return timestamp @@ -71,14 +76,14 @@ def normalize_time(timestamp): def is_older_than(before, seconds): """Return True if before is older than seconds.""" - if isinstance(before, basestring): + if isinstance(before, six.string_types): before = parse_strtime(before).replace(tzinfo=None) return utcnow() - before > datetime.timedelta(seconds=seconds) def is_newer_than(after, seconds): """Return True if after is newer than seconds.""" - if isinstance(after, basestring): + if isinstance(after, six.string_types): after = parse_strtime(after).replace(tzinfo=None) return after - utcnow() > datetime.timedelta(seconds=seconds) @@ -99,7 +104,7 @@ def utcnow(): def iso8601_from_timestamp(timestamp): - """Returns a iso8601 formated date from timestamp""" + """Returns a iso8601 formated date from timestamp.""" return isotime(datetime.datetime.utcfromtimestamp(timestamp)) @@ -107,9 +112,9 @@ utcnow.override_time = None def set_time_override(override_time=datetime.datetime.utcnow()): - """ - Override utils.utcnow to return a constant time or a list thereof, - one at a time. + """Overrides utils.utcnow. + + Make it return a constant time or a list thereof, one at a time. """ utcnow.override_time = override_time @@ -137,7 +142,8 @@ def clear_time_override(): def marshall_now(now=None): """Make an rpc-safe datetime with microseconds. - Note: tzinfo is stripped, but not required for relative times.""" + Note: tzinfo is stripped, but not required for relative times. + """ if not now: now = utcnow() return dict(day=now.day, month=now.month, year=now.year, hour=now.hour, @@ -157,7 +163,8 @@ def unmarshall_time(tyme): def delta_seconds(before, after): - """ + """Return the difference between two timing objects. + Compute the difference in seconds between two date, time, or datetime objects (as a float, to microsecond resolution). """ @@ -170,8 +177,7 @@ def delta_seconds(before, after): def is_soon(dt, window): - """ - Determines if time is going to happen in the next window seconds. + """Determines if time is going to happen in the next window seconds. :params dt: the time :params window: minimum seconds to remain to consider the time not soon diff --git a/kwapi/plugins/api/app.py b/kwapi/plugins/api/app.py index 346e235..3e712dd 100644 --- a/kwapi/plugins/api/app.py +++ b/kwapi/plugins/api/app.py @@ -16,6 +16,8 @@ """Set up the API server application instance.""" +import sys + import flask from oslo.config import cfg @@ -30,6 +32,9 @@ app_opts = [ cfg.BoolOpt('acl_enabled', required=True, ), + cfg.IntOpt('api_port', + required=True, + ), ] cfg.CONF.register_opts(app_opts) @@ -59,3 +64,14 @@ def make_app(): acl.install(app, cfg.CONF) return app + + +def start(): + """Starts Kwapi API.""" + cfg.CONF(sys.argv[1:], + project='kwapi', + default_config_files=['/etc/kwapi/api.conf'] + ) + log.setup('kwapi') + root = make_app() + root.run(host='0.0.0.0', port=cfg.CONF.api_port) diff --git a/kwapi/plugins/rrd/app.py b/kwapi/plugins/rrd/app.py index eb30a23..3972e29 100644 --- a/kwapi/plugins/rrd/app.py +++ b/kwapi/plugins/rrd/app.py @@ -16,9 +16,11 @@ """Set up the RRD server application instance.""" +import sys import thread import flask +from oslo.config import cfg from kwapi.openstack.common import log import rrd @@ -26,6 +28,14 @@ import v1 LOG = log.getLogger(__name__) +app_opts = [ + cfg.IntOpt('rrd_port', + required=True, + ), +] + +cfg.CONF.register_opts(app_opts) + def make_app(): """Instantiates Flask app, attaches collector database. """ @@ -40,3 +50,13 @@ def make_app(): flask.request.probes = rrd.probes flask.request.scales = rrd.scales return app + + +def start(): + """Starts Kwapi RRD.""" + cfg.CONF(sys.argv[1:], + project='kwapi', + default_config_files=['/etc/kwapi/rrd.conf']) + log.setup('kwapi') + root = make_app() + root.run(host='0.0.0.0', port=cfg.CONF.rrd_port) diff --git a/kwapi/policy.py b/kwapi/policy.py index 8068b00..79a113f 100644 --- a/kwapi/policy.py +++ b/kwapi/policy.py @@ -24,18 +24,6 @@ from oslo.config import cfg from kwapi.openstack.common import policy from kwapi import utils - -OPTS = [ - cfg.StrOpt('policy_file', - default='policy.json', - help='JSON file representing policy'), - cfg.StrOpt('policy_default_rule', - default='default', - help='Rule checked when requested rule is not found'), -] - -cfg.CONF.register_opts(OPTS) - _POLICY_PATH = None _POLICY_CACHE = {} diff --git a/openstack-common.conf b/openstack-common.conf index 4d5f1d1..0307484 100644 --- a/openstack-common.conf +++ b/openstack-common.conf @@ -1,3 +1,8 @@ [DEFAULT] -modules=gettextutils,jsonutils,local,log,notifier,policy,setup,timeutils +module=gettextutils +module=jsonutils +module=local +module=log +module=policy +module=timeutils base=kwapi diff --git a/pip-requires b/requirements.txt similarity index 61% rename from pip-requires rename to requirements.txt index aa90941..23ce986 100644 --- a/pip-requires +++ b/requirements.txt @@ -1,10 +1,13 @@ +d2to1>=0.2.10,<0.3 eventlet flask iso8601 +kombu oslo.config +pbr>=0.5,<0.6 pyserial pysnmp python-keystoneclient pyzmq -#python-rrdtool +python-rrdtool webob diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..3fbabdf --- /dev/null +++ b/setup.cfg @@ -0,0 +1,39 @@ +[metadata] +name = kwapi +version = 2013.7 +summary = Energy framework for OpenStack +description-file = + README.rst +author = François Rossigneux +author-email = francois.rossigneux@inria.fr +home-page = https://launchpad.net/kwapi +classifier = + Development Status :: 4 - Beta + Environment :: OpenStack + Intended Audience :: Information Technology + Intended Audience :: System Administrators + License :: OSI Approved :: Apache Software License + Operating System :: POSIX :: Linux + Programming Language :: Python :: 2 + Programming Language :: Python :: 2.7 + Topic :: System :: Monitoring + +[global] +setup-hooks = + pbr.hooks.setup_hook + +[files] +packages = + kwapi + +[entry_points] +console_scripts = + kwapi-api = kwapi.plugins.api.app:start + kwapi-drivers = kwapi.drivers.driver_manager:start + kwapi-forwarder = kwapi.forwarder:start + kwapi-rrd = kwapi.plugins.rrd.app:start + +[build_sphinx] +all_files = 1 +build-dir = doc/build +source-dir = doc/source diff --git a/setup.py b/setup.py index 68feca9..f914160 100755 --- a/setup.py +++ b/setup.py @@ -17,52 +17,6 @@ import setuptools -from kwapi.openstack.common import setup as common_setup - -requires = common_setup.parse_requirements(['pip-requires']) -depend_links = common_setup.parse_dependency_links(['pip-requires']) -project = 'kwapi' -version = common_setup.get_version(project, '2013.3') - - setuptools.setup( - - name='kwapi', - version=version, - - description='Energy Efficiency Architecture', - - author='François Rossigneux', - author_email='francois.rossigneux@inria.fr', - - url='https://github.com/stackforge/kwapi', - - classifiers=[ - 'Development Status :: 3 - Alpha', - 'Framework :: Setuptools Plugin', - 'Environment :: OpenStack', - 'Intended Audience :: Information Technology', - 'Intended Audience :: System Administrators', - 'License :: OSI Approved :: Apache Software License', - 'Operating System :: POSIX :: Linux', - 'Programming Language :: Python', - 'Programming Language :: Python :: 2', - 'Programming Language :: Python :: 2.7', - 'Topic :: System :: Monitoring', - ], - - packages=setuptools.find_packages(), - package_data={'kwapi.plugins.rrd': ['templates/*', 'static/*']}, - - scripts=['bin/kwapi-api', - 'bin/kwapi-forwarder', - 'bin/kwapi-drivers', - 'bin/kwapi-rrd'], - - data_files=[('etc/kwapi', ['etc/kwapi/api.conf', - 'etc/kwapi/drivers.conf', - 'etc/kwapi/rrd.conf'])], - - install_requires=requires, - dependency_links=depend_links, -) + setup_requires=['d2to1>=0.2.10,<0.3', 'pbr>=0.5,<0.6'], + d2to1=True) diff --git a/tox.ini b/tox.ini index fffe081..1d5f107 100644 --- a/tox.ini +++ b/tox.ini @@ -3,4 +3,4 @@ envlist = pep8 [testenv:pep8] deps = pep8==1.4 -commands = pep8 --show-source kwapi setup.py bin/kwapi-api bin/kwapi-api bin/kwapi-api +commands = pep8 --show-source kwapi setup.py