├── .gitignore ├── .gitreview ├── .zuul.yaml ├── CONTRIBUTING.rst ├── LICENSE ├── README.md ├── devstack ├── override-defaults └── plugin.sh ├── doc ├── requirements.txt └── source │ ├── conf.py │ ├── contributor │ └── contributing.rst │ ├── index.rst │ └── readme.rst ├── playbooks └── enable-fips.yaml └── tox.ini /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | .*.sw? 3 | .prereqs 4 | .tox 5 | build 6 | doc/build 7 | ChangeLog 8 | -------------------------------------------------------------------------------- /.gitreview: -------------------------------------------------------------------------------- 1 | [gerrit] 2 | host=review.opendev.org 3 | port=29418 4 | project=openstack/devstack-plugin-nfs.git 5 | -------------------------------------------------------------------------------- /.zuul.yaml: -------------------------------------------------------------------------------- 1 | - project: 2 | templates: 3 | - publish-openstack-docs-pti 4 | check: 5 | jobs: 6 | - devstack-plugin-nfs-tempest-full 7 | - devstack-plugin-nfs-tempest-full-2025-1 8 | - devstack-plugin-nfs-tempest-full-2024-2 9 | - devstack-plugin-nfs-tempest-full-2024-1 10 | - devstack-plugin-nfs-tempest-full-fips: 11 | voting: no 12 | gate: 13 | jobs: 14 | - devstack-plugin-nfs-tempest-full 15 | - devstack-plugin-nfs-tempest-full-2025-1 16 | - devstack-plugin-nfs-tempest-full-2024-2 17 | - devstack-plugin-nfs-tempest-full-2024-1 18 | experimental: 19 | jobs: 20 | - devstack-plugin-nfs-tempest-full-2023-1 21 | - devstack-plugin-nfs-tempest-full-zed 22 | - devstack-plugin-nfs-tempest-full-yoga 23 | - devstack-plugin-nfs-tempest-full-xena 24 | - devstack-plugin-nfs-tempest-full-wallaby 25 | - devstack-plugin-nfs-tempest-full-victoria 26 | 27 | - job: 28 | name: devstack-plugin-nfs-tempest-full 29 | parent: tempest-full-py3 30 | description: | 31 | tempest-full-py3 job based on NFS. 32 | Former names for this job where: 33 | * legacy-tempest-dsvm-full-devstack-plugin-nfs 34 | timeout: 10800 35 | required-projects: 36 | - opendev.org/openstack/devstack-plugin-nfs 37 | host-vars: 38 | controller: 39 | devstack_plugins: 40 | devstack-plugin-nfs: https://opendev.org/openstack/devstack-plugin-nfs 41 | vars: 42 | devstack_localrc: 43 | ENABLE_NFS_CINDER: true 44 | # enabled by default in tempest-full: 45 | ENABLE_VOLUME_MULTIATTACH: false 46 | TEMPEST_VOLUME_REVERT_TO_SNAPSHOT: true 47 | devstack_services: 48 | # Disable horizon (inherited from the parent, not needed by the tests executed here) 49 | horizon: false 50 | irrelevant-files: 51 | - ^.*\.rst$ 52 | - ^doc/.*$ 53 | - ^(test-|)requirements.txt$ 54 | - ^setup.cfg$ 55 | 56 | - job: 57 | name: devstack-plugin-nfs-tempest-full-2025-1 58 | parent: devstack-plugin-nfs-tempest-full 59 | override-checkout: stable/2025.1 60 | 61 | - job: 62 | name: devstack-plugin-nfs-tempest-full-2024-2 63 | parent: devstack-plugin-nfs-tempest-full 64 | override-checkout: stable/2024.2 65 | 66 | - job: 67 | name: devstack-plugin-nfs-tempest-full-2024-1 68 | parent: devstack-plugin-nfs-tempest-full 69 | override-checkout: stable/2024.1 70 | 71 | - job: 72 | name: devstack-plugin-nfs-tempest-full-2023-1 73 | parent: devstack-plugin-nfs-tempest-full 74 | override-checkout: unmaintained/2023.1 75 | 76 | - job: 77 | name: devstack-plugin-nfs-tempest-full-zed 78 | parent: devstack-plugin-nfs-tempest-full 79 | nodeset: openstack-single-node-focal 80 | override-checkout: unmaintained/zed 81 | 82 | - job: 83 | name: devstack-plugin-nfs-tempest-full-yoga 84 | parent: devstack-plugin-nfs-tempest-full 85 | nodeset: openstack-single-node-focal 86 | override-checkout: unmaintained/yoga 87 | 88 | - job: 89 | name: devstack-plugin-nfs-tempest-full-xena 90 | parent: devstack-plugin-nfs-tempest-full 91 | nodeset: openstack-single-node-focal 92 | override-checkout: unmaintained/xena 93 | 94 | - job: 95 | name: devstack-plugin-nfs-tempest-full-wallaby 96 | parent: devstack-plugin-nfs-tempest-full 97 | nodeset: openstack-single-node-focal 98 | override-checkout: unmaintained/wallaby 99 | vars: 100 | tox_envlist: full 101 | 102 | - job: 103 | name: devstack-plugin-nfs-tempest-full-victoria 104 | parent: devstack-plugin-nfs-tempest-full 105 | nodeset: openstack-single-node-focal 106 | override-checkout: unmaintained/victoria 107 | vars: 108 | tox_envlist: full 109 | devstack_localrc: 110 | TEMPEST_VOLUME_REVERT_TO_SNAPSHOT: false 111 | 112 | - job: 113 | name: devstack-plugin-nfs-tempest-full-fips 114 | parent: devstack-plugin-nfs-tempest-full 115 | nodeset: devstack-single-node-centos-9-stream 116 | pre-run: playbooks/enable-fips.yaml 117 | vars: 118 | configure_swap_size: 4096 119 | nslookup_target: 'opendev.org' 120 | -------------------------------------------------------------------------------- /CONTRIBUTING.rst: -------------------------------------------------------------------------------- 1 | The source repository for this project can be found at: 2 | 3 | https://opendev.org/openstack/devstack-plugin-nfs 4 | 5 | Pull requests submitted through GitHub are not monitored. 6 | 7 | To start contributing to OpenStack, follow the steps in the contribution guide 8 | to set up and use Gerrit: 9 | 10 | https://docs.openstack.org/contributors/code-and-documentation/quick-start.html 11 | 12 | Bugs should be filed on Launchpad: 13 | 14 | https://bugs.launchpad.net/devstack-plugin-nfs 15 | 16 | For more specific information about contributing to this repository, see the 17 | Devstack Plugin NFS contributor guide: 18 | 19 | https://docs.openstack.org/devstack-plugin-nfs/latest/contributor/contributing.html 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Devstack NFS Plugin 2 | =================== 3 | 4 | To use: 5 | 6 | enable_plugin devstack-plugin-nfs http://url_to/this_plugin/nfs 7 | 8 | -------------------------------------------------------------------------------- /devstack/override-defaults: -------------------------------------------------------------------------------- 1 | ENABLE_NFS_CINDER=$(trueorfalse True ENABLE_NFS_CINDER) 2 | 3 | if [[ $ENABLE_NFS_CINDER == "True" ]]; then 4 | CINDER_DRIVER=nfs 5 | CINDER_ENABLED_BACKENDS=${CINDER_ENABLED_BACKENDS:-nfs:nfs} 6 | # NOTE(mriedem): This is a workaround for Cinder bug 1642394. 7 | CINDER_IMG_CACHE_ENABLED=False 8 | 9 | # Always make sure that once the plugin is enabled, the backend will be 10 | # properly activated. 11 | if [[ ! $CINDER_ENABLED_BACKENDS == *nfs:nfs* ]]; then 12 | CINDER_ENABLED_BACKENDS+=',nfs:nfs' 13 | fi 14 | 15 | TEMPEST_STORAGE_PROTOCOL=nfs 16 | fi 17 | -------------------------------------------------------------------------------- /devstack/plugin.sh: -------------------------------------------------------------------------------- 1 | # Devstack NFS plugin 2 | 3 | NFS_EXPORT_DIR=${NFS_EXPORT_DIR:-/srv/nfs1} 4 | STACK_NFS_CONF=${STACK_NFS_CONF:-/etc/exports.d/stack_nfs.exports} 5 | NFS_SECURE_FILE_PERMISSIONS=${NFS_SECURE_FILE_PERMISSIONS:-False} 6 | NFS_SECURE_FILE_OPERATIONS=${NFS_SECURE_FILE_OPERATIONS:-False} 7 | 8 | if is_ubuntu; then 9 | NFS_SERVICE=nfs-kernel-server 10 | else 11 | NFS_SERVICE=nfs-server 12 | fi 13 | 14 | function install_nfs { 15 | if is_ubuntu; then 16 | install_package nfs-common 17 | install_package nfs-kernel-server 18 | elif is_fedora; then 19 | install_package nfs-utils 20 | elif is_suse; then 21 | install_package nfs-kernel-server 22 | install_package nfs-client 23 | fi 24 | } 25 | 26 | function configure_nfs { 27 | sudo mkdir -p $NFS_EXPORT_DIR 28 | sudo chown $STACK_USER $NFS_EXPORT_DIR 29 | 30 | sudo mkdir -p /etc/exports.d 31 | 32 | cat </dev/null 33 | $NFS_EXPORT_DIR localhost(rw,no_root_squash) 34 | EOF 35 | } 36 | 37 | function start_nfs { 38 | sudo service $NFS_SERVICE start 39 | } 40 | 41 | # is_nfs_enabled_for_service() - checks whether the OpenStack service 42 | # specified as an argument is enabled with NFS as its storage backend. 43 | function is_nfs_enabled_for_service { 44 | local config config_name enabled service 45 | enabled=1 46 | service=$1 47 | # Construct the global variable ENABLE_NFS_.* corresponding to a 48 | # $service. 49 | config_name=ENABLE_NFS_$(echo $service | \ 50 | tr '[:lower:]' '[:upper:]' | tr '-' '_') 51 | config=$(eval echo "\$$config_name") 52 | 53 | if (is_service_enabled $service) && [[ $config == 'True' ]]; then 54 | enabled=0 55 | fi 56 | return $enabled 57 | } 58 | 59 | function configure_cinder_nfs { 60 | iniset $CINDER_CONF nfs nas_host localhost 61 | iniset $CINDER_CONF nfs nas_share_path ${NFS_EXPORT_DIR} 62 | iniset $CINDER_CONF nfs nas_secure_file_operations \ 63 | ${NFS_SECURE_FILE_OPERATIONS} 64 | iniset $CINDER_CONF nfs nas_secure_file_permissions \ 65 | ${NFS_SECURE_FILE_PERMISSIONS} 66 | 67 | # NFS snapshot support is currently opt-in only. 68 | iniset $CINDER_CONF nfs nfs_snapshot_support True 69 | 70 | # Point Cinder to the Nova service correctly 71 | # Cinder's defaults don't match what devstack sets up. 72 | iniset $CINDER_CONF DEFAULT nova_catalog_info compute:nova:publicURL 73 | iniset $CINDER_CONF DEFAULT nova_catalog_admin_info compute:nova:publicURL 74 | 75 | } 76 | 77 | # Configures tempest for running Cinder volume API tests with an NFS backend. 78 | function configure_tempest_nfs { 79 | iniset $TEMPEST_CONFIG volume-feature-enabled snapshot True 80 | iniset $TEMPEST_CONFIG volume-feature-enabled backup False 81 | iniset $TEMPEST_CONFIG volume-feature-enabled clone True 82 | iniset $TEMPEST_CONFIG volume-feature-enabled manage_snapshot False 83 | if [[ "$TARGET_BRANCH" =~ stable/(ocata|pike|queens|rocky|stein|train|ussuri|victoria) ]]; then 84 | iniset $TEMPEST_CONFIG volume-feature-enabled volume_revert False 85 | else 86 | iniset $TEMPEST_CONFIG volume-feature-enabled volume_revert True 87 | fi 88 | iniset $TEMPEST_CONFIG compute-feature-enabled attach_encrypted_volume False 89 | } 90 | 91 | 92 | if [[ "$1" == "stack" && "$2" == "pre-install" ]]; then 93 | echo_summary "Installing NFS" 94 | install_nfs 95 | echo_summary "Configuring NFS" 96 | configure_nfs 97 | echo_summary "Initializing NFS" 98 | start_nfs 99 | elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then 100 | if is_nfs_enabled_for_service cinder; then 101 | configure_cinder_nfs 102 | sudo service $NFS_SERVICE restart 103 | fi 104 | elif [[ "$1" == "stack" && "$2" == "test-config" ]]; then 105 | if is_nfs_enabled_for_service cinder; then 106 | configure_tempest_nfs 107 | fi 108 | fi 109 | 110 | if [[ "$1" == "unstack" ]]; then 111 | # Unmount any NFS shares mounted by Cinder 112 | if [[ -d ${DATA_DIR}/cinder/mnt ]]; then 113 | find ${DATA_DIR}/cinder/mnt -mindepth 1 -maxdepth 1 -type d \ 114 | | sudo xargs --no-run-if-empty umount -l 115 | fi 116 | 117 | sudo rm -f ${STACK_NFS_CONF} 118 | 119 | # Reload to ensure (removed) config is reread, but don't 120 | # interfere with other NFS exports. 121 | sudo service $NFS_SERVICE reload 122 | fi 123 | -------------------------------------------------------------------------------- /doc/requirements.txt: -------------------------------------------------------------------------------- 1 | # The order of packages is significant, because pip processes them in the order 2 | # of appearance. Changing the order has an impact on the overall integration 3 | # process, which may cause wedges in the gate later. 4 | openstackdocstheme>=2.2.1 # Apache-2.0 5 | sphinx>=2.0.0,!=2.1.0 # BSD 6 | -------------------------------------------------------------------------------- /doc/source/conf.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Licensed under the Apache License, Version 2.0 (the "License"); 3 | # you may not use this file except in compliance with the License. 4 | # You may obtain a copy of the License at 5 | # 6 | # http://www.apache.org/licenses/LICENSE-2.0 7 | # 8 | # Unless required by applicable law or agreed to in writing, software 9 | # distributed under the License is distributed on an "AS IS" BASIS, 10 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 11 | # implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | import os 16 | import sys 17 | 18 | sys.path.insert(0, os.path.abspath('../..')) 19 | # -- General configuration ---------------------------------------------------- 20 | 21 | # Add any Sphinx extension module names here, as strings. They can be 22 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. 23 | extensions = [ 24 | 'sphinx.ext.autodoc', 25 | #'sphinx.ext.intersphinx', 26 | 'openstackdocstheme' 27 | ] 28 | 29 | # openstackdocstheme options 30 | openstackdocs_repo_name = 'openstack/devstack-plugin-nfs' 31 | openstackdocs_auto_name = False 32 | openstackdocs_bug_project = 'devstack-plugin-nfs' 33 | openstackdocs_bug_tag = '' 34 | 35 | # autodoc generation is a bit aggressive and a nuisance when doing heavy 36 | # text edit cycles. 37 | # execute "export SPHINX_DEBUG=1" in your terminal to disable 38 | 39 | # The suffix of source filenames. 40 | source_suffix = '.rst' 41 | 42 | # The master toctree document. 43 | master_doc = 'index' 44 | 45 | # General information about the project. 46 | project = 'Devstack Plugin NFS' 47 | copyright = '2013, OpenStack Foundation' 48 | 49 | # If true, '()' will be appended to :func: etc. cross-reference text. 50 | add_function_parentheses = True 51 | 52 | # If true, the current module name will be prepended to all description 53 | # unit titles (such as .. function::). 54 | add_module_names = True 55 | 56 | # The name of the Pygments (syntax highlighting) style to use. 57 | pygments_style = 'native' 58 | 59 | # -- Options for HTML output -------------------------------------------------- 60 | 61 | # The theme to use for HTML and HTML Help pages. Major themes that come with 62 | # Sphinx are currently 'default' and 'sphinxdoc'. 63 | html_theme = 'openstackdocs' 64 | # html_static_path = ['static'] 65 | 66 | # Output file base name for HTML help builder. 67 | htmlhelp_basename = '%sdoc' % project 68 | 69 | # Grouping the document tree into LaTeX files. List of tuples 70 | # (source start file, target name, title, author, documentclass 71 | # [howto/manual]). 72 | latex_documents = [ 73 | ('index', 74 | '%s.tex' % project, 75 | '%s Documentation' % project, 76 | 'OpenStack Foundation', 'manual'), 77 | ] 78 | 79 | # Example configuration for intersphinx: refer to the Python standard library. 80 | #intersphinx_mapping = {'http://docs.python.org/': None} 81 | -------------------------------------------------------------------------------- /doc/source/contributor/contributing.rst: -------------------------------------------------------------------------------- 1 | ============================ 2 | So You Want to Contribute... 3 | ============================ 4 | 5 | For general information on contributing to OpenStack, please check out the 6 | `contributor guide `_ to get started. 7 | It covers all the basics that are common to all OpenStack projects: the accounts 8 | you need, the basics of interacting with our Gerrit review system, how we 9 | communicate as a community, etc. 10 | 11 | Below will cover the more project specific information you need to get started 12 | with Devstack Plugin NFS. 13 | 14 | Communication 15 | ~~~~~~~~~~~~~ 16 | * IRC channel ``#openstack-qa`` at OFTC 17 | * Mailing list (prefix subjects with ``[qa]`` for faster responses) 18 | http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss 19 | 20 | Contacting the Core Team 21 | ~~~~~~~~~~~~~~~~~~~~~~~~ 22 | Please refer to the `Devstack Plugin NFS Core Team 23 | `_ contacts. 24 | 25 | New Feature Planning 26 | ~~~~~~~~~~~~~~~~~~~~ 27 | If you want to propose a new feature please read `Feature Proposal Process`_ 28 | Devstack features are tracked on `Launchpad BP `_. 29 | 30 | Task Tracking 31 | ~~~~~~~~~~~~~ 32 | We track our tasks in `Launchpad `_. 33 | 34 | Reporting a Bug 35 | ~~~~~~~~~~~~~~~ 36 | You found an issue and want to make sure we are aware of it? You can do so on 37 | `Launchpad `__. 38 | More info about Launchpad usage can be found on `OpenStack docs page 39 | `_ 40 | 41 | Getting Your Patch Merged 42 | ~~~~~~~~~~~~~~~~~~~~~~~~~ 43 | All changes proposed to the Devstack Plugin NFS requires two ``Code-Review +2`` votes from 44 | core reviewers before one of the core reviewers can approve patch by 45 | giving ``Workflow +1`` vote. 46 | 47 | Project Team Lead Duties 48 | ~~~~~~~~~~~~~~~~~~~~~~~~ 49 | All common PTL duties are enumerated in the `PTL guide 50 | `_. 51 | 52 | The Release Process for QA is documented in `QA Release Process 53 | `_. 54 | 55 | .. _Feature Proposal Process: https://wiki.openstack.org/wiki/QA#Feature_Proposal_.26_Design_discussions 56 | -------------------------------------------------------------------------------- /doc/source/index.rst: -------------------------------------------------------------------------------- 1 | ================================================ 2 | Welcome to Devstack Plugin NFS's documentation! 3 | ================================================ 4 | 5 | .. toctree:: 6 | :maxdepth: 2 7 | 8 | readme 9 | 10 | For Contributor 11 | --------------- 12 | If you are a new contributor to devstack-plugin-nfs, please refer to: :doc:`contributor/contributing` 13 | 14 | .. toctree:: 15 | :hidden: 16 | 17 | contributor/contributing 18 | 19 | Indices and tables 20 | ------------------ 21 | 22 | * :ref:`search` 23 | -------------------------------------------------------------------------------- /doc/source/readme.rst: -------------------------------------------------------------------------------- 1 | .. include:: ../../README.md 2 | -------------------------------------------------------------------------------- /playbooks/enable-fips.yaml: -------------------------------------------------------------------------------- 1 | - hosts: all 2 | roles: 3 | - enable-fips 4 | -------------------------------------------------------------------------------- /tox.ini: -------------------------------------------------------------------------------- 1 | [tox] 2 | minversion = 3.18.0 3 | skipsdist = True 4 | envlist = bashate 5 | 6 | [testenv] 7 | usedevelop = False 8 | install_command = pip install {opts} {packages} 9 | 10 | [testenv:bashate] 11 | deps = bashate 12 | allowlist_externals = bash 13 | commands = bash -c "find {toxinidir} \ 14 | -not \( -type d -name .?\* -prune \) \ 15 | -not \( -type d -name doc -prune \) \ 16 | -type f \ 17 | -not -name \*~ \ 18 | -not -name \*.md \ 19 | \( \ 20 | -name \*.sh -or \ 21 | -name \*rc -or \ 22 | -name functions\* -or \ 23 | -wholename \*/lib/\* \ 24 | \) \ 25 | -print0 | xargs -0 bashate -v" 26 | 27 | [testenv:docs] 28 | deps = 29 | -c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} 30 | -r{toxinidir}/doc/requirements.txt 31 | commands = 32 | rm -rf doc/build 33 | sphinx-build -W -b html doc/source doc/build/html 34 | allowlist_externals = rm 35 | --------------------------------------------------------------------------------