diff --git a/.gitignore b/.gitignore index e4a81ae..c268906 100644 --- a/.gitignore +++ b/.gitignore @@ -3,10 +3,57 @@ # C extensions *.so -#IntelJ Idea -.idea/ +# Packages +*.egg +*.egg-info +build +.eggs +eggs +parts +bin +var +sdist +develop-eggs +.installed.cfg +lib +lib64 +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox +nosetests.xml +.testrepository +.venv # Translations *.mo +# Mr Developer +.mr.developer.cfg +.project +.pydevproject + +# Complexity +output/*.html +output/*/index.html + +# Sphinx +doc/build + +# pbr generates these +AUTHORS +ChangeLog + +# Editors +*~ +.*.swp +.*sw? +*.iml + +# JetBrains IDEA +.idea + +node_modules/ \ No newline at end of file diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst new file mode 100644 index 0000000..a5ad52c --- /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 this page: + + https://docs.openstack.org/infra/manual/developers.html + +If you already have a good understanding of how the system works and your +OpenStack accounts are set up, you can skip to the development workflow +section of this documentation to learn how changes to OpenStack should be +submitted for review via the Gerrit tool: + + https://docs.openstack.org/infra/manual/developers.html#development-workflow + +Pull requests submitted through GitHub will be ignored. + +Bugs should be filed on Storyboard, not GitHub: + + https://storyboard.openstack.org/#!/board/89 diff --git a/HACKING.rst b/HACKING.rst new file mode 100644 index 0000000..ff6b83a --- /dev/null +++ b/HACKING.rst @@ -0,0 +1,4 @@ +venus-dashboard Style Commandments +=============================================== + +Read the OpenStack Style Commandments https://docs.openstack.org/hacking/latest/ 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 new file mode 100644 index 0000000..144576d --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,33 @@ +include AUTHORS +include ChangeLog +exclude .gitignore +exclude .gitreview + +global-exclude *.pyc + +include setup.py + +recursive-include venusdashboard/enabled * +recursive-include venusdashboard/static * +recursive-include venusdashboard/templates * + +recursive-include venusalarms/static * +recursive-include venusalarms/templates * + +recursive-include venusentities/static * +recursive-include venusentities/templates * + +recursive-include venustemplates/static * +recursive-include venustemplates/templates * + +recursive-include venusadmintemplates/static * +recursive-include venusadmintemplates/templates * + +recursive-include venusadminalarms/static * +recursive-include venusadminalarms/templates * + +recursive-include venusadminentities/static * +recursive-include venusadminentities/templates * + +recursive-include venusadmindashboard/static * +recursive-include venusadmindashboard/templates * diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..b171ddf --- /dev/null +++ b/README.rst @@ -0,0 +1,3 @@ +================= +Venus Dashboard +================= diff --git a/babel.cfg b/babel.cfg new file mode 100644 index 0000000..15cd6cb --- /dev/null +++ b/babel.cfg @@ -0,0 +1,2 @@ +[python: **.py] + diff --git a/bindep.txt b/bindep.txt new file mode 100644 index 0000000..144e285 --- /dev/null +++ b/bindep.txt @@ -0,0 +1,6 @@ +# selenium tests +firefox [selenium] +xvfb [selenium platform:dpkg] +# already part of xorg-x11-server on openSUSE +xorg-x11-server-Xvfb [selenium platform:redhat] + diff --git a/devstack/plugin.sh b/devstack/plugin.sh new file mode 100755 index 0000000..9c16502 --- /dev/null +++ b/devstack/plugin.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash +# plugin.sh - DevStack plugin.sh dispatch script venus-dashboard + + +function install_venus_dashboard { + setup_develop ${VENUS_DASHBOARD_DIR} +} + +function configure_venus_dashboard { + cp -a ${VENUS_DASHBOARD_DIR}/venus_dashboard/enabled/* ${HORIZON_DIR}/openstack_dashboard/local/enabled/ +} + +function init_venus_dashboard { + $PYTHON ${DEST}/horizon/manage.py collectstatic --noinput + $PYTHON ${DEST}/horizon/manage.py compress --force +} + +# check for service enabled +if is_service_enabled venus-dashboard; then + + if [[ "$1" == "stack" && "$2" == "pre-install" ]]; then + # Set up system services + # no-op + : + + elif [[ "$1" == "stack" && "$2" == "install" ]]; then + # Perform installation of service source + echo_summary "Installing Venus Dashboard" + install_venus_dashboard + + elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then + # Configure after the other layer 1 and 2 services have been configured + echo_summary "Configuring Venus Dashboard" + configure_venus_dashboard + init_venus_dashboard + + elif [[ "$1" == "stack" && "$2" == "extra" ]]; then + # Initialize and start the venus-dashboard service + # no-op + : + fi + + if [[ "$1" == "unstack" ]]; then + # Shut down venus-dashboard services + # no-op + : + fi + + if [[ "$1" == "clean" ]]; then + rm -f ${HORIZON_DIR}/openstack_dashboard/local/enabled/_40* + rm -f ${HORIZON_DIR}/openstack_dashboard/local/enabled/_41* + + # for backward computability + rm -f ${HORIZON_DIR}/openstack_dashboard/enabled/_40* + rm -f ${HORIZON_DIR}/openstack_dashboard/enabled/_41* + fi +fi diff --git a/devstack/settings b/devstack/settings new file mode 100644 index 0000000..d61f3c6 --- /dev/null +++ b/devstack/settings @@ -0,0 +1,4 @@ +# settings file for venus-dashboard plugin +enable_service venus-dashboard + +VENUS_DASHBOARD_DIR=$DEST/venus-dashboard \ No newline at end of file diff --git a/doc/requirements.txt b/doc/requirements.txt new file mode 100644 index 0000000..cd4eb0d --- /dev/null +++ b/doc/requirements.txt @@ -0,0 +1,2 @@ +openstackdocstheme>=2.2.1 # Apache-2.0 +sphinxcontrib-svg2pdfconverter>=0.1.0 # BSD \ No newline at end of file diff --git a/doc/source/conf.py b/doc/source/conf.py new file mode 100644 index 0000000..f56e031 --- /dev/null +++ b/doc/source/conf.py @@ -0,0 +1,93 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +# implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import sys + +sys.path.insert(0, os.path.abspath('../..')) +# -- General configuration ---------------------------------------------------- + +# 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', + 'openstackdocstheme', + 'sphinxcontrib.rsvgconverter' +] + +# autodoc generation is a bit aggressive and a nuisance when doing heavy +# text edit cycles. +# execute "export SPHINX_DEBUG=1" in your terminal to disable + +# The suffix of source filenames. +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = 'venus-dashboard' +copyright = '2016, OpenStack Foundation' + +# 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 + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'native' + +# -- Options for HTML output -------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. Major themes that come with +# Sphinx are currently 'default' and 'sphinxdoc'. +# html_static_path = ['static'] +html_theme = 'openstackdocs' + +# Output file base name for HTML help builder. +htmlhelp_basename = '%sdoc' % project + +# Disable usage of xindy https://bugzilla.redhat.com/show_bug.cgi?id=1643664 +latex_use_xindy = False + +latex_domain_indices = False + +latex_elements = { + 'makeindex': '', + 'printindex': '', + 'preamble': r'\setcounter{tocdepth}{3}', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass +# [howto/manual]). +# NOTE: Specify toctree_only=True for a better document structure of +# the generated PDF file. +latex_documents = [ + ('index', + 'doc-%s.tex' % project, + '%s Documentation' % project, + 'OpenStack Foundation', 'manual', True), +] + +# Example configuration for intersphinx: refer to the Python standard library. +# intersphinx_mapping = {'http://docs.python.org/': None} + +# -- Options for openstackdocstheme ------------------------------------------- +openstackdocs_repo_name = 'openstack/venus-dashboard' +openstackdocs_pdf_link = True +openstackdocs_auto_name = False +openstackdocs_use_storyboard = True diff --git a/doc/source/index.rst b/doc/source/index.rst new file mode 100644 index 0000000..1e6be24 --- /dev/null +++ b/doc/source/index.rst @@ -0,0 +1,32 @@ +.. venus-dashboard documentation master file, created by + sphinx-quickstart on Tue Jul 9 22:26:36 2013. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to venus-dashboard's documentation! +============================================= + +Developer Guide +--------------- + +.. toctree:: + :maxdepth: 1 + + contributor/readme + contributor/installation + contributor/usage + contributor/contributing + +.. # NOTE(ifat-afek): Hide files we don't want to see in the table of contents. + # sphinx build fails if a file is not included in the toctree. +.. toctree:: + :hidden: + + contributor/index + +Indices and tables +------------------ + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/karma.conf.js b/karma.conf.js new file mode 100644 index 0000000..583105e --- /dev/null +++ b/karma.conf.js @@ -0,0 +1,162 @@ +/* + * + * 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. + */ + +'use strict'; + +var fs = require('fs'); +var path = require('path'); + +module.exports = function (config) { + // This tox venv is setup in the post-install npm step + var xstaticPath = path.resolve('./.tox/npm'); + + if (!xstaticPath) { + console.error('xStatic libraries not found, please run `tox -e npm`'); + process.exit(1); + } + xstaticPath += '/lib/'; + xstaticPath += fs.readdirSync(xstaticPath).find(function(directory) { + return directory.indexOf('python') === 0; + }); + + var toxPath = xstaticPath + '/site-packages/'; + xstaticPath = toxPath + 'xstatic/pkg/'; + + config.set({ + preprocessors: { + // Used to collect templates for preprocessing. + // NOTE: the templates must also be listed in the files section below. + './static/**/*.html': ['ng-html2js'] + }, + + // Sets up module to process templates. + ngHtml2JsPreprocessor: { + prependPrefix: '/', + moduleName: 'templates' + }, + + basePath: './', + + // Contains both source and test files. + files: [ + /* + * shim, partly stolen from /i18n/js/horizon/ + * Contains expected items not provided elsewhere (dynamically by + * Django or via jasmine template. + */ + './test-shim.js', + + // from jasmine.html + xstaticPath + 'jquery/data/jquery.js', + xstaticPath + 'angular/data/angular.js', + xstaticPath + 'angular/data/angular-route.js', + xstaticPath + 'angular/data/angular-mocks.js', + xstaticPath + 'angular/data/angular-cookies.js', + xstaticPath + 'angular_bootstrap/data/angular-bootstrap.js', + xstaticPath + 'angular_gettext/data/angular-gettext.js', + xstaticPath + 'angular_fileupload/data/ng-file-upload-all.js', + xstaticPath + 'angular/data/angular-sanitize.js', + xstaticPath + 'd3/data/d3.js', + xstaticPath + 'rickshaw/data/rickshaw.js', + xstaticPath + 'angular_smart_table/data/smart-table.js', + xstaticPath + 'angular_lrdragndrop/data/lrdragndrop.js', + xstaticPath + 'spin/data/spin.js', + xstaticPath + 'spin/data/spin.jquery.js', + xstaticPath + 'tv4/data/tv4.js', + xstaticPath + 'objectpath/data/ObjectPath.js', + xstaticPath + 'angular_schema_form/data/schema-form.js', + + // TODO: These should be mocked. + toxPath + '/horizon/static/horizon/js/horizon.js', + + /** + * Include framework source code from horizon that we need. + * Otherwise, karma will not be able to find them when testing. + * These files should be mocked in the foreseeable future. + */ + toxPath + 'horizon/static/framework/**/*.module.js', + toxPath + 'horizon/static/framework/**/!(*.spec|*.mock).js', + toxPath + 'openstack_dashboard/static/**/*.module.js', + toxPath + 'openstack_dashboard/static/**/!(*.spec|*.mock).js', + toxPath + 'openstack_dashboard/dashboards/**/static/**/*.module.js', + toxPath + 'openstack_dashboard/dashboards/**/static/**/!(*.spec|*.mock).js', + + './venus_dashboard/dashboard/static/vendor/lodash/**/lodash.js', + './venus_dashboard/dashboard/static/vendor/graphlib/**/graphlib.core.js', + './venus_dashboard/dashboard/static/vendor/dagre/**/dagre.core.js', + './venus_dashboard/dashboard/static/vendor/d3/**/d3.js', + './venus_dashboard/dashboard/static/vendor/dagre-d3/**/dagre-d3.core.js', + //'./venus_dashboard/dashboard/static/**/*.module.js', + //'./venus_dashboard/dashboard/static/**/*.module.js', + + /** + * First, list all the files that defines application's angular modules. + * Those files have extension of `.module.js`. The order among them is + * not significant. + */ + './venus_dashboard/dashboard/static/**/*.module.js', + + /** + * Followed by other JavaScript files that defines angular providers + * on the modules defined in files listed above. And they are not mock + * files or spec files defined below. The order among them is not + * significant. + */ + './venus_dashboard/dashboard/static/**/!(*.spec|*.mock).js', + + /** + * Then, list files for mocks with `mock.js` extension. The order + * among them should not be significant. + */ + toxPath + 'openstack_dashboard/static/**/*.mock.js', + //'./static/**/*.mock.js', + + /** + * Finally, list files for spec with `spec.js` extension. The order + * among them should not be significant. + */ + './venus_dashboard/dashboard/static/app/core/openstack-service-api/venus.service.spec.js', + + /** + * Angular external templates + */ + './venus_dashboard/dashboard/static/**/*.html', + + ], + + autoWatch: true, + + frameworks: ['jasmine'], + + browsers: ['Firefox'], + + phantomjsLauncher: { + // Have phantomjs exit if a ResourceError is encountered + // (useful if karma exits without killing phantom) + exitOnResourceError: true + }, + + reporters: ['progress'], + //reporters: ['spec'], + + plugins: [ + 'karma-firefox-launcher', + 'karma-jasmine', + 'karma-ng-html2js-preprocessor', + 'karma-spec-reporter', + ] + + }); +}; diff --git a/manage.py b/manage.py new file mode 100755 index 0000000..9a40f3f --- /dev/null +++ b/manage.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python + +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import os +import sys + +from django.core.management import execute_from_command_line + +if __name__ == "__main__": + os.environ.setdefault("DJANGO_SETTINGS_MODULE", + "venus_dashboard.dashboard.tests.settings") + execute_from_command_line(sys.argv) diff --git a/package.json b/package.json new file mode 100644 index 0000000..a216d88 --- /dev/null +++ b/package.json @@ -0,0 +1,26 @@ +{ + "version": "0.1.0", + "private": true, + "name": "venus-dashboard", + "description": "Venus Dashboard", + "repository": "none", + "license": "Apache 2.0", + "devDependencies": { + "eslint": "1.10.3", + "eslint-config-openstack": "1.2.4", + "jasmine-core": "2.4.1", + "karma": "1.1.2", + "karma-firefox-launcher": "2.1.0", + "karma-cli": "^1.0.1", + "karma-jasmine": "1.0.2", + "karma-ng-html2js-preprocessor": "1.0.0", + "karma-spec-reporter": "0.0.32" + }, + "scripts": { + "postinstall": "if [ ! -d .tox/npm ]; then tox -e npm --notest; fi", + "lint": "eslint --no-color venus_dashboard/static", + "lintq": "eslint --quiet venus_dashboard/static", + "test": "karma start karma.conf.js --single-run" + }, + "dependencies": {} +} diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..886c27e --- /dev/null +++ b/requirements.txt @@ -0,0 +1,24 @@ +# The order of packages is significant, because pip processes them in the order +# of appearance. Changing the order has an impact on the overall integration +# process, which may cause wedges in the gate later. + +pbr!=2.1.0,>=2.0.0 # Apache-2.0 +# Horizon Core Requirements +django-compressor>=2.0 # MIT +iso8601>=0.1.11 # MIT +horizon>=17.1.0 # Apache-2.0 +XStatic-Angular>=1.5.8.0 # MIT License +XStatic-Angular-Bootstrap>=2.2.0.0 # MIT License +XStatic-Bootstrap-Datepicker>=1.3.1.0 # Apache 2.0 License +XStatic-Bootstrap-SCSS>=3.3.7.1 # Apache 2.0 License +XStatic-Dagre>=0.6.4.0 # MIT License +XStatic-Dagre-D3>=0.4.17.0 # MIT License +XStatic-D3>=3.5.17.0 # BSD License (3 clause) +XStatic-Font-Awesome>=4.7.0.0 # SIL OFL 1.1 License, MIT License +XStatic-Graphlib>=2.1.7.0 # MIT License +XStatic-jQuery>=1.8.2.1 # MIT License +XStatic-lodash>=4.16.4.1 # MIT License +XStatic-moment>=2.8.4.1 # MIT License +XStatic-Moment-Timezone>=0.5.22.0 # MIT License +XStatic-smart-table>=1.4.13.2 # MIT License +python-venusclient>=2.5.0 # Apache-2. diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..f135189 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,40 @@ +[metadata] +name = venus-dashboard +summary = Venus Horizon plugin +description_file = + README.rst +author = OpenStack +author_email = openstack-discuss@lists.openstack.org +home_page = https://docs.openstack.org/venus-dashboard/latest/ +python_requires = >=3.6 +classifier = + 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 :: Implementation :: CPython + Programming Language :: Python :: 3 :: Only + Programming Language :: Python :: 3 + Programming Language :: Python :: 3.6 + Programming Language :: Python :: 3.7 + Programming Language :: Python :: 3.8 + +[files] +packages = + venus_dashboard + +[compile_catalog] +directory = venus_dashboard/locale +domain = venus-dashboard + +[update_catalog] +domain = venus-dashboard +output_dir = venus_dashboard/dashboard/locale +input_file = venus_dashboard/dashboard/locale/venus-dashboard.pot + +[extract_messages] +keywords = _ gettext ngettext l_ lazy_gettext +mapping_file = babel.cfg +output_file = venus_dashboard/dashboard/locale/venus-dashboard.pot diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..f76858d --- /dev/null +++ b/setup.py @@ -0,0 +1,20 @@ +# Copyright (c) 2013 Hewlett-Packard Development Company, L.P. +# +# 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 setuptools + +setuptools.setup( + setup_requires=['pbr'], + pbr=True) diff --git a/test-requirements.txt b/test-requirements.txt new file mode 100644 index 0000000..7509d70 --- /dev/null +++ b/test-requirements.txt @@ -0,0 +1,17 @@ +# The order of packages is significant, because pip processes them in the order +# of appearance. Changing the order has an impact on the overall integration +# process, which may cause wedges in the gate later. + +hacking>=3.0.1,<3.1.0 # Apache-2.0 + +coverage>=3.6 +python-subunit>=0.0.18 +nodeenv>=0.9.4 # BSD +testrepository>=0.0.18 +testscenarios>=0.4 +testtools>=1.4.0 +pytest>=5.3.5 # MIT + +# integration tests requirements +selenium>=2.50.1 # Apache-2.0 +xvfbwrapper>=0.1.3 #license: MIT diff --git a/test-shim.js b/test-shim.js new file mode 100644 index 0000000..176b1c3 --- /dev/null +++ b/test-shim.js @@ -0,0 +1,110 @@ +/** + * 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. + */ + +/* + * Shim for Javascript unit tests; supplying expected global features. + * This should be removed from the codebase once i18n services are provided. + * Taken from default i18n file provided by Django. + */ + +var horizonPlugInModules = []; + + +(function (globals) { + + var django = globals.django || (globals.django = {}); + + + django.pluralidx = function (count) { return (count == 1) ? 0 : 1; }; + + /* gettext identity library */ + + django.gettext = function (msgid) { return msgid; }; + django.ngettext = function (singular, plural, count) { return (count == 1) ? singular : plural; }; + django.gettext_noop = function (msgid) { return msgid; }; + django.pgettext = function (context, msgid) { return msgid; }; + django.npgettext = function (context, singular, plural, count) { return (count == 1) ? singular : plural; }; + + + django.interpolate = function (fmt, obj, named) { + if (named) { + return fmt.replace(/%\(\w+\)s/g, function(match){return String(obj[match.slice(2,-2)])}); + } else { + return fmt.replace(/%s/g, function(match){return String(obj.shift())}); + } + }; + + + /* formatting library */ + + django.formats = { + "DATETIME_FORMAT": "N j, Y, P", + "DATETIME_INPUT_FORMATS": [ + "%Y-%m-%d %H:%M:%S", + "%Y-%m-%d %H:%M:%S.%f", + "%Y-%m-%d %H:%M", + "%Y-%m-%d", + "%m/%d/%Y %H:%M:%S", + "%m/%d/%Y %H:%M:%S.%f", + "%m/%d/%Y %H:%M", + "%m/%d/%Y", + "%m/%d/%y %H:%M:%S", + "%m/%d/%y %H:%M:%S.%f", + "%m/%d/%y %H:%M", + "%m/%d/%y" + ], + "DATE_FORMAT": "N j, Y", + "DATE_INPUT_FORMATS": [ + "%Y-%m-%d", + "%m/%d/%Y", + "%m/%d/%y" + ], + "DECIMAL_SEPARATOR": ".", + "FIRST_DAY_OF_WEEK": "0", + "MONTH_DAY_FORMAT": "F j", + "NUMBER_GROUPING": "3", + "SHORT_DATETIME_FORMAT": "m/d/Y P", + "SHORT_DATE_FORMAT": "m/d/Y", + "THOUSAND_SEPARATOR": ",", + "TIME_FORMAT": "P", + "TIME_INPUT_FORMATS": [ + "%H:%M:%S", + "%H:%M:%S.%f", + "%H:%M" + ], + "YEAR_MONTH_FORMAT": "F Y" + }; + + django.get_format = function (format_type) { + var value = django.formats[format_type]; + if (typeof(value) == 'undefined') { + return format_type; + } else { + return value; + } + }; + + /* add to global namespace */ + globals.pluralidx = django.pluralidx; + globals.gettext = django.gettext; + globals.ngettext = django.ngettext; + globals.gettext_noop = django.gettext_noop; + globals.pgettext = django.pgettext; + globals.npgettext = django.npgettext; + globals.interpolate = django.interpolate; + globals.get_format = django.get_format; + globals.STATIC_URL = '/static/'; + globals.WEBROOT = '/'; + +}(this)); diff --git a/tools/executable_files.txt b/tools/executable_files.txt new file mode 100644 index 0000000..32a891a --- /dev/null +++ b/tools/executable_files.txt @@ -0,0 +1 @@ +./manage.py diff --git a/tools/find_executables.sh b/tools/find_executables.sh new file mode 100644 index 0000000..5a2f2f0 --- /dev/null +++ b/tools/find_executables.sh @@ -0,0 +1,12 @@ +OUTPUT=`find . \( -name .tox -o -name .git \) -prune -o -type f -perm /a=x -print \ + | grep -v -F -f ./tools/executable_files.txt` +if [ -n "$OUTPUT" ]; then + echo "Unexpected executable files are found:" + for f in $OUTPUT; do + echo $f + done + echo + echo "If you really need to add an executable file, add it to tools/executable_files.txt" + exit 1 +fi + diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..4d8bda2 --- /dev/null +++ b/tox.ini @@ -0,0 +1,81 @@ +[tox] +minversion = 2.3.2 +envlist = py3,pep8,npm +skipsdist = True +ignore_basepython_conflict = True + +[testenv] +basepython = python3 +usedevelop = True +install_command = pip install -U {opts} {packages} +setenv = + VIRTUAL_ENV={envdir} + PYTHONUNBUFFERED = 1 +deps = + -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} + -r{toxinidir}/test-requirements.txt + -r{toxinidir}/requirements.txt +commands = + {envpython} {toxinidir}/manage.py test venus_dashboard {posargs} --exclude-tag integration {posargs} + +[testenv:integration] +# Run integration tests only +passenv = AVCONV_INSTALLED +setenv = + PYTHONHASHSEED=0 + INTEGRATION_TESTS=1 + SELENIUM_HEADLESS=1 + HORIZON_INTEGRATION_TESTS_CONFIG_FILE=venus_dashboard/dashboard/tests/integration/horizon.conf +basepython = python3 +commands = {envpython} {toxinidir}/manage.py test venus_dashboard --tag integration {posargs} + + +[testenv:pep8] +whitelist_externals = + bash + find +commands = + flake8 + bash {toxinidir}/tools/find_executables.sh + +[testenv:npm] +passenv = + HOME + DISPLAY +commands = + nodeenv -p + npm install + npm run {posargs:test} +deps = + -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} + -r{toxinidir}/requirements.txt + -r{toxinidir}/test-requirements.txt +[testenv:venv] +commands = {posargs} + +[testenv:cover] +commands = python setup.py test --coverage --testr-args='{posargs}' + +[testenv:docs] +deps = -r{toxinidir}/doc/requirements.txt +commands = sphinx-build -W -b html -d doc/build/doctrees doc/source doc/build/html + +[testenv:pdf-docs] +deps = -r{toxinidir}/doc/requirements.txt +envdir = {toxworkdir}/docs +whitelist_externals = + make +commands = + sphinx-build -W -b latex doc/source doc/build/pdf + make -C doc/build/pdf + +[flake8] +# E123, E125 skipped as they are invalid PEP-8. + +show-source = True +ignore = E123,E125 +builtins = _ +exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build + +[testenv:releasenotes] +commands = sphinx-build -a -E -W -d releasenotes/build/doctrees -b html releasenotes/source releasenotes/build/html diff --git a/venus_dashboard/__init__.py b/venus_dashboard/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/pyvenv.cfg b/venv/pyvenv.cfg new file mode 100644 index 0000000..975a17a --- /dev/null +++ b/venv/pyvenv.cfg @@ -0,0 +1,3 @@ +home = /Applications/Xcode.app/Contents/Developer/usr/bin +include-system-site-packages = false +version = 3.8.2