From 011cc58b5be9dd930d9c216cc9ee6ef311085061 Mon Sep 17 00:00:00 2001 From: Monty Taylor Date: Sat, 17 Oct 2015 16:04:41 -0400 Subject: [PATCH] Retire stackforge/rubick --- .gitignore | 21 - .gitreview | 4 - .testr.conf | 8 - README.md | 32 - README.rst | 7 + Vagrantfile | 21 - discover_test.py | 136 - doc/source/images/classes_Rubick.png | Bin 1107570 -> 0 bytes .../images/mvp0_demo_preparation_plan.png | Bin 35697 -> 0 bytes .../images/openstack_cloud_lifecycle.png | Bin 13455 -> 0 bytes doc/source/images/openstack_integration.png | Bin 45105 -> 0 bytes .../openstack_integration_tripleo_arch.png | Bin 51253 -> 0 bytes .../openstack_integration_tripleo_seq.png | Bin 22691 -> 0 bytes doc/source/images/packages_Rubick.png | Bin 219254 -> 0 bytes .../images/rules_engine_class_model.png | Bin 8794 -> 0 bytes doc/source/images/service_architecture.png | Bin 25440 -> 0 bytes doc/source/images/src/classes_Rubick.dot | 132 - .../images/src/mvp0_demo_preparation_plan.txt | 30 - .../images/src/openstack_cloud_lifecycle.txt | 7 - .../openstack_integration_tripleo_arch.txt | 61 - .../src/openstack_integration_tripleo_seq.txt | 15 - doc/source/images/src/packages_Rubick.dot | 103 - .../images/src/rules_engine_class_model.txt | 23 - .../images/src/service_architecture.txt | 36 - doc/source/openstack_architecture_model.rst | 93 - doc/source/openstack_diagnostics_proposal.rst | 108 - doc/source/openstack_integration.rst | 57 - doc/source/rules_engine.rst | 96 - doc/source/service_architecture.rst | 24 - joker/__init__.py | 110 - joker/nodes.py | 203 - joker/ssh.py | 124 - joker_test.py | 43 - openstack-configuration.txt | 252 - requirements.txt | 13 - rubick/__init__.py | 5 - rubick/common.py | 261 - rubick/config_formats/__init__.py | 1 - rubick/config_formats/common.py | 20 - rubick/config_formats/ini.py | 177 - rubick/config_formats/test_ini.py | 248 - rubick/config_model.py | 390 - rubick/database.py | 58 - rubick/discovery.py | 1038 --- rubick/exceptions.py | 25 - rubick/inspections/__init__.py | 3 - rubick/inspections/keystone_authtoken.py | 121 - rubick/inspections/keystone_endpoints.py | 82 - rubick/inspections/lettuce/sample.feature | 19 - .../inspections/lettuce/sample_havana.feature | 22 - rubick/inspections/lettuce/steps.py | 198 - rubick/inspections/lettuce/version.feature | 4 - rubick/inspections/lettuce_runner.py | 52 - rubick/json.py | 53 - rubick/main.py | 60 - rubick/model.py | 451 - rubick/schema.py | 614 -- rubick/schemas/__init__.py | 0 rubick/schemas/cinder/2013.1.3.yml | 1889 ---- rubick/schemas/cinder/2013.2.0.yml | 1949 ---- rubick/schemas/cinder/cinder.conf.yml | 1901 ---- rubick/schemas/collector.py | 482 - rubick/schemas/generator.py | 307 - rubick/schemas/glance_api/2013.2.1.yml | 556 -- rubick/schemas/glance_api/glance_api.conf.yml | 560 -- rubick/schemas/glance_registry/2013.2.1.yml | 133 - .../glance_registry/glance_registry.conf.yml | 161 - rubick/schemas/keystone/2013.1.3.yml | 642 -- rubick/schemas/keystone/2013.1.4.yml | 642 -- rubick/schemas/keystone/2013.2.0.yml | 666 -- rubick/schemas/keystone/keystone.conf.yml | 864 -- .../schemas/neutron_dhcp_agent/2013.2.1.yml | 84 - .../neutron_dhcp_agent.conf.yml | 101 - rubick/schemas/neutron_l3_agent/2013.2.1.yml | 74 - .../neutron_l3_agent.conf.yml | 89 - .../neutron_metadata_agent/2013.2.1.yml | 59 - .../neutron_metadata_agent.conf.yml | 71 - .../neutron_openvswitch_agent/2013.2.1.yml | 38 - .../neutron_openvswitch_agent.conf.yml | 47 - rubick/schemas/neutron_server/2013.2.1.yml | 526 -- .../neutron_server/neutron_server.conf.yml | 634 -- rubick/schemas/nova/2013.1.3.yml | 3238 ------- rubick/schemas/nova/2013.1.4.yml | 2888 ------ rubick/schemas/nova/2013.2.0.yml | 3229 ------- rubick/schemas/nova/nova.conf.yml | 7831 ----------------- rubick/schemas/rabbitmq/3.0.0.yml | 54 - rubick/schemas/rabbitmq/rabbitmq.conf.yml | 67 - rubick/schemas/readme | 3 - .../schemas/swift_account_server/2013.2.1.yml | 237 - .../swift_account_server.conf.yml | 289 - .../swift_container_server/2013.2.1.yml | 244 - .../swift_container_server.conf.yml | 297 - .../schemas/swift_object_server/2013.2.1.yml | 316 - .../swift_object_server.conf.yml | 386 - .../schemas/swift_proxy_server/2013.2.1.yml | 625 -- .../swift_proxy_server.conf.yml | 757 -- rubick/schemas/yaml_utils.py | 36 - rubick/templates/validation_error.html | 29 - rubick/templates/validation_form.html | 13 - rubick/templates/validation_result.html | 65 - rubick/templates/validation_state.html | 23 - rubick/test_config_schema_registry.py | 88 - rubick/test_configuration.py | 315 - rubick/test_mark.py | 35 - rubick/test_type_validators.py | 379 - rubick/test_version.py | 76 - rubick/utils.py | 47 - setup.cfg | 22 - setup.py | 16 - test-requirements.txt | 9 - tox.ini | 40 - vagrant/cookbooks/rubick/recipes/default.rb | 21 - 112 files changed, 7 insertions(+), 39804 deletions(-) delete mode 100644 .gitignore delete mode 100644 .gitreview delete mode 100644 .testr.conf delete mode 100644 README.md create mode 100644 README.rst delete mode 100644 Vagrantfile delete mode 100644 discover_test.py delete mode 100644 doc/source/images/classes_Rubick.png delete mode 100644 doc/source/images/mvp0_demo_preparation_plan.png delete mode 100644 doc/source/images/openstack_cloud_lifecycle.png delete mode 100644 doc/source/images/openstack_integration.png delete mode 100644 doc/source/images/openstack_integration_tripleo_arch.png delete mode 100644 doc/source/images/openstack_integration_tripleo_seq.png delete mode 100644 doc/source/images/packages_Rubick.png delete mode 100644 doc/source/images/rules_engine_class_model.png delete mode 100644 doc/source/images/service_architecture.png delete mode 100644 doc/source/images/src/classes_Rubick.dot delete mode 100644 doc/source/images/src/mvp0_demo_preparation_plan.txt delete mode 100644 doc/source/images/src/openstack_cloud_lifecycle.txt delete mode 100644 doc/source/images/src/openstack_integration_tripleo_arch.txt delete mode 100644 doc/source/images/src/openstack_integration_tripleo_seq.txt delete mode 100644 doc/source/images/src/packages_Rubick.dot delete mode 100644 doc/source/images/src/rules_engine_class_model.txt delete mode 100644 doc/source/images/src/service_architecture.txt delete mode 100644 doc/source/openstack_architecture_model.rst delete mode 100644 doc/source/openstack_diagnostics_proposal.rst delete mode 100644 doc/source/openstack_integration.rst delete mode 100644 doc/source/rules_engine.rst delete mode 100644 doc/source/service_architecture.rst delete mode 100644 joker/__init__.py delete mode 100644 joker/nodes.py delete mode 100644 joker/ssh.py delete mode 100644 joker_test.py delete mode 100644 openstack-configuration.txt delete mode 100644 requirements.txt delete mode 100644 rubick/__init__.py delete mode 100644 rubick/common.py delete mode 100644 rubick/config_formats/__init__.py delete mode 100644 rubick/config_formats/common.py delete mode 100644 rubick/config_formats/ini.py delete mode 100644 rubick/config_formats/test_ini.py delete mode 100644 rubick/config_model.py delete mode 100644 rubick/database.py delete mode 100644 rubick/discovery.py delete mode 100644 rubick/exceptions.py delete mode 100644 rubick/inspections/__init__.py delete mode 100644 rubick/inspections/keystone_authtoken.py delete mode 100644 rubick/inspections/keystone_endpoints.py delete mode 100644 rubick/inspections/lettuce/sample.feature delete mode 100644 rubick/inspections/lettuce/sample_havana.feature delete mode 100644 rubick/inspections/lettuce/steps.py delete mode 100644 rubick/inspections/lettuce/version.feature delete mode 100644 rubick/inspections/lettuce_runner.py delete mode 100644 rubick/json.py delete mode 100644 rubick/main.py delete mode 100644 rubick/model.py delete mode 100644 rubick/schema.py delete mode 100644 rubick/schemas/__init__.py delete mode 100644 rubick/schemas/cinder/2013.1.3.yml delete mode 100644 rubick/schemas/cinder/2013.2.0.yml delete mode 100644 rubick/schemas/cinder/cinder.conf.yml delete mode 100644 rubick/schemas/collector.py delete mode 100644 rubick/schemas/generator.py delete mode 100644 rubick/schemas/glance_api/2013.2.1.yml delete mode 100644 rubick/schemas/glance_api/glance_api.conf.yml delete mode 100644 rubick/schemas/glance_registry/2013.2.1.yml delete mode 100644 rubick/schemas/glance_registry/glance_registry.conf.yml delete mode 100644 rubick/schemas/keystone/2013.1.3.yml delete mode 100644 rubick/schemas/keystone/2013.1.4.yml delete mode 100644 rubick/schemas/keystone/2013.2.0.yml delete mode 100644 rubick/schemas/keystone/keystone.conf.yml delete mode 100644 rubick/schemas/neutron_dhcp_agent/2013.2.1.yml delete mode 100644 rubick/schemas/neutron_dhcp_agent/neutron_dhcp_agent.conf.yml delete mode 100644 rubick/schemas/neutron_l3_agent/2013.2.1.yml delete mode 100644 rubick/schemas/neutron_l3_agent/neutron_l3_agent.conf.yml delete mode 100644 rubick/schemas/neutron_metadata_agent/2013.2.1.yml delete mode 100644 rubick/schemas/neutron_metadata_agent/neutron_metadata_agent.conf.yml delete mode 100644 rubick/schemas/neutron_openvswitch_agent/2013.2.1.yml delete mode 100644 rubick/schemas/neutron_openvswitch_agent/neutron_openvswitch_agent.conf.yml delete mode 100644 rubick/schemas/neutron_server/2013.2.1.yml delete mode 100644 rubick/schemas/neutron_server/neutron_server.conf.yml delete mode 100644 rubick/schemas/nova/2013.1.3.yml delete mode 100644 rubick/schemas/nova/2013.1.4.yml delete mode 100644 rubick/schemas/nova/2013.2.0.yml delete mode 100644 rubick/schemas/nova/nova.conf.yml delete mode 100644 rubick/schemas/rabbitmq/3.0.0.yml delete mode 100644 rubick/schemas/rabbitmq/rabbitmq.conf.yml delete mode 100644 rubick/schemas/readme delete mode 100644 rubick/schemas/swift_account_server/2013.2.1.yml delete mode 100644 rubick/schemas/swift_account_server/swift_account_server.conf.yml delete mode 100644 rubick/schemas/swift_container_server/2013.2.1.yml delete mode 100644 rubick/schemas/swift_container_server/swift_container_server.conf.yml delete mode 100644 rubick/schemas/swift_object_server/2013.2.1.yml delete mode 100644 rubick/schemas/swift_object_server/swift_object_server.conf.yml delete mode 100644 rubick/schemas/swift_proxy_server/2013.2.1.yml delete mode 100644 rubick/schemas/swift_proxy_server/swift_proxy_server.conf.yml delete mode 100644 rubick/schemas/yaml_utils.py delete mode 100644 rubick/templates/validation_error.html delete mode 100644 rubick/templates/validation_form.html delete mode 100644 rubick/templates/validation_result.html delete mode 100644 rubick/templates/validation_state.html delete mode 100644 rubick/test_config_schema_registry.py delete mode 100644 rubick/test_configuration.py delete mode 100644 rubick/test_mark.py delete mode 100644 rubick/test_type_validators.py delete mode 100644 rubick/test_version.py delete mode 100644 rubick/utils.py delete mode 100644 setup.cfg delete mode 100644 setup.py delete mode 100644 test-requirements.txt delete mode 100644 tox.ini delete mode 100644 vagrant/cookbooks/rubick/recipes/default.rb diff --git a/.gitignore b/.gitignore deleted file mode 100644 index e435250..0000000 --- a/.gitignore +++ /dev/null @@ -1,21 +0,0 @@ -# Python stuff -*.pyc -.idea -ProcfileHonchoLocal -.venv -.tox -tags -.testrepository - -# Vim stuff -.swp -.swo -.*.swp -.*.swo -.ropeproject - -# Vagrant state -.vagrant -vagrant_ansible_inventory_dev -dev.out.txt -web.out.txt diff --git a/.gitreview b/.gitreview deleted file mode 100644 index 70c407c..0000000 --- a/.gitreview +++ /dev/null @@ -1,4 +0,0 @@ -[gerrit] -host=review.openstack.org -port=29418 -project=stackforge/rubick.git diff --git a/.testr.conf b/.testr.conf deleted file mode 100644 index 888f7de..0000000 --- a/.testr.conf +++ /dev/null @@ -1,8 +0,0 @@ -[DEFAULT] -test_command=OS_STDOUT_CAPTURE=${OS_STDOUT_CAPTURE:-1} \ - OS_STDERR_CAPTURE=${OS_STDERR_CAPTURE:-1} \ - OS_TEST_TIMEOUT=${OS_TEST_TIMEOUT:-60} \ - ${PYTHON:-python} -m subunit.run discover -t ./ ./ $LISTOPT $IDOPTION - -test_id_option=--load-list $IDFILE -test_list_option=--list diff --git a/README.md b/README.md deleted file mode 100644 index 7392e7a..0000000 --- a/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# Rubick - -Rubick is a tool to analyze OpenStack installation for possible problems. It is -a library that provides a representation of the OpenStack configuration and -inspection/validation/analysis actions on that representation. - -## Config representation - -The first step to create representation of OpenStack architecture and -configuration is a collection of data from an installation of the platform. -There are several ways to collect those data, including automated discovery from -different sources. The most simple way is to parse pre-populated directory -structure that contain configuration files of OpenStack services from different -nodes in a cluster. - -With more complicated discovery engines, it is possible that those files are -collected automatically via SSH based on inspection of process list at every -node listed in hypervisor inventory of OpenStack Compute service, and even more -complicated scenarios. However, that is a scope of specialized discovery service -which Rubick is not at the moment. - -The next step is to organize all the colleced data into single data structure, -called OpenStack configration model. This is an object model that includes -physical nodes of the cluster, OpenStack services and their instances, -configuration parameters, etc. See detailed description of the proposed model in -the documentation. - -## Config analysis - -Once the OpenStack configuration model is created, it could be used to validate -the correctness of static OpenStack settings, as well as the dynamic state of -OpenStack cluster. diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..9006052 --- /dev/null +++ b/README.rst @@ -0,0 +1,7 @@ +This project is no longer maintained. + +The contents of this repository are still available in the Git source code +management system. To see the contents of this repository before it reached +its end of life, please check out the previous commit with +"git checkout HEAD^1". + diff --git a/Vagrantfile b/Vagrantfile deleted file mode 100644 index 43a1a6f..0000000 --- a/Vagrantfile +++ /dev/null @@ -1,21 +0,0 @@ -# -*- mode: ruby -*- -# vi: set ft=ruby : - -Vagrant.configure("2") do |config| - - config.vm.define "web" do |web| - web.vm.box = "ubuntu12.04-server-amd64" - web.vm.box_url = "http://goo.gl/8kWkm" - web.vm.network "forwarded_port", guest: 8008, host: 8008, host_ip: '0.0.0.0' - web.vm.provider "virtualbox" do |vb| - vb.customize ["modifyvm", :id, "--memory", "1024"] - vb.customize ["modifyvm", :id, "--cpus", "1"] - end - web.vm.provision :chef_solo do |chef| - chef.log_level = :debug - chef.cookbooks_path = ["vagrant/cookbooks"] - chef.add_recipe "rubick" - end - end - -end diff --git a/discover_test.py b/discover_test.py deleted file mode 100644 index dc972e5..0000000 --- a/discover_test.py +++ /dev/null @@ -1,136 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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 argparse -import json -from itertools import groupby -import logging -import sys - -from rubick.common import MarkedIssue, Inspection -from rubick.discovery import OpenstackDiscovery -import rubick.inspections # noqa -import rubick.schemas # noqa -from rubick.json import openstack_for_json - - -def indent_prefix(indent=0): - s = '' - if indent > 0: - for i in range(0, indent): - s += ' ' - return s - - -def print_issue(issue, indent=0): - prefix = indent_prefix(indent) - - if hasattr(issue, 'mark'): - print( - '%s[%s] %s (line %d column %d)' % - (prefix, issue.type, issue.message, - issue.mark.line + 1, issue.mark.column + 1)) - else: - print('%s[%s] %s' % (prefix, issue.type, issue.message)) - - -def print_issues(issues, indent=0): - issue_source_f = lambda i: i.mark.source if isinstance( - i, MarkedIssue) else None - source_groupped_issues = groupby( - sorted(issues, key=issue_source_f), key=issue_source_f) - - for source, issues in source_groupped_issues: - if source: - print('%sFile %s' % (indent_prefix(indent), source)) - for issue in sorted(issues, key=lambda i: i.mark.line): - print_issue(issue, indent + 1) - else: - for issue in issues: - print_issue(issue, indent) - - -def print_service(service): - print(' ' + service.name) - print_issues(service.issues, indent=3) - - -def print_path(path): - print(' ' + path.path) - print_issues(path.all_issues, indent=3) - - -def print_host(host): - print(host) - - print_issues(host.issues, indent=1) - - print(' Services:') - - for service in sorted(host.components, key=lambda c: c.name): - print_service(service) - - print(' Filesystem:') - - for path in sorted(host.filesystem.values(), key=lambda f: f.path): - print_path(path) - - -def print_openstack(openstack): - print_issues(openstack.issues) - - for host in openstack.hosts: - print_host(host) - - -def parse_args(argv): - parser = argparse.ArgumentParser() - parser.add_argument('-l', '--loglevel', default='INFO', - help='Loglevel to use') - parser.add_argument('-j', '--json', dest='json', default=False, - action='store_true', - help='Output result in JSON format') - args = parser.parse_args(argv[1:]) - return args - - -def main(argv): - args = parse_args(argv) - params = vars(args) - - logging.basicConfig(level=logging.WARNING) - logging.getLogger('rubick').setLevel(params['loglevel']) - - discovery = OpenstackDiscovery() - try: - with open('test_rsa') as f: - private_key = f.read() - except Exception: - private_key = sys.stdin.read() - - openstack = discovery.discover( - ['172.18.65.179'], - private_key=private_key) - - all_inspections = Inspection.all_inspections() - for inspection in all_inspections: - x = inspection() - x.inspect(openstack) - - if params['json']: - print(json.dumps(openstack_for_json(openstack))) - else: - print_openstack(openstack) - -if __name__ == '__main__': - main(sys.argv) diff --git a/doc/source/images/classes_Rubick.png b/doc/source/images/classes_Rubick.png deleted file mode 100644 index 6a17c6ce0557fd18a6689ff463e8dd275a597f55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1107570 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

W>Jh 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

4UHOTLk`V|L;$eZ?{>xqbJggR`y*{v6n_5v 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

EH6DH6sD=I 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 z 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ȉ@u?k)u_cn3#7D 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

E)2 zhL72cq9Rwu#U$qyH3Dm!b+4G@wzX+$;Uq|x{-;)ZbKg)2$Ddly(TCIhYpJTfp#~rq zGA)Ytx!nFteBPPig9pQCMg)DfIb>A=Af%Fm{_wW z_4;+>cZl0;Z!&TeY_P#wo<>dCg>}O1%uF9&ixlaRFK2AkBcg&NV^f3UIDhn)X93Ps;OKR>EF zo+at>Wq}<&Yt}wp$u|zi&biJ!)dQ0@~4T;@&+}j^GpNO{%g2RWf z@t7KiFB{m!xNwr8_qwijXA~Rq^sOR3?Us@Yb~PMQZnUV00?#X}pujBonZ3&dvD>qy z5^mJCNCW8IKo^4~z2p67wQ!;X!X4+$DU#VHYm{sn8XU}dV4#e_@EC3FL*>c9AI#mx zKs4ev;D%M?ppI8#GY!SnE1o<%HAN*i(M zv(xO??FU+@jop7SH!aie-Ptj!Y4acNl^;2KmS^u9x(ZF-jn)*VjNS1Q)U@3gzfw(~ zSf|S;&o=D7)aij{ug70fk258k_1#BKuvDU|&fP#c-baSnnxNB0QFZw6x8t2L;CfLe z^?fuI$+OrHYs&=-f@{l^C z-uoMm7ELxvEkCEbMDvZqo455kO<%gI04YdqA1|yZ$7wx}gDn(GQ-=L!=Yn!HCDN)z z6Wpc*kJ~z?N^4&C!y+amJ#&nHlOy4TtirxBy%nFmu8+Lkj?*8rMH01Rx*JTEoK*F7 z@pQKfyVqOVPiUh**(l9V>P)<^pa1z`CpC$sMQLt7;o|zeMuz$^>Ji9mT`)_m?U8WNqm=*i$`}t6A&b62k6cUz#LtqAO@p`Jh3GDpD8v?kFI6o#ThdokX4DKOU4=e-3O6NHGG} zMR!4T8{<6}Bj9AHZ4At+M;IN_88B|)hVJV#3=9km7FAUn`Sj^#a`N2_amcCJNrzPw zvFzZuFHkp(wDkJ$+iX)q&X}eO)M%K@PovXEH6t8}6;2{{mm}d3GCI8vq}jB|fH~Zq1CyaN#w;{kID7FA;ccbI zt5vq&4`<9l^z+a`YY_w#J&3yp-ZLTD0E|i<69`A@S-6ffY1Yd7aBuAdv?44 zP0G-qm6yZGNOS=WhP7m`4h$nKm4CMx5k=wg^^IxQOOh~!lw3^EmfKsY-8VE6ao1Zz ze?qF2$o;hB?RV$(UmmXPHVF6Q%{e@(Z`d`>Uvy~>lgsoN0^%U##Gi#{oxt|W&xkgd z7-?V~fOZ+)guum4Q}YF-lQ~yJJk`8B$^WCuE298XEN(H%3!JOZ3T_4(GLn9YGN%b? zUFaAwx!v~s?!28`QHq84^32)!D5iAN{BNF>Gd=zl(@C3$%@Xu!}Ag!1#J3I=G( zR^`qc96EoylbHOTs~2BM>=o;6C&(QYR0N>6oR8%Pxu+ypdbSf7FMgIo~Pwa!JWT-l&%Cl}-LT zsU;&iw?*>mec9lPfd-(*!-uLbmH2;OC+)wgU2x2*1mowStE_VV2MM0w+|GM2G;r=f zsL4Z}J+XO3oHiqU{#>PNFM4~SbwQjBOsgtJR(7X%`+p~+NAuqWu{&mWzhjHtA{ZxYwN7Y{yrxlRDx9xm=ej!2X{?O5v{tr#nPGq0E zNw53s*Htt!5ZN)aupGjbgiw<+8T)-6yF%Vb?X_WIm)daJC&GG5?e_v$e?)t0t7=7O z|EW9m&eSA;Iv?47Q#}RF8Cu~OK&x2OSwwNeORjcJwpVk{bqu~`asgm@CTMyYw}=|N zbl0!Fy-?^~_3dN+TN=nxT)ki!0stX5{YMJ`SM%DG;x+MOKaa}k$2Fe}b=DU4-tje^ z^Vj(-xgGpkCxx8-9&Dr3UJ7)1`-T8~{{+UPXc-$p<`cESzM;Ra#ZcH zx-rxB@_gL|ntwZq8RdDYem7qIbXbJ`_@RdpZ+0uVU?`?~D3Em9cJO`E?c4Hi?~E__ zS}6;B!Ysd)er+@g^_!sw_}1Y4toD-V(r9M+f_8YVb?M276lWa0=wu%cA6A>pG zd04%@zII9V+}R!(9lbXb_Fx_yYqUL*8yY_b5>8P*M zL<-h_{Rt<1)R>Z;<96QuI!$jtOkQv}Zru&x*{9z#ZrHH9|G1!dB|EKWbJnPKh77v@{}Pp%Ynsyp6?)J=Nh+aPF;T{=W8KnyB8rN5nyyYKslhoqPhbz)2hoE zIYk>Q=t9LQ;a z&;ZtYCtw}{CyxgfzD(Th75DBnqG5*H1B(Erz6Rd^nwgb_j6h_ORKmsu2$4=78Vw+t zDBlP@2WPgB0zu#r9Ubg&<=wyE0`xp+1Be4*L~T)dw*8?^EXUUCO_$LJLUD%vu?mbG zb`8NDO|fAE-3IHGd(>Q#h2t^t&Vt!=*>t-g`s zwf6@_T#L=_eT6Cu-7)eoE`gyzsNtUTT`eaH0(R!a_q;m7qw~S`=>4h>Q&UgA&h+0* ze6G*`^wxja;+-yqmc&fZooCR`!N>qi6*ybE|7-_vFIg-D0;J{tfY zQZ*1X%Dd?UvZm2I7l~*8t!U!Hdsh{ycpH2ai=V8A&W|TR$Lt~o__9TvuWEn zWtqTP9cmqH{q`99u;JNVH!{qUolW(!+hp`I{Prlm&o4 zgrE&#oCHbV*rW2&P-Zi$?eSn|?YvDu;3wa<7+t)^7TucnWya{Skz;qSjDTLc1{dp7j2}HR0(t7Ps+`IqhN9#cHr;zaJ zo2h2Vzx~cKq45wf4mLy!K{k<>7ZHKgps#@k;fw8`ADkP02sJpMQeX$%|Ih5ZtD_tC$tJ%1?zB>>G*;n-pDwNIeJ|g|%g=9+7^m6`nVOvHQs8_iI=*MbdMR?t!QRN>#w86wGplTP36B5Q;~*6FaI791G)(sdvFV(EmVZG1HAt$fu~@Xp%=p89uMi|AFYs$j*Z#}jsmFgEFls` zze#N41|n9m4DJ&BiS@T~#v3t#H<~j?gtl#>rpDoeCJriDNQb}o8(VdZZWpwA_0c>M zagU-%RRQub{V)Ta465IzEnBL~%dcCijGcG%L4ZlG(0YkKi^RZiLjwY)-yXZh5zk^B z?b0yP`&u#jb3b2{{QmtqT~|5u)KdWraAZQ5RJKXm%IZC)1iZYP&)EZhk{kifyoJOA z><4@foq@^I1)bg6$zl_5MBaxUA8^^$ojV176ek{LWxm_h#C~?XI|EN!BhpB~=skJ_ z4;FeW6e;ir@wJx|*63hD#!`{ojv=xpF)ZbXBXA#S_i^?VgHhgwx;jEAi6Q|(i4)$L ziOC>-^+cd=?VR7m{_LWn)39jZSb~NJDon_@u3*!BHC8j>h5-J%Sle5(qGfqMJ3t47O@Im(wFuIDSP>3j~k@t;PtjW@G2M0Dc#s{{&&4o*A_ zrQ)k_EZb?Y`Y-^79~Cj5*^_dQK>kFGvo{x_OA&^GO=u7@5?grv zkIX#gzac#dP5}!w(6KDAx&XCV0<7S4pVN+2-L9_lAi4})6>up28$6}Mg(xoZ9x1%U z`$wpsRrE4yi>K0}N^s2K`j;UU6|h}<-nIGQbUw64^9MJEkArL?g$HIzXw3*Ks*T%Z zPD&lOKf`eRbpP_eFtkk620*+|GU->pZZFC-QjY>KQXwmWY#lkn8-7Os>|!8a{Z7xl7>BvDIbL-B(l;|E%OSniw2Jb5 zGVqi6nNa3%|4oG-RHs-LHC+!riO7NIAAm3v|AaOUM25b851P7&_Giz)vM(%nbGmtW z5X2iEO3Ma+Q+<6`048|g=fA$awg1_MnSI>c4Zic2h0Y_5OvN2i(ZzmnoFNgo|8srT zPx0Tal&v(`60~J}q2`pWt+Gn5`u?y=4_d|5D1p?>*=PIG)5{fHMIx+isR z)W_>GZY>o(en^hhV`>*oQnl~Kmg&!GzG62^^8MMWV(!iMCmb1gnF9+Yy;gof!STib zS^9b)M$>m;`P|xrF%8@dB;L@hu*nA$-5tuuZ0`9uSmE?K_u6~peY>VRNHQ0qTd(UX z>PmH7V-d(G7j%kJ-g>5%x3ED}O0KT_I}G{Ha%KE}YS$^YiW2|t%lk4VV0JXp-9}%Z z{_xwygyNdNkpqujAv6=zOIAN1S&9%wvmd_d{OZgpE>k;(RINkY->;Gxgs*I-xm^8h z;NUmb^;y!Z-;H%oNAwZYE7HoA{LaOf-=gY8Uj$HEAnpV@A^#0Y+gx`-h-Z(f49NZk zV@0_=IXOA@=m%$~zM!{sbmV>P3Z3}ux8AiQ^?Y%Hr5dTdz`02ZGIvu>_4rbdvcms1 z+IQsXfBoj_)mbWoI|dqENQkkyLFN{DLOQi>z2LSmt&TmKjg{5a+^V*WH^#OfVZ5sO zN<%}0i|tjS+Jqw+aVNb#c+9982at*w^h%f|%65y@d(S9!9Y1)rFhBo|Wo1)W(PYm=%VoE_JEAk`BRJJ!`FDyw>S>gBdhz;MkHrD3nRxUd{qf^V`NhaSnUs1b zRd@ORId1REoA_16YM8Y)`bknK(*5nfInu9d5`O2zP0fYn_bSADQoUz!`&pa(zB8`unwt}y_%?WK04xY> z!MjKZ0N(oY+N_|(ymQ!myR!aq87&$97Q zYy*qrnVkdSND~46VaFq=@8aZyB@GloK-tRlQ)GM?NXXEA{Gn!mAUTw|-s*_vK-9%LV|u>jbg zeq>lcrSk_W8kr6V!GuZP-rk6yhS;hIM<6LSIk|vA<+Xe8kut7NG{q_=2N>S#v(aJg zF{aT^ztrBh7J8L{W{bMna4h=?-E`;Yt|W32QWsF-QAKd#LBFo2e=Oe+UO=ZSAy$XO zAHK5=BkZPA98fW0hBHqF;ikILyBBJz37|<=S$g_kzOKX$uoeG_@B?oOTdG_9}YbI`YRO+{$sEnVitCO0I zduq0Ady;kzLnu(Cfc0t1F718QA}=@8ys7ipL|R^15x3{owfLCND|U>?`X$jZF{uRr z57*QC+T*)AUQkfq|^v-%FhbhfSlf{dRQ6_W@_x$3YEZRKf z$oti9zI~~m)5W*iZrm zR)%}U@om>Nc`SZi-7%5E$gddB6kaaF?t9Ub-X`n=Z&F0OwU2Tab=i{h^soKvt~dt{ z_H2D6!9-6l0zoEeu;LVLmg8x01S7-MfHsilMkfeL2;m<7*i9S9j)qkl)D?JaUlri9 z9=(^D7&!y8{pjCyY&d)L*Guu&cPA9cz&<}stPELvX5d|OGYtd zVaeCu5iB1u6T5nAJB8vneRjI)6ulzdl?`S}f6l!-6vkRORp_Qv;@M&Y=5!>akX?6v zm*4#4dJ#$Ly>L?dUto)H%inTVnlX4fXY#ecLfbM}}dHA|ny z5W_Dn$`G-A-+!;eTWFzH{LO;nyzB_g?)$?7)Rde|2NP^k^{O+)a!Z71K7RhZk%Wc@ zn2eXFrx6b$vNS;2Vemu@f}l*GhP3j9xN8#Lp(av;_c=+4I znd5Y6isAM|~@+0R9*>Nq1XQzXL{Joosi zqjcX@^#*Gj~@KFSglUh zM8qPz44Yjtj+TdYTimIAzNFCqA=GhXw}~W2&uJt;60ta#Q?MwTw1=D9joj&ef>9Vm zp}^D_XhTe~X5$-~0+g7C>);N79LB;R9upc8^m>}vNB2f7X}O;}*DdbZlG1#G(v6<})<3lX&T1plorhnj?>NUce%~AB zR*;1NfG~iosH>AJz@ueyX!0rjfNCj!2?Rlrk;B!effj-KYk&Uy)cRt}`W++;A2^}_ zw3=X95dbuRPkMZZZ42l*;7!0Rf_U=f*Y8(1kN_a@31Yk6j>2u(cG)4~%t|$Wn}^lw zLkGVPN`>I`JhX4$<42FU5Y!3}E*zw%O*aPp5!|=spC63@k_EpkBzf@u z!e^bC$r%{92ESWeE__@-m+xa)JD>sp(|BbFlo3G&m2#yW$A0l(i>|Bz^Y{qu2)5%B zzofi5MMqaI|GrAoB4br1QB?X6oT!A55G@HHwp}0t3kwwqrbk zc1jxtnw>5)w{!=ej6SjQBuY}87t~aOk{@K9(Yckx)&sRsBh71vd2U2;6QQM zBOpMtI=xx7x$->a$!}S0I`({d?ziX2Ce&wqZ}Du{VGR-II@0XSw#D?C@#LdS&5_a- z$*oFsn_5SX+b;25sDEu%M%Q&2HUu(-BS*F*wPTk!``6JJG$%k(lIL?m=JF4;?bt{h zUCgxRhd*b!R)ks~UpUbDeZS==DzC5==-o)zx!wLT-M_&D65isE7;`q0Muq9O0d`aT zO}6`V9tfZ4o@=MiIyiLiKlZOP@TI1^dnJem0Cb>?ai3|(-7`7`)B^+Z*WT;uy3jb^HW(gHK7tEtJW`37O`joT^f>N%RYNMsl@#4R1RUksfxRRM7U#crWSD> zVv|JZ1`r}BEP&V<@Gt_Q#6@z(b~_RxR*;NY4?+YF;GH|8uv4rf8HK1NWp3TJZ9NIz zk^9&?hKU3+et`I=?$ls6tRJ9T9F4e{ueqd;nz_x^uR%(OY`_(;dpN%^`U!%5x#niFK4ta>1EH5vU*s=Z&zDTv!F1Y{e>ipMV zY}n&-OMoTPk#L#3F_40b1}OFL-MavMLJ+cXey*pZouf<}`Fnx;+gF~F5DPuKk*Hpq z?q5k;?X>Vs@;!i96aZd5u*@K_A7G`2WT9VhYpeFN&X3zQ0^g)mD}V7G-NfyQUrs6o z9tIQ;-T{paJ%2ohm`$^F1)g5>-N5PXcH3H%_eJJY)@Xl=<{wjZ6xZ02wA+$dJ_)?o zGoBg?0Vzbm*V01lfPw%|gvFQXur!5YR|0^YUzmGpYP>-$wBVbvu?3Qc#{oKX^K@X6 z%m>fihAj=zfNpN0M7u)Xy0?Ht$I1#xu^-q6z?~!>et!6;km5Sb)~M~XQV1!c z!KIG(@bZz0EbfDvuf}T!W03@I5M0}!`kUn*Z=wC$aXui93S&!bdWfmITcXYYE~n(_ z!6vTvu}@ANo68kq&cPlmI#PS{x={2R=VixTeVY(KO=gWEfakyyF+J{RHrQPeZ$U@GK7(Uy`fNi@F~R$U+fRySzC%cGHF`dhH(=jU zx7y2+^9dT3f@y0(>=D;)e;dJ+!iM7yx9jK6!1tv{H32J9b^;+5wbfsWpq43QzCCc&?>nB}q$Bmw{vzv%l5LD|lJKr?K zH;u`|C**v3Z&cZ47DLuVV!F)6HV$k>)#?%mnHeg?&g>7=04oU@V%KDLLFYbkF|j4zOt;MUgmubdsH^_qof7`7(P$DSG-I zqtk}nRZXm-RW4CgWH+IPhEao>vVO-$*y8@p>(`M2?138? zo@(Wzd8F{Vv+cUKn;#~B(sx9A7#kT80c03PxW2x7_YU`MaY4Zn zq}62B5XFXMj=wf(rm}p~cm;>D3Hi&~>&4}!Avxzickom!ML}M?>q6#c3);QcKBO@I z3u6h*hS&^VvOSk#ourrTfZ7r(O|bzByzsMKl?5>mz}JhliQ=ilj0`Hi19H@(BD3@J z;O@|Y{iXH>hau%TO&NH#3imtO%HM>?6?8QGq68-kK@@DMJ|`!M$>z_0b3wBaW>=(p z2SykrbPdb(g^l}V1dg&-K@9jDk&HF~@gW zdquHFBpq-Y)gUFx_>^OP&+Bq52t~L03v?vWV<5vU74FNOJBjUH&=P=8Sl5I?f>Rey zBRU6&)M1JuS)+xM5mntMC-?64YiW6T!tjCi7#@5W2gpb;arS(i1p0vU3v&=cV&*K8oT3$_zqAEVY>!9UKE<0GTP0m&;EukkCQPk`B6!MnDo*Smq;=*+^ zGcyR{LaYL7p&BA)YS=&@l0HB-IS&h_msdL6a^RT9$KWvZ|K7ZD^cxV{sg-P*z-Br^ zm4>~NohZWC9zTHj6e5t)7#i){)*G%rzeY$m*lr%|^^XYsQH|BlN2_ph`R2)FH;TY6hYSm)r#A}!#~#D-}1qu0%M7X{ocU9{ysH8!*9j{KP; zuQNPlX4h|p*XRw0ayY=IdMri7hXP^?m^Wg+bN<(wq!_iivDPj^q|FXTHvk+&r;JD) zNfyh`$iOn&o^y+oA&K%xHsv7g*}E5Vw1NJ9m^K(lxX^|)&k$Qu5lBmvV@OkiM;MNg zu%qoQK5jjI0Y6@O{#Vk(8vOs_ME6PdOR8q-4TW z-j_npUULL?0qOaMz60&7@A86(&z?k&(KUiC@2v?ev~3@&m|QYoqIse8j@a%8<$;xj z1w49(ZYZX(G-b40`ZOS9zygo14# zAtFJ+w7|m#bS0!TBj|Se-v*C#ZwR1~4?Y0`5EwUjNmS-DFLI*W9vlsf#J^|S>q((l z6usTjo9v)kgaoFi;^3Z!3x1@$f`UxL@N$0IEnALgXdHw*0ZY)%ocRikK8zobP1hD& z#X^{UoNPqRQNqB|u^R`^4h!gM+I4-OP;cg-pl@kAM~{Aj*m;MNhM6XEM#WKS#>5fN z4`>b{0fEz4I1AI?WMN5=L5Fy9wY`n+QO<+0);;#Qm#Hq}kOBiNU99OuUR zAe`MeZV+CmP8~J^vkD^f1a#LO6F&Mbnd+s%3A{9*UUs6U0Rau2oh$HGU}p@zg0DyL zB#TsYTy!EoK=1;XUV)03A%_pmiQ{$Md=m_zn1YD_QdFqfB`^pw$WS18&-WWoaP{6i zWb;&oF3acL10TTsMfv&2!5o3hrG~9E$?3?`c&Rp?(2%OM&*BrtzoE^O!I%*q9*(+3 zR4j%+6^qT`pA{>sX-c+g|I&~G>{l?F!%c%=I0yjV6TT6g=zFyKhx46f#KX#|(I%0T zAp24_>TB1nKcBeiskUqgd&F?!BZn*f6n-pCmTkvIM8Ujccy45iWE@Atu!*^I(XV(p9sWHtqn>bKYI9?81$~~2F(>PL z2pe$T8%i`!rAmc-pb+}{UKM9SvaHd4qTnbA?_XxIJChDjxjIX?GGi)Z4?{{E4x#Ng zk~uY7MZ&fJssSzD%VR=;`ish8#P(g9M^O1nOG^I2XhQSI(Ad~{ZsP0L;vV#~KXIZ% zTQ+z68u`N=aCsx0BANIz$n|J)YKn{Znb~5crQS5C~@{(mym%u zCSXDH8ewePfw~Gm^>J$}7P76YEKy)lI(~cz{|AM#9k93@dE?0#COTbBP0o!YNdHF(haERmu1rjQl7;eVNAPmT z9qmmql8TFUA)g0;35bycxB^~-jMnMV(H0LcS63FSPe!MP4qiK(HH7^-J@5tu^#RX? zSQ1O(3=K!WeJgQs$hrDqZ$T(93$i9cYP=S?DR_0sctyC{pH6Dqo5zp$9XjNLNKSZ6 zaHaNMjW<<~;YfI1Fm=|tIW`;|G-MfsVVsjQ6CD`@B{;LT4_rizK->sf6JjqWff;@M zDhDq;X8HUD9}FC%5AebRIRnlGHz7JVsm1~{a}+^I6Lani7rBD1_}t&U}(BBTduN4RM9grZ6Ki*Gilwvc#-_~ zJ&MoM@U0}7bGRb&dr415v-dSC?jb$~L-WC)y5mL;lpK`1X)a-`Dy(r(mYoJ%9FbIY zZdfV&1cr94tz3SNPtkApj}_8khf^9MBDAo#u&_YS*{=+*4i6)>i&LRAwNvpIUgHRB z74(7t(Z<3-ny097U{D?N{qcuK>ldmQ>ljG9w`1#*hAkdtA@n_zeK*fFd)+bQyF|m1 zIdiR=q9AXdk!f!mVt)wP?6{7~p~=gp%3;vCaFJ+sNg3Lv#c~iSD;>}AbMq;nqRY`V z7YkFrm6mz(A({jnwPeI9mXMCzJ{_~~c-V*~xMGW4>4)Nzxbq0-0hSHc0=%;!AtUzc zK8``{ncQm|ef<;!4h@xG*(~Tw3^&WfaPtdmqDA?Ct^9ibV*IwwRknaR1Cy-#*6urO z%hD#5{l6mHuq{{2E$ULWWOi?4-pN$oBh+=V=`yWqt&ME!<;2C0wbFv2bkO!y-mo2E zTPW~DZfdr4M+dx}sCBlnqaWlS)rV~Bm}UJt9csl}haH~CwJ#tIqS%_M6wZLgrg>_8^6SllT{ZYJhp{h%s-!OQ20*zMo9B;+YFb@MB*b$f#$0wwpK5fje5nG^j`@yr!z%=J*_rz z;)bJEgT$Wd%aNLJ%D>6dMMQ|9Oy0(#!a@W2_)uxq5;ncpWV=W6kLDZ7?+cSD$jj3^ zB&HHWQ)aH>c!K8%d8Q=8fccI?Aud@bMemjl9jAI~FH2uWS^9v(J}hEI{J6uXnAR$J z^B09VIc=DnU%f&+j@k%HxxZ6CY9lwhna>A(k}q*s-Ep+{G=t4?_or&x)h)_OlTrn-{iyj-;fH@7VrEM%vr9e%*lv9g?qP5i%*qXi%i{y(;^YN9A5(^m z2lL3@_IRdzX0ViugdtA*ZiFfWE9)i_@L!24PHtOFuy}m&xtTwPi2$}N%o(>d`6+tH zr`72wdRTc8wdcdE-+l9B%2fqAiVSs|->;Tz1{4itz3_U z0Y%`M#@hoTjxo0wbUb~rh+u%cjJ!DaC{id%AHICCFf)4+osCl-d>$z_E)L(wMnVE$ zwC_5sU?XEk)~={BuGuz&XaTWmc_2Qd58(1Xek3OWFEOTtdYt~{7}|Og9V26lo>gXn zAs@We+6PV;LIaypjIH4^t@fI4{-`9B2ku=qqhz^!{P~Y$ius?)Zve&3vwRDi#^22=E5R+x2a_H2vAeNzaj((8a(#tl+58u}D~4Y{q+YaVoV8sKy@TmNx@oRH z`m#!{hz|PfJs%h7%iOz82;FSs>+q<&e#6~GC$7_;Dy{PSDMs6_=XsP2X00~jpZM^2 zkb*#hjbFb@r+=Jz+67yjQq9y~N$lV>2nmWvx;Pd24*>-IZ|BPHuH6toEa(W`$R+$Z zBm!l^0wnYmI5>nJd|#Knx1$b`6=-a>kYM6=;M|*D0_K6(W`u_l?PPJWAOb-E^uvmD zA`$&kZg#dTSQZ@eAOWy`plR{hnfr(fLW z88IsG5F9I4hvea#)Xz>ik>9t43QIYjty}XG$6sTU9t7-I1$q5C@NsGq2ngXS%bV)Z z;F=2E_n5kw?;*m1)&u!MLpaw42%G@tFDR{?UTVcT(r=X5IknDjo6fPRF^X}s93B47Y}XRq5L^_K9n|n1;glFj;JQ`X&4z zMHz#(bb$WZ8V7Ut`iqv`ssqxVj>oM7_CoUUA0yyEU*GsYYM4`)*pq)NVlVBf#KgsQ zu!e0#|J=EAc6NIo31iUfV>0Tl>yEIF`bR%52Oo0E<#W-lGrytr+0TKggjDJ~?{r20 zrDkIg9?JtXKd@$ptO-@FKaQ}Uk-U)_LU90N;0kH$p9%%W98lG$K2UIo1o|&hP*9}& zfwL!3;W5yV=n(U)XP((v4*HLnfHwx!F90R^M=k*7TDRR3t}Fb%PWk&kP}^)uD>f@` z`5CDVnj}D|?;%gYd3X452e1Peyw;Q8NRu%wcq%I>xP=6@y+WMFp2rx_h0JU80LMW% z4zFUGfA`0R<7_J|8BjQ+oK@+A?{a+*p3Xw~5#C^p^GfA66|+tho!Q4434!{$CX`cg zxm}_sDM_c_)Lc_z4BW>vZe_fvrn)5ENuY#8+lQc-+Q7AjqxnevtjA_00B4{*XR^Gu z3oSU+2!>erfD}TQFF}rj1?#6?_biQIH3 z{a+z;3hQ(G`|8-a+Zg;e_`_5D&c@Gfv|1(@&UyxcLR*<7?8czb0P z6$Y-7pY^v@`lvG;~sOP4e?acHh@%40B68sYypCa$ehdjghhG^0wGG@~|*#=S{n$ zAAV>Swxia2_V(IdwgUo}Q>ykI>(Vn5WU$Y_Gj>;<7OQBjzgaF!S&7TMy+_Nf8~*j} zaBh0&M}rQ|=A8$8cw2ilSZ`HMO$;t2F+LgQ0%%lU*ZWE8nOryj z1+gl8U#=xh)E|4T1;kFT1Uj!HlgaP=FA21sUk|h}62* z_lPunQa7Ln*jCOrhpcz2O|jbR{jO%LCw6MTnAjZRl=!}dm;^z90P|0>wcw00*BWGp zXoL?z28p@e+`jT#Zh3@b@V)D&+Blo~-kIiIz7)burW6i9!A;)U=2RBMXAW z0m34ndI&pOxfE;9BVA;f?Gb1B_q7Oh&AdR{KhEI^gr?R^JURl`LtN|zjp#uKnI4%<~ z_=Wj9ug;vXmOoOFq?midx3f#~jf9?l%)Z^g8D%n5%C3&j@6$zSFfuVc@etzkLCm!P zPBxe_=U!#sJvmvXuX0OtX{@4J=?sFSPqx#+@{2?+b#?WZjY=8gIF#^8&=Y_O&Q!Nx zx<`>Y<5^$H`WHJ;+SS+r4!w_FmC@ zdHn)00K3q_@88f6ECYOnFJ4nehuBQY@$eXECkwbxaK1so1+-~Cwn?X4DPsYO8=MA& zJQwRS;EuLbITlS_%zb6kg@EMGW6xx)v~THh(2u2%S-g**>lm1S#`sbh#~X3@PrtqY zt0egh^&sF}Ob?(4SGTt6khR_CG~)VX&_?=3QAzjR+4X>8a%v`)*e7vxZhvpx_2N?U z*o70l@4cT1Ya@ypk541GI83v68L&hDoEkU_ZW9BnxZY+#P_by(iIhpO0gr^I*YBK* zM7|pCVO2;sfttf0h^P*rAu@KI@$cM!4JEn+>$A9f`}#I4O%?)qU=y|u8ZXmG@n5Y- zqqLt@+r!q#KEl~q)1>*Vvx3b*w7V&e{3(-6;}%7_vWB-W{fs<8*CVOO6So1_4QZ4` z9GDnLo??p;5*~FmG)!vUvN4djxO{>48!?jzQiK4o0Cw)vgQdgxB!*7TaxvS&Z3nat z%T{piptLL^;S%deRsedki&Z_5UnzW{`w(y;5-Epa6UBzIoF|Obs!;oa(FMDNx5bJG zTIlZAa4pfI@O23A@KDmw&`?p;Lep{K6Fa3+Ouib^&`>>$Z~)lXHQ^@4MK54G349(u z$Y$4t3m1sh4nXzk>Qrv5pz(Z-VM}!JH}nN~x~I8hiv!12u~cI7=FM3Baq?metEAw8 z199^TTvi`Fib02ADNZA{vuV}=(K(VPb2!Q;+0W4wFVWI}rWJua1ZV_L$+9UzdES76 ze;>G(>H+A!1KOI3ib71-F{&}YoqXo@eP^U`(U5;1k$4F88I6LItLqH@!Jt}D>*;;^ z^sXYup0K-;73SrApPA9;VZ=NO1?n4hd^3hxbYy{8p^3OH3e|~%+OieakQ%S}7wxbb z5oxdZ9L419yyhkbS~qQJA^M!!>cg!-Q7<4%4Kw1#prxfH@D^|`s@Wk% zAW%=Me4OG}v!5x=<=MGVcfk}afUi)y7wtZu- zln8bSg`aqbix-GoV1P7h%b(>JS8&_QadUq{)EnqA+-ha1sTO!7uvZC!F0ntH8LD8z z;-_1X;7Cf|L*tHlBh_LO7K&8BCpai^lMj9?T)b#P?VT(W5}`#j8E&I)hm6242{4u& zS5mfSwuh7h@&h{y0#%QXM=WX?&Vib`I-Vr2jxdRjIy|J8F)r;PTgk`5yO z82T=SXAy=xj3B2_(ycGRT}q@cfN=b<2Cu6KV zdE1|aFh%*_5Nl3@GD8R{ac)FL_6X^#U8sm30?aj!UpmJ(qwX|)8qfDGVQbPM=1OF( z;}d}z`;+fMzn=mmVtb_QX$^#`;mNRvMl*ySlds7k?n+sRL`*u+p+ftXbLGk=$GY`T zX*+o;lO)Y)=Tf-^3l38jKlhBjiEmn z5tQ(qIRDYILK0ha34||-7TlbESgTf)b;Kh{r-o-Q9hk}77(yR*!bH&*>psjJ&;Md$3$hsF}QwxJvh}7HT5kg2(IK86RE!J-aVK<{J;$&lma)Db&Wzx zfy0IbX|7L?K&qrW9))R!Ydzp144DH*TV<&mi~5{b)K&Z?|K@j`;L zI|k>M*`N&GxUaQtw~Fvv8^X#8nnMOe(@UI9DSj>yX_&ds9{JTGE+HX@ow{HHF)n#P zzJKkBUTOkz&2KMb;$<|8Nyg+1vBo z=tLKc3VpNwMerKKv73-$V(^7>3vnO&u(RlQd()Jatc(oEaqLtK0X~7Kdpw~5Xy~VB zMB@n_ZPH8IH*OFiokax8|M>r!gB{c;RBGykq$4!3ZlyoURV+fdsCyPeULaKD}S?_j;8)3SN1$oz^qA7&>ez19Rc-98Q8t@7BM7v zLU_3tibUh}BaY4+hU#_3yWP2XuB;{H6e|;0DC}uTL`jV|IU|%suazRLq@pq+q6&te zgr*hb&k`Om>aa{4o!}kO98l5HN}6vL{5K+Od|$Bhk-q+Zg0jVfLK3!aBF*&0Z|T`6 zecE;q!l&$`jt?SK9(TT$tw>%}*`v@Y!fmVn<-stQjpCitwEHV{n4FE?GklgP6PI8M zX??e6{$a9~bZ<&*%^v5XyXKFvkE=j3chnI$F}lnC-Rn1Qgf!Dl6>A34SYthmx2IjZ zmXWz(yPMVh%NuXR@FA@Tx8oy^R~W8mbhCtQjKnUwX1DQ$CsLeuu-M!JjSC)dtWHRJ zS8NIwmWww&bk#W zxIdM${heTWdpz+{xQ(fip|)Vhaz0&8Pf_Nu=M0tjv)|W# z3**E|xOPqd=+UE)#^M;nB_LP8Q~pR8Z9l2>Zzi`6uDGLd2v*0)hrusZ*6-!}_q$0D zl(B@H*1GK_K|JDwh8iJ<_=5r7%fn+mVL-Gv)|CxwkcZD5DD!OJtLF+-gr$qW`I$Iihh| z{+1an^Nt<9sKYo4+~%($L*()k=aTxi4LxUHr4|n3h(t~z77qk0&!}t4I`*EimM<0| z_qj<$VLZ8>{)vPheR~}3(DlRl1(&l-UeedE;#}B3+P*yjJ|u7sFZ=r~YTfLhJCm|Y zsJ@;*b(}c{qwxV<4kARGgwT5kC$~N)ta6kBo_0DhbpmIoR6f3NBfI#EY~+uVFML3~ zg`wG~Pp0|T|5Q06*qF;>;%mgj#E>4f51#{MN8`QOPjCWNhWUPsmi!}l-4>;lp;rW7 z3EE_&THy~)acr+KY;@8y>ucJ?KMFexaTy`wgPI9DSdc7|<$8tPxD4-NT@ZFME)oSE zIXRWi1HkZ$appq>vxFO{KhDa`43q3P>`Zz!G$cv`Uv(o|5r~sPNvR1Y{9ahVw$xR$ zYp3&2e{lTP)z()1l@|gTSbkpKhlCFDzeaC2gov7dEqZLPKS4jnDzfq}K7M?M&=iEf zZn;taL0+R*;YD3O{UPnC%JPT@GY>A1jCnjejiLUJDU z+Iu^n&)wPDZ8lrSIg@m0^fxcy0>qub>7bjT*Vorakc?P?3TQpNusO{CDiQC$^3@+3 zON19y#&PI?uAvU&l$7)WW>=s8txCjf)1|^h;0KV2W1rWC=Yismd>6V*%WHc7ny@dY zUNqvzmFhh${NR+>Iis69&8>lE;SVM#TU)NUjtE^y+l0F?vf_b!ZZX4xKz+br-o)^n zg^V`Rxm+_iGz>X=nS~m6rv{Yol=EjM$;il{T>*@$wm}na@6mjiTuBZ)#rg*ZDtMLX zT9^}Gw{uEJFp-#`s9bG7oqMn-7Ck>n0iwc_BD2H{DnrbmB&_igMi-7Y&GARj{wQ(l zf}6o+O>ml!lOQ=o_Jz4T?nh|f$%8OKNf4+L7OG$k5cGb?M1q{RR?%C+;hG6jO&}9A zT?551T2z4sfo^+es_js~r?D}_kH+4027YbyzOGGZx0oUui)|0}H=fU&7mVMflu{Ct z=Wfv^JoQqI_b{R2ZknHd^#W9PPY>j|!N^D98pUpiK5a;PNY7{^lYC+RM9VFM zwpvFfXC4Wokg??W%szF^skc2n^dv+K7ka6L919nv)-PaNONo#;XIz+H+LE%71S$0Y zW9&WPvEJYR@!KepGRvxP6N!p4k|Nv@k)7;4ONmk{tBhNj85w0{6OvIHNHU7-$|w~= zX_7tu&v)mX&-nhn|KH>Vsp4W5WZdwG5F#FXCDXI9r7tVF;BN41@ z(H>gL+lP^K`VhCq2Pq~MulpXx$4(!3dqY=#@3XtCK6g~l@=&7Am<&bqmDOH!e&gkxHI*Rb0!`<4E)qe4d0%kxSr{S)^l$|_ovzI?Nk z#kFP6r}XsLKT!7#N6B~UVGO<#mjphA#mZb{UL2oa?fo*JyavtUjP4H5CkeSOIrDh^@E)+T0Qu1+@~p%mK- z0K-Ey(OdQ!v)+#Q+YBIOklOAWL7PTPf=8Qb3=?Vwhwa*jjatqZ;3s(HOw)@Of0jen zQZIdCaNz81=BxLAskg7`^L8MoWDDW34WgYpqDP&TBsmjj|3%UGfJRR`o;lo|Ahx!% z=$+qxBLt$A64N{Uz&=i9!bN1n#{Ya`X!}mRr_LHX536Gs8V#(QDy{tO4`gYx5{z4< zAD~8*C{LPsIT1`QMD0BA`Z@mK_(HW@2JAw!AO8Fgwmj7q zvv^&5E>=&6cg;f3BYbnx9c=J^d7|)T=H5}a9@D%2Y+HcyMbqupKNR;bn9?ZM)&7{H z9wooIk|a7~`Cn^QygS6Nb~@FmX!h%9(P}5`?d_eJ*AY$?m*iwo^N`3w>f)Amj?&M| z3^m;+!9|ATkg(18qKM^IoV17ER?aJc7T0Xr%T0pmM$PY<10pdSp%y++3pHS6NkKu2 zBKViHMJ< zscC7^cE2dfv@;O`#MbE3&;H!zyza%}J*K-qUjg%;F=g4cqiilA$Np57#$I3Lx&xdF z424JVZe;dAdG7rFwuIE%a^;0C-2aF|Lu@eoqo8jg{eW)wN8^yXq#Bm{q%AvkI9-O_ zW*#L|(Hc$$MnCNub>gvU_lU0rkO@I4P0heS>P8QyP02O;N@$c>Pe~O-9{>se`gJZ6 zj4I%9+;jNUQ996>fS(Y$Rroq-Xn-`l!XHQeK@J5!n3B|;y^R5oEg|1QcdQn^U^Ld) zJ(?>GxtHQ5^Spc~`3WOf1gLM!&sG)!xWZ!g+>(7IDiQ5|YvdQsx|mCU+t4{Pf!+{b z*ng+DqR1ttc!@Kt(%E77Y;1Cc_`TB-?X1^4euJ=$y7KWOSZ|<=pNBRvIC$kcC3I~& zck0{4Ic=Hx+3{TyP& zEs0CqYoAI2!-U|8Y4z$|<=d&DPb^m|Puc-=Bw>HFfBUzO%6W!GrsZ3urMuvrh7~PZ zHqgTXJNy=iX|ms$C_5OicXRM#RMTp4MMgw;0VB&h1d*wZUAJlNvwlhmge5O#sEl*$pTMc@DzvcM>OrAAi>{5>zSsZ01LZy%Js(1Xu z1=uA~a5IO$=+`}2faZ7we}ToPJUpPog2C6ycfrO7bm%-Uul@^9tyguw#O37Amf7?E z`*#)+7GNg$8vqH=+rUh+@tuPQ$Hf1i4%)a8fF;&s8dVR5?gBx9%+=V~7#mD<3N$rv zRqM&YjsvKZCvbnz!x0UITY-_Jw7gJyB?_wp1i;iGTLrrZdjEf9n{26*OhVM7)*)2f z7|Oc6o31^v3l^k0-+xF)Vtn~lMtZ-;&dJX!wr_twM9;<+b#w7XNWI$8stvvO7%p63 zWTO2oRz7)}O7%ZdSo3a^S8n_~jBR(5x@@~u8`;{709Qxl2g;DEjH{fC!x zL?tYk%u7FaY);s-?xK(Kb_Ny}YFOZi=s;kiB#r&fbHnSLUFV7q8E`!M#nfp3<9fC3 z<{Kh<<>fzKD!dq)W}S6?^yDyxcG|5p{F<$&S>K zZr!S@POaA8%+GyTan3g@l0_oC!>*-}-+4ztZ-2P)%s=A6_KiF3N|OMBqah=oPu|U1R^XO8l1onn6&xb86vtXw3X10ZMyH*StGQ8pf~+f>CzkajM$70 z7ie`k)BT|(Nv!3V@&_Cw>UZwKg=42NGYBgEw)ApJlyx)3dw?5rXkGaVb2kYxI!hC;ld3b11FzBP%wy=0hc!t2r zMtOKtW$r;U`3R;!j(R+rN4Aam}WvKZyZVUox z8D;_4u7gjz49n=o41B(DW_xt&mP(!>LM{pT&?bR6Hny@89=h1;9x*av+t|3M2|P|* zLIR^Z3JltMK>egUxLg3=RUCW0T}UVcuw_NX6kay|7m+ds-NkbujuOh`!~V+jbQ@6j zAW#IQ74s}yFTcWs0+8Gr-Qa=9ysvv4-M+<6UvYgn(8J93h!K=*Ly;HaD93OUug>laYz@alOB`cSA`S z@CkvIm5CyT3(mV98TF$-XnA@K6eli{u&^+!FoOni0?xL@J$G*#+($@~v@@ zl60}4cX-YT*JtoBu+8>Z9bEKj!`0^&PZzHI9NDz@BIx6*D#xnn`DulySpUmA~FNRM5z1#TmaW2F&6R9 z@3C+p)$lg)IuI*cYij|L`J;2uYdn?~yw?d5)Wp4hQM+GPZ*o3Fg?&$s+{LLLr=k8} zz%Dx5ugB!ziIa3KEsM5C?Ph0zng>tG#M;^#<%&SYeP!0$&ys%_tX_)>0(HD=_683YurB1mK4o75dh*JTx&JL0It@LmblmMRWGg~Va=0mxU~`)VaILu8B_$=6QuGYm=Qw(19$X;T3VcPbhF6@p|Zms zeINg*bOad5dkBFHT9nyF+|7E*5*J8cndckLK$`m5mHsbCG$^-`Q@oh9{mBh=)(M)C zh}#>)8aROlk=#Lu_dSU-1|m`2@6*s!L%h>7dM=D1{MFSfJct0fbyw#!G@N@s1*)Xq z2bzcV8I3iB+2$p3BR7@os|`!mv1UONErud7Zg$=oJBN;DD9 z$B#2JG0_qoXzoaIUdIcTiVIXD8ukdOZRi_#ikK>7HM6eW@Xacsi#*X^y{2_d5!kUY z&yuBu%+FwKS==c)x=F^?TVOB9c)w)`xG-r4Ba5 zFq1gA8>M9yUmtjV{l((!q}bq>dGn)F>vCsai&*s)r2BCVHcUJ=2)A}wIO)7Mo`$!#{1^QrM<9ba;DREUK=cCzO-xHPjQ5lh(K(`ij> ze*1skjsq7uN}y4mXU?oywaP|8{d~)s_K^0HL){{QYX2f(3A|J#W3jvK4GeT{$?5xA zrA;@hP9%q+O)$8 zU&_5T^b^X-{F+8a8=l>bn6dk?=h_~9bMxEVHBTF8-ckIu`9GN_{XDjUo^AEhFG9AV|2GCRbC0^F`QcM9^IraqLAWv>s5p1( zD^=Jz zfu{NR@nawfM^nf1xNZkFH)|E~{+}?+cm}px>quxLYJU6ugV#iAZ6e%3M<-&;ZcrZe zn=E=Ao?=@xdLf;3>|un-vztqndS?Q9S^prnoUemM$X(#YA;7XdqcR;mKgk-fqPd{C zbd^=O5~e`NieIcL@F+NrqYfo#?*MbkKSrI8hl5Ac+Dm$3rB*^s#Q3+G2#F+#Hc%7g zPD^~g$vB&L;@q**IsAX&yTgeg|32`72b5bUvftDp4ti#0#{I3)@fJM`q)NWVT z&mb1_c6}??+Zu<~r1#c)<7@5Dw0Qq}LY1HH&0RetH3G{5Vxj;_NJ`jqW^0!1rOF)k z)vf0!$qE_IOjon8F!%#g_Oz-)O{GbL>C)C62M=t1a(XOXREO2~4=hZ3&WVA5@7)0k zXWny#IGJRP^<2M91{ySyKRzNvN5i&) zgk8|yowICVQi_V3NPuCnfHX#g<$zQ25WYxl3^0KeVA zW)#*-dWO=LQkVE-LLH65>gm|RUW;%W?xjAsMZKb-C7Yzm_L|B)VX-2dO`6=kg*v^e z;K$Wd#^z@S+19Sx?7_G)%3yw4z2UHex=v?j^OHwbk&!G024IE5%I?gWbX0rD6yiq zVCym^)K}3DQ}L`Nb|B>aWKb&T_(IrTD;M0k(*_5-SFb8=--e6=bY%=PFzW{X?s=6u zE}xCR>8B+VvM{5qo!YI%QrLVk!h_E8xf#jeHsjdxSSvnW5Y0uk5V%L7@ZZ}F3Ji!F>O%V+_fCNqds~bO%yInhANnmTvYpa7D-BA1OJk$^sZ%{z<3eAB z&JN!dEaTQ2@*I48FCz2uex;2iGWqp@4h-KpLa_Yx2f-uEW@75XLTD zBqw3U^6}ZHWRIcZxK?4@W^Dz^#chYqh#y4~1flL=D>Nz1uBbTjRk3S%iq>B_;fVZ> zPhLjHTsXM6&VoG$2LRmfaOlgy$N{T1aKuDgRuqq4xXj|PlSC>L9?u+HSnUk2d8Jyo z?O=7^l*%!OixJt1ALC&*0(>wsb+32rRJ`MLS7+zsChd5Lru}LRH_=(&`s z=>!Fp+0aQb=Sf!~!Xe4;_DD)bIA17LaW;^bH#a@tNRcpku0bi+&1@UrcHfNc7Pm^B z^6p-Hc_TeyW8R&pS4Er2A5T2t{uJq#Z)+zeblKe8dERU5_UwDeZEZ?x!y7Lb9MNK4w_ZQzu;2Jps;_>8(2c5WRiUM$_D%-p z_ZS`7%5QKZT{wvb^9Jc3 zFBK@DDd9n(fC`EqF@Dc>>e}|P(!p97T;h(o=`-YmdEf(m>VHl#tu6jY`lvrL%_@*RCm5XlIb7s{)dmwV zt*a63028q#Y^lKe83wJJz54d}tc{fhG5j4O>6rn1*c|j@ z`IFuJdk~~>9QXjh!LjW06lgX<&&S>uE3vqN--plaq`(_|sR1++oEfvYwJ-`}Q~2#w zVIS6uu&)XoRa%~9VZ$8J48A(fZ9F*cj;)(l5vZ}-++J;IF>L(*2w zx6|M1+7)gz^m0l;l#6w;TQEkdFl#0MZtkzU62qAF;A( zW$CF+eywJICgS1PXlG6?+yV;d8OTgXJ-K&pgqH5ey8i|&EJ8=$o*h_s&>-QJjM{+%XCN^~F9RwSf?{}KNjM!vEk%?& z8I*hok}^Ob2Q?h|X=3v)ZD7{yJM$rAd;kY6yq-s@h`+!F%ESQ~W!WE?M%p$TldRdf zgHg}rq2L86yjYAjC7t^U=yTvM!kY`z#q^6E)pd1syA>3^ICY!qFq23Ib!(4RVE=`U zIdrJ7p#z++DM!0dmDCh&m!v>Kha2X=;23a8C0#zdkrpFH( zdNxMisH)so*1__pA21B88wJ%3uX_4x-}Tf~Kj3Zv#UKlXXI06--RfgmPS-W*_jF$Q z9ygbxv>3Yhw6oK|?I74w^LiI~p6!dg0E!w^GeATXfaLq8%58MncKCOf*!AU6DS7!s z>C@^YQYDzk*kd=<$E+p!vsZqm%Qg1*Cf^zwvLDo7Ae|O{@x4T&d>T{}q{2e767XgG z+ut2YA9@A$c3?12AH#?Xl`JpTjJyYA6RvAu+EehEuvarljXeTIni3lw{X{4Jrfv>c zAq$k)j;;r@_dBIH$Gu5|Hdox#lbB{f5e7jHe7<1*`)+-*>go+RjK@Szim0bfbB@!W z18P&-j;ok@aBR1TurMo;9bDP%QW%(F0YL>R$gy^TXZm zYdW{a47+w;AKuI0d}McDxMO(pnt(Y$UQLDN!D&GK#Z3-ArhnnLQ83lJLhou*ivyLrNbjolkV`4I=l7JksGKzp%ugjnb#@Nc zOQocQmH+-89m;Jv*vB7`zdTbP;XqAjNlq-TvZW@xf3H-<{>J?$UtH3hdLX~AH8sKV zaY|^~75;C7Pg$i}D_nQ3TE)yZQD$T?FWA;h8ZomGv~zg&rgx_U@gp1@!V0(9xis}x zEvj#bW-$KRkg~7)yO-}mc6KYfpM+t`1EA_x+J$et4lPMIU{Dgqf^SQ(&71aeEb1q|-W$Mp zhX)Q*IjmVJoE#h(GKVz7ZzXx;_If>k8T$&@GEM=uc3`S?-#1IqclcpJMjgdg2xpo2 zjva*KslwN+{dPMPhE7;pzsJgt@H50AaY`sCw7K-h2~GjQduk8)X8C)fBMo&9ZLbA@ z9y*HFFu!t-#}FgiV<4jBdnnSnll`qv-hAFf8(><%Pc}}^JD(xOV!J&efA!WN3|JWE zK4x9FL@#*?gc?xt5L1ClBV;pj@I|Eldk~JPjqpSSFrJ^k6>8AFJ~NLs+G4EN?MP8- z@!|r#f;6P&^+iG?fkefD9s3oSLw%bw#bT0Vd0N;=B<))xbEQ&NG(oDuN?s!&IhmPv zF1Nx{^RT^Qa@SiG8QtbHM~*qI%nsH0Tz>8GiL^6HlKQP2<%gP#6xdUju}A2oa{d8 zZCC{1JdG2m^#49oK1!rL-E_IPX1!;G)aa}u`A5b5=(g7HD`eu=*UyaH(Y?^k!K3bW zf9N4M&zNVks@H|`DnH@*4U?{_Pyi}ZFx>UuL%qwtYX11V3>=+7B0xXjSbgTysmfoc zE&2Woo%uGFe1(aeR@(YW&h@fJ=%cDS)3!onV1oZb0U5*`2$*8G~9LbL$7x{cD# zZBVR&8djbyrez%tF3#{U?8W!|$uWPKxC`xwsmxD&tLgC`gLGXGTu_zrOG@<8^b3Dy z{0Jse7UYB$M9tw(XJiC3u}EGS%`rbt+%ANkF-8?-b=7_Y8z-<~Ord`x<8W%e^dO`gav3 zZZfrr@Q@T=={IM9Qcfg)j;mL6AqMdXpUKx9N&H(1jq}~9LpwjCwW+%h_*^n9C};)S z&r}w0kPg;=ER)|eoS!1tDiL;V?S7W9YA1G5f_%R+&FCe2SA%%*jik1l64mNW<Rr3Xl}EzHuq_& zP?&-)rBd~iOyzja?g_rMkHvbgR>{|c27=YrPiV2mL6*jw-2^^mzeVI}KN@6Ool z{W4)T+-MKTy^k;4dsQ-3Q^sAjyDa8#m9$bZML)dd4V2fc5$Z6WIPgsdx~tV)P<>qXljR2R+x*?(Z;e9E$7bf zOi9st=%r=S!*8|f`2CsikCBgmy{Ewsp_6faE~wQ1GD6Tc#jV@^%2ginCzpckDb=(@ zo0oEae!|(&ha2RZh(b=@kQd=g!^lwbVFHU;Y6DORWo& zo!uYP(iKSkt2un|h?$uJX14CQx!GAXvo0;y^kt=ob=^)_0T`Bj1RzG!YSs76(b8E^ z&t}AaDs$j1QSd7SFkg~a!(oCx=l`=tbQ1wPmT)iYSW&ah!Mbbx~6 zHs8dyukR<7ffSaSGB3|<_EuFu_t$JC#8p#zr53ZD4;Y1S~u=+(RUK&<0}fV zH`1h=yV@_${wsr%Ape1L2h&4kWs1F@|_c}Fv zmTAj|TQBU+`a;BUH!g17pE`3%zc1q}Fs)uI&Lociu>7 zZ`M%$#?V$jAD=}aYDTZOxSd^9e7$|@0%v1b_C68ElUwvYGsh$(GzKFgcEt3a$}z@y zy`o*LaXOt@^X*Uim`EN#Y*KWu@QQBW`meedwf~}$zSO=dL%Lc1$PMx;6!a=6WL!t1 z0f4gkpx;>7?*%-}XI>M8)`KXkR5^G0r;;cHrUvira(s|W`d(%2roC@6IgcX8g);Q{ z^K(fpP%J`6u~Fru?hw&d+^ZdbeP&VYVy3Xpw~LT!;Z2(uB=)6ts)3>^Z||MtXFJ7_^?0iH7^MuceN!1Tg9TF=jV2C@i;JPq z%thEF06t?sscG_dB2D(rvm18I=c^JKA8k7!JUMYeIXo*!YDr$A&gu>&_)yi==xD`; zz2hKvvMs`wxVAmXZteMQ*61^$Rev9TRz4{6qPJ|#(2B7hJD1Qtsk< z2E5t}Fdh&l1OLRV5sF-i#|_I{+?8sb=eu)Xy&`;hDcGFjP{i;-!18REDpd`b`qc~j zHVdZKUS({XSX|wBRnjR$xYptJ5|5cL^T8>L0KIWibNDx7wOx7L+*2JKyu6wekk9oN zx9;8B4`3Lq5&ok_Mh?f0J%rT9$APtG!-to&rd#*5me7(!p6G7A+^ac*=N6g^XMAAN z896?pvFo9c9ag~v%RrP>E}^2!>z_&jqD6D`C;Of3+E=m7FKW-9QiG#5Pc~$7e30eC zWKYFU&|7>flE>25ecHlMYWpKc2`q|bDmvbPMd-?{$X6mGjsL6myekFIhD-)dx;^lw zJG9r4tL44M6TPi)B)p!ylVlZcLYYehjW7ErQJipT~&e+8SZBT=LXkIt>cY|iRlD0m+WB*GBkQ13-bXVQGi4TKQvA+ik7KH;f-!$mDmZExg+gLgoW#({#-m z;X`s3$^|3~j4-@}S{T2Fo6y|zjS1J$;xh`z>v>_4iUNq^g9^ZVsCkKms13IelT?cp9XgfI$&tgPB$MtdX$^3(DHF_OG_a> zbMWVQWL#q-Tx5?0(~y`C8?2xUi)z{^k;R;BzVysF;z3A+f@T`88fDzS8n7aIq;0>b z{!dPSKO7oLp=`C#4*ZeSb#Uysee#`6O4$vOV@(|Ae+8z0~yy|o;QPS6C`mlas z(!iEGN#S~tRZbGGEq6!TO!mzJaqn|cD$0?Yq8}>A%ZHk3E~t%#*9c0=mO8SrxeY8e zEFWh)R1cWdGe?JVNoOwb{c&jtPw~Zr6O~(MH^e^@_;X!2BL#xc;z7+R#>wP+4ytv0 z(4yK&T>$ulRBTS3#4z+7Ol&}w9C~1GKt>7Y&2>x%&{KjoPzE6?6d$I$wWYwNaB4~F z1_Ta30J_1jFlL}I{U zO>jSom9Ta!_9)LV4r}1{~B+&C!t3nI1^cx8RRkFlBpj*@Fck*zQpwb zZ+T?sA}M0DM=n{IU)?-{rbbv=y_j#`^pI3YglcwGc&g77vCKhf!wXKIATzyl1+MCR z!a0O(IYGm}S6j`Kp5!mJD_uN|ePikg&upzk0Gr#9&c~uS^ByiloxD~aN;L5aUv4M7 zWWH#c+I6*S!x=i7j+dC$WDM4>*ur@QhFuu#A}p|x%1BMM!Zp9kL2YJwOBBzwveaic zhHz5|-6D)s;VKtbp_f0jhfZ&noy zdmKNwByARUE<-(A!^r6F=?Ri4!fjt5((vU=FHcWCYq`l3BYbt z6hjt|acFLKb}&E92zS}R?04&0x+YGhG~3Kc?#fJk$UR8p){*zPzxOv^btUz(<$CNE zoUHO*9Dn{umiAu*SfJURyl%W@y&w*pf)*aW9E4Yg!7h<&HH*|E`Q_!HSM&3y;$%T7 z1t#$uwS?g2O~kZ6uweg{_ad8y+C^Lce3!&T&rzWs{V-cxuYq_=5FZ)p3j!?^M;*Y?F!nq(USNy#YuFt5)P; zf%^-Na6vs(oJwcEnPb<8|LmEv^x7*Gy|D}{ZuEjw>Q}?{?CiDtby^;+Qb)i7@7*9P z<^x_D8T@h^g_M%!uj%Xj^S)rUc>45dV0Ivi^rcTC;Dkd&OW+n5199Q_BvmL_s^fUB z0{jBsVW_0R58dpsuBBbvNQLL9o?difV$*sGNMz|5HGfzux<& zOY${*-1(Yw%Oj@3F~motQVAJffPEZ$d(xWq-%c~HxUi|_+-UXJQ6dTeW^1^il9T%` ze1B|gVNq!6j4)zogUfI}VMzq@1q&>l4jfo9AD8Vog8yV|$6w2PP>})xMwu5j(GmYh}CT<>nF~biVNnSni0gzCvfWzI*QeZh>_?U zx&HgRVr&usgI&>3?!8niXuI{$arJnjO-KtgjnDppn~z-&XK`FDF?F>$u5~;R?_oLA za{^=6)+}P|(gyk(xTpn}LDPl%z8c{W1iGRXU^y<)^#udq$f6Z%!W}=Q0 zD>^uff{oxUnk-igg*aH|@0}PC<@gzG5C5NWZEgyX=NfHKX10v;b3f^@JEC%bP}|l` z2~<7q#zPK%JyXA7Z|);%Z&)4^ixV~BWVOSq+cwk$hZjpTn$}OBoiud)%rB_4P{S(q z`26Bhd+jAbTSHTs)TYYF*6%%oeN{Ixq*b`OD$yfn>0&{#Q~z5Yvg3>O!Bm&N_`HJo zL9U(LlRIuWMPX==`W9Hq%L$8~+6rHucJ-PgH zb$;i{5LIgx`%25JJ071p!M$NEjsMnt*8}V6R?sHoB4Y$^F3>z*Ys6V1wFf;HbDTJd z^s_lV^>TXJc_C|P3Mrrsiym^lzk$x5{;oOAn!dGpBdf#Z&0lNz@DZjB6mXgg2G2%0 zAKv4oTW7Y-y2G^Q41E%P2+7|5&Gc$h$;IWv?Hg!F0x2n9T1m{Gf3%$jGDa!0Z(>(< zqULou5DbgGV7*Q|*N{)J5i} zgm@QxUXe9#b^{Z@WqD-r6%uJKG#J$8$Em>eO6?`bg*w9~M zvG0t$K5ezRZzHS#sLo(}!c{`}7T&{e;;R~n&!shm68oGlVhPR%x-I*Cd>+GYmd&l_ zZV(kM!wWw)OO;J;^rimpin)~zUzKm*p1in=ZO*&zK<%uZVdl+cZBvR;HJ4p($>>-6 zDEDV4U9~Rn!r*dnSJv*Ncq69Ri(EoNJ`vvM;3`Fi4GxTG9_%l3OuB3-mI($01&&ws zKFRU%*=J5JfA?D!B8TKm^djfzI`yMW^RWz>n2vmnTEUJJJVjR3C$KrdXuFBGkcXpm zn%+xf*%vg%)vH&NU3C*>Gz5YGps^FCjA)P4DcJqFW{718IEEY|)^fCy7nf;&u^W7J zaX4Z(%;TQ5(!6+yrzzf+Q-QQAb3U&9jjK%lwDZM1BI0(6$z_)0U(?gCIY(l26oIWM zDP@ALMR;;7_0uHC>>Ds4jcUJ0ushHh)Q393{cf`&Xy!8g0`e{qyqsm+pwLL)3;+Xn z+!#yh%H9KnvD1<~;gLoxOE0}zYbr72Li+^+&O)*9mvfi6^r|j?ATIY^d>{oSjrRFu@7txHhyQ)C11h{Y7li6HicQvu;i zuc+vYSP<=ASF}X8;lBl_0WUh%O4P-<}Z1e0_RHUsEp5E259>idWfz@ijnaHMEpef_MV z0g~x2$IGB-BSSRv24o@(`7SPFfGc4-R9S4##>%>%^8e6K;r^2Oa*4LiF#e75dWZ;S z&dBo|Gr`;e>b43zAoTC2S8$OgTg#q%OWi9lJ;YbR%fZ7_2`U1bd?@rBoSZy2-s!@6 zEXn0$n$}7ZAw);LtNK~b2hQh$J18@_0(=2Zd^B54lOzmBKadz;99<0*aqt;7=eM#gP1SOnZTvcrSyLU{X$1W15T8;i;MlRdIyIJsK<9u{(KAaI#YVx zebeINy0I4r$yv|L4AT2~(5u7wf(!)Mqy%fhpOLhvUCgAh?;`8S0{1JNS8k4AKWK2D z_Z8#~7)2gn^uSL&u!*fLrpiZbPtx7eyhk^9`SLOY*KQD)>gFmcST!Fgwey{SCH!5_@{XRW4{(XRnfB~6Uay&b_y$`V@l>1ibV*H5u9KtXoQ%e5g~`9Jee1(;&-B5Y?N!8f7To_u)v1XQ9?dagp zk|gs2OR#iZXt}*`zk+Q)3o2vJ$-$2w;m0PAbPja!;+#xyGC?nmFfD>K-Wz}E)U~}z zpP~d+F=9ZA*HcL$n6G48s|~V^3kh?H4&A$35~MCu(W`@_vHhFSp@vx<+_Irt00%(* zg5?rwjYX!krV<;Q80Qr@8L+V_j1XQ?)lsogA<$+=Q{f3mxX_rGB&MV&UYI)WOMkH`}m=|Cf_MdeOWAPzBW)<}=71MpK4=9{)=1gtH)KTExC#4OX$< z2eTOtTh{ghfMoCm6ugC@6#JiqMI}b z1kVNrkJ0=duz=7}oXwmq1-Z@IHtdeW5*Qf>OqH}=nc%dFo|Ze3Sho_pL?SOHKRhZS zVK z3HN|p-*inv?15C$*H~l(sXSSc)Tb&=GB^uT$2##Nk8q^Iupeg*wl+AAO&*>5i6^`? znWI#43Udt>e}vLwsR-W^L|Aeu01S?m@t% zvHYJ${s(}*z(1XqF(l(*c;yEiGoIgPl2TDsB}kbkvC+o!_;{UGDCB|`Nl4JHFPa-Q zV;h`6`zt3(bNjff&6Xf z;yy}aczL>$$1T}^F#&r$E2)CB-iUd@3R&8q!t% zHu~!7Qx@8_Pse`PK>xp9LLe?%{;P`W*uXNhKL_j83hzi>xpJ$!V9aHZPdi!7m2cqO z^jkk`K9(0RT~yuX|t%V0(M)F#VC7so(Bd`?bX# zo+3T$^=*@ws3=`rB*11-pNjUrp4%DpYMasX%QX*#`9;XjTUsn|v*L<|8UaRZlQ8?j zg}e3Z`VXA+5myu3hDLfiI`qXRTz`MY2H@yHC3aN7jCD z!{J0gOeN#v{Sa&6C&Eik|CsNaNbu%xPe2-(34%F3^SI!QCx7bTw&0$Mr)dPivYBUO zSYsQ<^ZbJ%Wd~YfjW~Mg=F$h(epo*}J?#hX0ie&@x&(ywKOU^A<*f<5miC$f`KLgS z!%KiAr*Oa-*x+m@9025g+@&^CP0IBT0=fs3Q0KFNY(8o(IHtA7J{&bMff+M&g<0Cq z>DY+%3v$qt_CH7Cgy8i1*(Y1>$k|;L_V)dAVl-=I)xd)LIze#kU3;tJ@V3R~yRJ8I zDiEn47LU)zQQ>_x0Y4j0tFhh7E_mB>@ok2#Q4gd9I4H{5>YO__gS$@$>375( zuATZiTRuDgx_QCL!mGzQl=r@Y)P=>xv*T~rnv-QTzPOxpahZj# z58XIxJBDaDGL@eY2z~Q`{g>Dys;~8xckwOf>YsCLI)Au1_v~$4m)lUSfQ3L+fV=(8 z9UE1gOy$`-9+ixL1S&<)jBwp!%VFs~90xfhVIsG1&<8y}0MHqn%K#viDZu$s_ndLX z8eJv*eU5;nZOW0PonkL~S5z2&xpPK)BcJYjYa2{t&OAwD+naUe&TbpeX2%6GbAI~U z;=u9}VK9f}u$1%(TI(=rqhQ=_Dik!wC}a{u!B5s=bdpKhMqU@$lO z^=qMY1FO=dgh_CtFl|^Bd}`_6WJ;4D4dMqLh3#Nox+d1JcP7Rsy(5MxkMAbsC?j!6 zqYe^>OJ&?9QCLP8rT>a zjiJyns8LWsc=w#%!nOuxd_YD50s_qGr(A|{(aT|{Eo+Y^2s^YfC_%8(1XL%JWlnH4 zT=|3UX073)VJ?8pAa0#^=$)|r1j+EIsVP{rU%r0bNAQ@FP9OstPM?U5#Ya1E|J2jk z+FN*w$Bz-%md9}2)2Hx#wL^;oI}6y;Cri8NQz&(q4xd>iV>*LPFm@2<@u{Nk#LHX+ zi;QzZBzb5>kV~P&v-*0N&EUQzmW0@xedOXi33@TH4>)n6Na}d8Z<-=qy-wJGa3nd0=nzl0g()Hrmso=`ECg(nSA<^%pk~X-KHu;Sf zKsSN;3w1xzh8yOuu(`x*@f`T{=~EF>fKlS$g5d7u^(yugjzelLo@TxkEFf4x0m=CR z-&23-`^EG=uQ=wWz9xg3ed7k~qdB*`Lv-Ue`@#w?3g{x5gBc@F)~;>(i4GR)cOVrg z;GlKOx@fK67j}}Cj2-~*?hMXS0ExJbJ_WBEWQ=@s>xJ%){I0c~on6f0o5?o2H<2XQ zU*BP%$#iqyA*E$47XE8DH=Y?&5mIaW_^ht{tr+L&Ax5|UgQ20P2UnVywENR!+8kH^ z{qZ9prKO)NFp2nRd$%HcyM=StmTUdF>v%NQuP-|z4nf4%zRt<9$qyl2UG?{7C&s>6 zoL@Y{#5l8W=;qlivhmw3GiN7UrcXf0;E}=3;nGg-txo;?#ifq1_fEk5k_B74rgtf8 z`Li!fA5<+6>FI@sGAG}mhi5y(`Rr|!-#%#X%EPSptNbVL{$fjMcL4_nw5Y5nAFLqX zWGPDKbFkN?(BIs1prS(h6!}?w$I_zqA*-+HF0bqYO7)hTD<_X_%}|=eFjKpQdz+S} zWs0J4&Q!%P@B!RTu-|9~>6As)9P4e29~j2L^z}ghGfqbH?;5htVb#F=)u!YhZVwx2 z_G9b=85^t7@9*FLSepM1OWaXhkH80jli$00_dKo&#pMOhrA^MR73J?-H2KPpxb;yJ zEEu-Y`KHWx13+oCg>VRH&`=2U-R=9mG5AU9kByB1a)Kj=n7FvzNm-@2Q6U~Hxf+a& zTG6jw)6iRPZadYDu^v|%M=Hlg;~cN78+YzVp4e4v@es|e7S4>RGb?+h{c9dbw?FWN zM?W?_%~d}vEi4|RR$}rJ$*KuD)_b7E2DJrK-Z=AZb8A~$G8-{^EjF%My`O>&36gB< zfa?2!0iKp7P&kHxat+VUOsImW*f=l$jP!$b!GzHJ!u6z|KlZL}EhW`Br=wnzNNEmt zN=qRUx*8cNcUmnl?bj;Wwu^zEgh*}CuWEIFNp8H2UAEnA@Y(+J5#+ID4~IMo?vLhwtjgcVH_c9=T>|J*>vIQGrJ{fQa?dwUekHz$89DP{XQn#h>K z+1IM#IL|zTk~v1lw|^!U!X*6W9*N>0{GB4YmILoeZn8@?;a6Q(jonpJv3qJP-w4Zv1S1K+<<1XxmI(Rq3eXmom=ZA zSHwjuvTLY{+G}4>JC`J{-E*vC`|u7jqOtsy|DM%}(*eT=j_X5*4grJ27MA#MjF=}q zH%|ZAW*$Y)h0_7UB^nk^Hnvkg-YcJ|=)~R^ywMxbDgfv~OP-E(I4)z@w3i?nrWjb~ zU%N+Suz&^h6Pb<}xu7bi5}UBQ#xcUiVgL|lkr;!CVd^rAA`w*VUSIZY-{#tBA&5M% z636jeb@sdEe~{+_#LoXNhTmVCiDb=DZ;#E~ zSV+Ci-2}@5!Xl!n2{uRT4qAPwhiwqTY+y%mRgY9++(tWBwTn5kYZ)wA8z?F!eXAxftwx$tS6 z`*gA?zo^W>muz0^f9=wxOOunQ$w_dG zMzz-tc4gtN#5xAd>&M2xy8hX(d?v`$Nrt({zc~>}Asftn)LI zj`SdAc$(V#@Z1~YzleR4{a$s7gP<;qsBGGMuIA((FL!qVGR_1%@Y&)~#Bo_A-Fh%r zR%REh#@)0jkay;bI}8MVSkIu?Z{Us|fI@*1Blsnwv_e_pWs@iSL>Pu2v0W=Ls$S8h zn)a-7r03;3eZ+R(#q|y>4OUXywzWKrB7J9wq;;vFYMcEQ%j%KoAx;x&m5PAfA-0^wGXma$P6da`>p=Ct9i)+DjEI* z(W$BdH?9VrXG;+5@-tmat{`SGK$C&T}az9PK6ix?ahruV`DGWc8Lyclio! z8TnQ}b;pFcAQCg=WIKcJ^L86rq%m*+ zlxV?kFvw~BLd^~lJD1X(dE9een`3V)?c?^o`4xD5^{TC3CGl@HmFWv|j|yud{XYq{ ztw`VYOd_Oe3qDRkE+-NLTHG0lxO%4}k#rX(1yY;kTIR0Jo@)9CAFD zB(Y;$XJ1s7d2KYU4d~VEl=zjjo!dfFr>-8-9?RIj;pgH>p1h6kx*XNC-q9b)d>~hM zTZN^X>+$bH_R^)(fxq|O5?9=!q@(uDBq zn?b!R_meJnww|P8EA8qB_wQrf1sAc>#r9bg<3F^wUk)6mm+&KZnB1*<{rcX62Xo+oA#f_q$tnXM zc1*CxCQ`Ej2v}$nyntvTM*xZkm(jL#2=nov#KH-UGJvKP@Ip@`Xk-1QPCBqiLxkt|OT=&LKDz(oQ~iy#{GE#zKg9I@fV^T3?}a2h;9w9M8GcKU>Q zU3ByZtgQe;+%<~DJ%%ERz+w?uSugnTn>WM3B{M4vEy@svS!gg}jf(m9sY2FHBoJWH z0n%e9=xlwsT2p=JT+sSxo+2VJaB>3a+_QT(+8LBsgyj&d2Sz3)GC9}=xWU1 zXOd2sDK5v-CX{4 zr*dEU`^;(wI)=gh*$8D?Cch}Q6k-7A*<+|sjRU`h#{)FoZ;I^)=xD!mP`

G$+d)2&WMo$0ZmimDt0-_r@wm)qepyTDdbR1K&i%V? zf**bhm{qGW_B_SaUM#Ffa^hC?qHFR@3lzIw7|p-9i^W=6_ukpB(CKVJS%ww?U}LY4 z&q+WvhDjhV?in?`M5DCu)K{O@wRvAfiSr6sCUnD6r?y=wHiVd>5LM2GVKPuw0)7jp zu5jM@t@ezo#=T7n+fN`X`tr=~-Y2vpb8g}I#L|D#@Rwz88XgHTbn5lK>|fG5C+;Pe zZd~%G{OIU@H7UV~xs>XU{5gNYSqqnMj3`e!3YEOuM5|GUHSkrQD#0}8}v0HJ;KU{*2WnN7IFG3Q9)KpFM{6h<3$Nq1~z1W z;E4c|0Gd3BwFa*o36N~ zQ}T=~nN20l z&d}`i+5|gp^A+V&=7B0jXOI4Pwod)3B%{b*)D4Yr`jis%)b-zJA|A+0vH`<~c5BRT z9O#52P%%i}KK;3RY)w5GCP%Iz{AAgzh3Kb0QH^y`4Bkp36HbJaP_#UDSLw5=Lqo5M+zxLj&y`!VS zB9x4A>fY-_%>$qZixN~`Fb^k^A7$v1@Ox-IzDeihBg4xKKLq))c|Q<2E^}fu*=Q6m z%Enoiatp zZroNwWJJhC1WJfzU{A^C@F?TuL1JlP10+30eC;k(2%7=|0!*QB+uH7{=6&FAXiXgU z=3f#f2`81F=KSsGH>yfQYa0qRh{}Ox;mKa%tg0CbwAedHL}fr>*cwkJzb!lDQo6Q~ zr^k$wACsbSJ4@ef9QlYo;L}8wfF4nB1Y}AjY2Si@iI%!L9hg?k;UoztQQ!la#j7VS zzTAH#nelS}p`6&;*La$4ZR*JeOue5M-y=bLV|^m=kGp&9jAImLAK|HX zGv!;R5)|ql!0ukidoF|VMAtL_Ud==UlS{fPi}x)SdItkQrr9!pBVX1R>*V@t8d>`C zGi;J~alKzJ@$5<9UVcu_d2KRZ&Q6Ga&94|0Yk6<|%;3<$nb1|Kq!aj4=?V2khU|>w znop^&si_eFl*R6P8yLU6+7e4lImABNudbes{v)u#7Z`wIc|}$X!CX?C)&Qr+XH>Oc z3~Aqh&KHf2CoUmp$05FUWq5||%TS0agh}cycGe>ld>nnE&Pa}EhF^GiY@%Ew-NA=l9A8R8H;=m0izMJF+;m0^g$=xpBafh-egdt{}(d7qxOMXLpvql6%iiBMmXBN1uqc?Kv7n54FXUzetZDj^(p6TtA{n%9ZA z8(nX*Vj$h%k5wVJ<cxc)kT>Yi zu_w6C^i|Up%i=t6xv!;i?2q)GSvR&3r915##A%DO+$t+~oVFQ#ha~Qw56+z^MTJ6t zf=JTPDEWa{nfnp-fseR7cy4UNt9!AZ6wC?J)0d{!Tqf9u(c*Gg2t zK3Qmy;&NwwiIVX%5%qr%%8&`C*R2((t*(ZgY$@naORHAE12Egbpx85=s)_)P(C)B@ z84}byWTH6C&~f$wxkEzB1ZYQHv=fX!3l7n0Bv&ey-Qdq5zGEpm7PV7x`D75dfUV*OAdFD{!yQh7nik&|+pZoW&OYzlK<9^X=M zLhV7Ad|>AE>l7S~kQn&-`EiIRt)aNHQ<!E+jWV7Az%oA zLaZ5LjE_UpKS^S+QX1EVjH|~4lY96NLyi{k-+c|mZXP=6q-a4R=;IVeFDP*46Tn;` zpX&w=8@BD_kxuc(cH!^iguUXDz%%MRMVf#Lx6G33_CtL;GhKhnYdcaA7p zT3SM9gXVJ_Wvis_LKk$COBa|c%=QH#zXC`36(w#xlKvMRcjz4&Ha=LWR2Kzt3lXKR zo_Mnw(w`>85y-M(D~m~jdEmi1>_{UoU^<*-A%Hp27^cibav2%If#GI$xMZjAy!?Jh zeb4v={ZoNGjp7VJLYTe)Jop&cCiF!-hz1XjgO#`}w<%7wV9(sch(Bdim@rbTH8iin zWAGNBA8gRr)4mH2M&EiBWAlVRglX04&quR@^>;tz8$cPH10@>Ff1{jEASuC$C$@!% zPo=U{5_1pt!0@A)zy1BcAte}GhenK0+%=;slNVWNXhioyhDQrj!C3Us%P@UqC!R6% zHHQJxz}A3_Kcs^JG1dq5y%?1?n(0|#DVd2a8$dlS}cf7X9+jpTyWnZnugKkQz~ zxeAjkJ!<`Q)+T3CvNIf@#w6(l;Y|@?o;-cJLw1v>y`N}fOnMxBu2=lFOcC?ZlOivr zP3qd8dA*4;J;shrcmV2b*l8oV@GeHR0G~rUyk*b;y_LQubQM!z&I%(F(eK~qx6ebQ zI>y4NP{?axg5wdrSw4EV6A}|ij)FVM>1u^;AY;*Gu}#1O@?plN%_{EjYY7*uXmzOt|_LzS=k_T|@TY*fF zbOGH}&%hc>y$?IZSyn4&nEn(809>~)AYQfL3lwDNiG;RojavKOv4iX#DKBw8-rp^B>blWmrtvIl z8}+-OqlBx1S^!i$`tI(Y2!0pi|Huk|mO%=9k>GP|G-6JTVsR^^(aPcC(2E25mOlAL zZJAF%XO>wH&nmQ@;G7~W0=B;UL)1IpJeO;3iYRLzX%}#IK)FGh839ER-hZGZv*&QI z-Hm(97nM@=_~dt)^P7u;C_9TX2K>VCik2@W=*R{K?~|v#fBz^nTUSZ8P0VIuf`|KUViO4N9*X=ALSdC#_4Px-8I zm2hp4?zg@{_C**4B*@HvQg5Ek6=-BlM1RQozrW-kKWpyW#~@|;vGJA=*XLVHDyju6 z+-0d;oU)>Ez5;<3Si*EYN3ha7~&kJh8)kQ(Uvv*QOk3R+vTq%KajL+EG;@v z<`cLP4R6ToKv3i&!GVSgg_@bwOQLv2C5@@`>34&Waw6ZfYn<->Dh%ueXdQ#Him_^kjm^-nwmC9Z`2t=jx-&4LNyI zOw2pL9)}_190+(}_fE&o+ah$`kD&q0wsVx(IahxrlNim+I#8Gzrq`c7EpNg?%u{potc@5+X6NdyJSz5Nn+Foi3}Y3s3y=sx1V4STKbL|NaKi3 zBCci4=jzVbc(m-qqt%ba-E2`9JN=qr4(24@oS9)T@Laf=emRZ3EeKBbzHmIXo;hbR1{Ax~ArO9;BzF zI}VHr>CE%Q+c>qw2Ea)$N-ame-};6hN)v`c{Mp7l^ibl#snsSi@;7PDUt6pp zJ|bd`E5qet!BzjGdA?K@V+wWNZuk)x5!D{4Fx@?MzJ9(8vw1Qb6Y0i4exIX&4tkA- z(Sb;s$AJ1FLmNY`8Uh3#mz3HL31tS(9mQ8BiQZAY66cGq5`PX(#US6fF*0ouA;)J& z*4B*mpNQ&(wD{xZVyenMEv*19T;$Kt<#ER}MO+^#73S#GMS^0eI?pm#{U~({wSZ7s zs-<@=j&!p@n)G1Hz5c7XpMvR!R|nJ8CLGwa$wu^XO@c-8t8$sql2}+HzJUQlAIUgj zdNN7Ws%TvI&NH5x>Dz^8oBSj(DO7xkuXoR7QeEIRAX6Zdu_&(iq>b3rfSuAqcamvk z!?4ulxk;hnBHZbp=!64FZwc;HTtY%8!up?YutLysg^h%pe9z`>6;Ieym#N4l-BHgO zz4%{uW9BpZbxs*pQ`!0+Bx^qnT^$lPSIMdni-eZ~=t3DMa_`Vnnggn0Y|43$%F5!C zlV1UEz-pmJ^ma7z6DMn+IW2nO$@1PglT10V`BYOoi3E&DNZL`F;a(~YHNCB7eJ`+K z!zgm^rZyYz;`OmJmwyBW6de8icry)DpPt{lIO9P?*$B{m{G}j0FH8@v>~*vVxsj3U zW%$9yKT)GzH`mW?=&G_AsxnNkw}w(3#t=4O5um$JY)%6NkG)Mq@?bHQHW^;t{yY-& zfgW@`NFnMoEzuhSl{O;K5So%>ltNh>1`nF{yJUQNvHrYm*tzvSh<>CduBqYZO}>?q zf(o1S=~|hi4z@(KO4G3Bzp{jx%RT+?9xXApMU<702qSZY-2)hXnaCwlTTzM78h{lf z-B8V^yOI%BklTL#P}NH0?nv><=38}+96w=xb^LL`n1UEv0d!kVpy*d)dNrHpYEhfG zoxxo0-l3eNL>)H^egVvGL;{yku7mUVMpIQ>oE3xqHcN&#g&x>*^1~4C%a>B_tIVoU zPr$PC4lWg>z0L$uDHykq!P3mx#P>S3x{DvH- zvEP#Cf$Aq8W>6dw(=Au8P%v5cd}R*3$!m4fv+|6wc1Uz6u0R-Sj*r3G>jDD_Yek-% z{U3$Bf`dm%3ybS*$lK7)e4Zf%!5uDhMKvPb)0;6q1BYAoBhWGE&=a%2-LLItI5jd> z(!|TJ|NsNLy*_Bn>MO>}w zjROEnB~VMpV_4?I)0CD{FYV))Dc?DvMx;ly2LFH-YK~W8&u#xXvas3oB!s;e8Q?E4 z84Il-Ab1Eq0*G$9TBWf-J~?RWI*v5td0vgav%qZOs|!L_Ji_A9NCaS6_g^@NmFgnp z!-T(-q9vdiX#C)@P1wE+&$k}x8B3SD5o!`qCQBNXrD>rSG-!RZq!`#s)^h3z5ph@s znbQjtK|g=E+{*e6clfVJwgbBzUB3xV9BiH!8RjooK%|N5kGqw&sxWO%AwA9z6)0Dk zn7fHH@~I7nOBoxtBT@r1_Vz=@M<%Cy7K#ef{c|0~6>X&`NDh1seg%XYBu`SyJCqaT z{O-zv7H2=9@(UFIJcdj6Ib&=5y9-C92dWK}%Ed)`#jyXJKQIR%a0TrTug+5bC!q22 zJMiP>H}GRcP|H(hyLF1r<1d}5P5N%j;8N+7*4%J_wqw=pp|cH9mCuAK+t^`UMuwup zahFuI2T-LhVCMaJwx9cLJ+;}w^v^gA=gmK!zu#TlN^P`4BMk&5je}*J4K|NhVjW^l7Ij|z(`Ou zKw4pVP&2Mu0J^Ej-$tqeV~1oUFX$9!0kVijV=<^e;MTO^R5-Vcimydr&SW*2^#dpk zCpf_xULLSJfW|aXcq@$dY|5A;Cq)Yv5DXaWhd7m(+`;^k0OQ0X22)>H2T4N{Guo*T z;+*@JIiG-dtQlkqhO~Tc6#kGoo>(o}DHpvwC8JF3;x?Vpx(f$PYbxW(ZBn(6cW(rk zFATjc4i4mS@7})`fTRltm9lVLd^|9ZpMxI3rj<>{GViW68_9AW&BBH)x*R?+7+ZGw zs2$}-@hs+sels7b?G=(fm-P-D*a6c66m@w};L~3qrjby+5>tXuT+t4J&1UYAkEQ`1 zU6sTM^B>id-`$r8;%b6$Vj?=5CS3`+7O;aDweNla-hu1o#a=U06SCLos*r6#iv&X! z+;q;%IOaeFX5)CloF~ESJ;Kbg*G#DGY7rS}LjNA?zcgSa1bY1NJow^1OAkC`$Sg!& z=3vMp(jZjy4-F-T{B(1u3BKvCoS%=bb47df#hw(+H__5J2{YS%C$vPZ%R+E-D9}|@ z)O;}ha_WcfhL48_V9WjZ71VaA|957zl&%|EX9@&01wzfXx$P}Wmwc{7g&FR1YjP}2f>z}*`e9Oc&Y41P! zP=5ZSGv9R)lKQXGYv#v(`1d{wjtQFM=3kRhVQ$3o3lJ9@||q3LPR^1%<&;j}#-T2Bb`e z3$5~*f`7KoGB*A>cJ;HTFo`3jeyNb)ASMqwqx%W_aika@VB(Fu?uyJ58T0Iazj8ZQ zCFJCcfR@V!8Cr*AymF!VhOVbiogMLd>B~n!KYly-);;ZhVKuAd7fxkw- z5%fRPAdZdZRPi2>5!qIt{jio~>1i{QI2qsJin%|A=4Q&HL=lp4lGnrIt)Q(|u2T%zPG&8S_UcTi-{6tsDQ{8R} zhdxx3`si#h`V(arYIr-Gc4g&&stJ|DP>7Bq)U9c-GQlaa<%2ESF|-bxsv%9)m{Sye zkcDO%h|Qp`Ewl1pShTEY{wZ4~M{$KCCQkW0n(g~_Nnt!FIB3K zFBt-G^eCV!lmOe&orjk1A>eM^uX2aML!ANrTY$WUv<5+anb;ChyvNL=@f|m(BdT2_ z<2c&ka;HT52INXYa&of11HRA5M?fHkLR7}ArFTC>UZ(N`$4^YV^*5}Mf3I))vm5iX z?``D<;4MW9Hl)~Jh3P!Q+kX4;w~)e;r$9^5SvZX;Fyof&fNmOk0y1G6(EcQJ1@PLl zLf#5VcMBW($D#gF8xCyHAFt6LhyAQRq(LZe82y0gVtU}VdgaU4RIfBfG-q;i9w(F# zoO3>d{nVCRrl4I#@uo>v%`ur)qV|6tGbH*#X98X4>MG zqIaqVLWTkV#FU&)Ak<`T@JYuQ!l4EQ1)+NkLUs-waACNec4^^csb=lWCmYWm$S-Vg z*RdKI8*fgLQL#ZFD!PjOjECE?E)-#p%gW@2=p^T>FhNJaaj${ATo>VAiF6%Uj}%uZ zy6;@p;Dck0MB zU!N&0#q=WU5Eh0wrw%Ps-d{LYOr^*LMUWjShC!w)17z@vkIP3YBI^WG3+SB;0s>pX zPza|Y)xp4qzmv|_p0CV$s&*_H;yPCbVB&ROR3ooXFJr6czj9#|KY*~LH9$Fw*sRD5 zGiOFA)MW!xs;QGec5(LrW$l0$FF1C3ik@w~F%&!K=RkSfh|V8KnpR8g8LBi2k5>%Y zx``^TM|KU48JqjT7wQTfld_C301os)jdLtGe+g~xY^x|dzvv&IX`h3Pj zb$`?5tu=g%m`!E|eBOY+K%V>yw%Zm501uv#aVH$nScRdV_U__pb;#_A`|W#)$!$9D zB$Wpgj|&d-j3s{6*lxjlf}d1oa&PI4EtUt?3aAKE8gVaJZL~3p4_P4O7)46IdEwrP zZzK^BsoJj~3V=GFgzXsJ-!h_!2IKJ&X?Q=P3lOfumgwJvzMgR5(1#Gt9hBYVddU5wLbH#d5?#Qe!IhP{iK!x?!P!G!}?qAq7 zAF7GrH5L^yV8UN_L^mW+2r(2Q2MFlU>#;@(OhOalv(sOETcG?@KV!(ye-#CPd#f&2 z+#n*0GOY@<}grqm{SqGF zFEbm5C=o_3q@DU3Rt=AT;bfn>P+Qj;{X(8O^*bSpe__8&-;e)aRuYo?fey-6$#p~V zaGtn&c4_Up%K91RyKmPmoXW#P-u%LQrJ{|pD)0O5jEl-85Gx!QY9ir_*Tm~h?@6)>DX3y3otcv{p6 z1%M-qq8l0-U=n%=XBoI#Xh|9YmZ65S0g64s=oa|_z!e!}K#Xt^yXZjLfC$-Z5(90= zJGc;R1>qPH5&}0#7$y^OFTG~`1e5N{4aIK}OYz#;kv@lk(w%^!!$)nZ3NZEjZ!ULw zeb4-JKQMBddQ#nT8Rym}lx3~`D~{bILrfk-BTK++rdgV-S_1A`QV*w8+r*a51U3XTa}0s67>aM{qK!H=26EoJDd zM^?Tc88f-Z$hE61I|DB;{GaaL1FXt3>-RP%Zzd#~NNiY8#26(ORBVU^gECeif(>c0 zfE5%46sgIe224anMMNYPG}wqBN>OlZh=3@dh=5p8nhivye!sOhnfA_1*g4M71o9?&A1!R_#D(2otYsRMg_h6g~rm;4pMzn){Ca^yhTew5bFp*!wy(dP$_-k~cx3G~uPwPY%L zR_|LkZxYV&`OOy+ip+s6c@mHrdWQ~2Nzz_D7Q!MP>Kiw<^r0O+ed<*8+j&t7?c;V+ zI20EbGvtC((Z&A;Q$-Q7nVVl?0W?t@6$OP89B*I*`!(q94|8)`me9S-~UaO zF*Tr?cF5G~J4iRwv^PDxb_whgIS@AJ0rfhY9_DNq-@~~it6QfbbAQzWL{J9z2il=P zESZJcA(ld&=hJ$rgM$bgj~!!ZBe51X-DvDj#>NgEI#h&uHp`YQ=?s+wVvR5%yEhCy zZ}U*+2l}KOmTB%!na&r&r8eH3pR@Gr?J~* z4sDF5nV6WA9#QPGSIljXH+KoN*nCWX69IV0gI7Mj3iL{!vFos(x~^T4rjbtn{*qTL z%`A;15t^G7KYb|ewE-U*aO3TaWa&NFb6_pAGwqlP zsI-r>`qYhVY;4wtg#5_-H9yHtdKSn7jy@NxV5El3N2{{3EFE+c31g$5I=z6T%n(+j zZsg_VRXsTB@tj~qHr09H`o!d|eGWDW>1uQa9gz{B@gJF zjMP{YGRBGt<5pHy`T6<6ozVO+eQ&*bx3y3A(gTN&Saop!{{4}WB@})iX&>lar9U_Z z`7w#B+#8W3($h29QY<+lSWy!ls@i>!wLCVV?GT5j>wSu^lm&wij?dXuyxOtM+A@_QSq>e_|x`dnOiUXr|;~ad@^nZXC7gR zsSBdQXsq7y3JhjF(En6i@^v_tp1<6#ziGctsjUw_aXeVt<~sa=%sPaNZd~#=F?aIw z86WK|Eq@?DK6uZEtvae3O?+Ika&qvzz(}NYLV#bpBr+~wk(XWqrzkC0H9*ypz>+mhx9$fZMUiUx$RF!0;(A}R!*V)#8{F53E z7ervv?NLMYZXnSEYkCrwzUMRNY3uPP=s&0tn znDD&)t%3)`=CJqWSoBzP(4 zLh=H=ym+b;DciVbkNYSOuNPf|RJc=*rf!>dJll)hna(qK{K1p2A*u0X(8WB?uK1=N z&oiYe)Ab+U@xT14lcNuIQL>r@)v{1x7R{m>x>z}_}r;ps@|FxOmpMTG3KNYrY<&W^SGE(6*dSTN+xQ%$z zmyKTeuL^b+IH97Ir#G5$Ts&aXXcI$6?sDI5hAnEG;4m{NHYhN#+l6W$Y zKPF6=z}95iLvehl_Og9LFAyanq444L^(+gzs%oc-;cb1b`SFLFWmrWFssnOJABg zaNy{}9&evfwhWN)W41jl0(Cf&P~nDU)TO5#w3Px*Y_U+;06;s4+$D;)GTP<=ir~e_ z5XH#QPd;{oySci)h80LWx(e5lbkB$mTZJ^s76T%L~m1J z4|Zvv;#@Osj@n#$XcU^A(5~r)P}e4qaKI&bmfYANYR2To`sd@+BsOoH8hE|LuEN@5 zpywXTz@b)y2d52ukx)lUnHSoIB-$<+DN|e2*nlmU(Rrcn-ce~zw}07-f(vMrL?RiZ zMHf%8QJrSjpjT_p@g%_ykd)kkp~K`u8V(Gb(zMg%8?5ez5*?b1CDBN-1=)R}2BSkS z)kc4_!>ZuL@+o&DcH;W=>seXRkYL2^VBVz?a6K-0xi{V6Ak-CIS4ziUyRJNI<=ldT z=>KzFm)raAC$_UN6mo?cAo8kUfz+;MIH#WbGDDHDzf zm{vb8qZ^mx{QPV?Jx?7h)N-}G2M!znr;Lb@Deg8sVo#nV446QZA;X4MukC+s^|*G% z^fr-E3f{N-lpC(~k^dlb{^!RJpY=@weQmAXGbq&--_6I`7o7{@XHTE*LSqTb6`@7t zQ?q$uPf!~HbJ#rhjPWw4zlxiI2_qvQPnTw-m;d1pZeJes9>v^lwAP1LV)zEc0kffR zaoAZ@7X7zfo2BhH!E2GBP_W(!x1ulb_rZg`UMu161z)Og zs9l+dN>_zZYy$mqt%|4PlWCoJGk-uf(>fpuk!U_Sio6-W!5U)z8x| zWoN)cRX9(4QiI^Ct5HYz{9;+uFbwMF!4}qz8Wd{J_>I5o@m@q-`eeY)#~pH)q&YOa zR)iJa=X@&EiU??0YWL=-P%`;;gRAjV2X)QAb!&$%!)2J9K$<+z8Yo~wY;5e=v-O}O z5(!4Gk7Cm99hgyeFK#q^nGCW~H(F~H$WAwE1zQP5MyRgJ63PKnIvdUAUJH{<^HW`2O~S}(mT%sGS~#vlubwl^f(I`? z-W?o}g)!BzG%=~)U#`Pi1|AxzA+7t!LFNERbpD&SlQmPOwR4RUF&p^M)q#Wml>R=dh_|G+oT=Q; z+){Cng!MkuE4}IXI$ikJgK?B$W%S>4h!gJLNjqpd)yrx5@^D0Ev|));b^7)_a_m@F zENQ_FC%bJNU7GftrPG$Z$8z5lYNT3AX-5Xz5hNLX`XsbM27n=Hh5#hNnsM#NPkU6f zR^DiwDka|7*0f)zIkrIk27|*KUrquj+X4E-jvRYEwy+;a8kvlpz^Sc%9>`i`InY7l zdkiAhgMmLN3LP0+R+-*PueAXAz?9yIrhB#V$Lls9#uZTVne#Oa7iXv>(6XQklY|56 z9FYsVdKcTb^}h(F3;m_ z%m228Ea<1oQ@z_?@2YD;=(+xDzNL+napi=vJOP7DV(i%6 zy(n_{2(M2o7F|kQ~x2` z>D;+9@d1+j*l)luQ|ciCYSFP0d!P_#b|Jh(T5otPSIoD2L7$uufNGctBwCf76%=?u^CJJqWl0q|6Q(SD%AXUnpZen43%7^vtA&ZGFW&v*W z*jicwbU@Pr!%g@?m(HDy)Oh$hIaK$#aPB#ya<%>B-h`5VeCOfjYp=2Uj`SNyRjYVX zu>vZlroCP>Z&=zU$-Q||Qx>&aHwmRu$$h(xU2NHTvB~TCt)NYLw(zg*m(~9%LM{D$ znCp&4Ymlpmr3*9cs{uam(j?GhccrAriQE}Ilvo)V7~rQ4AQvR~lK>{#e%#t50#{HF zI4)oAg9J-5Lh7T1itE#O+$M1s<0nExCG{Q7u4;c$S=x8Gca+xV-J{&2Yn>y7VNc%i zLU9An7h6i2a^$_dI?Q>2ZnBO11k}RM=beJ~-y| z>C>4z2R&rdx9LSn%uPj0@zWHaIf0kDy|(}JQpXcq4zQM);M`y_?lfLvJ`{|nXo#;* zq)tHHhYGCq_$(E;fa`yvUm!WM3Zcc+o^8U)NNm!lkpj$Mazog}o=C5W96HH$=IRgh zlWYjgZ8E%Q%S1FgXHK4U!CXnQOZq73KY5L3dGCt!^6?J{mX)L=xGrux6_VH{I69%| z5c!Uz_D3JSHjL{5-Osj(n23C?Cr_Sev~N#o&!8H^T6@lzHGI$1%T+1AY5~~64)h}7 z3L%L*FgG8f0elruv+~;zjWf48@WZ?4Etn|G=fl#nGW4VfY%62^lu&e%+ce0dYk#wm z{@Z_DapYGp%=*Lo#iz&?p{-*|)^UPVZO*W(BIvKi9uft*w;|8hYQo>+ZYmUgEv&AQ|w!LIW0WzRTD15JuU2PRT|P9f^wqWZ-&O|h?rD9o#d{ileFA15IFc7~vqyG^((Xr`zS_UD zld;Wb%LkU(@BC`_%TG?mzMtCi+f65DfAztEUOF9a%=^x={hSwBU5QJZIm>_OroOW* zx@)VitiBX7!lPGkP*B?!-@Nm*4XbO&d|W#!xlw!Yzf3Y{dUb#E5B=XkH17T#M5F2N zAQ}&;LNwkxpdbxluPbdR z^t52}^T8y1aHa$uAZ&T0G-9ndT(Z6SOs`9KDfl-F zy*fO5-NOe~?Y2KW9<%%w;5mcTUy6&S1Ljm$Y%XHLCHSGfxQC*}KXh1ya-4T8YQQze zE&P;Y0o2bUx<@VLxpln32Vv{SN zbL!?!)#^1uFQdjrW(bi#BV$`(g;2u73Z2r*&b!g36GdkSqbm%P{bS7qt%en8{ZDgV zFf@#b7mJW;aBzjKGqamIW^&i;LMuG%2?Ui$?vkXTyZ>C3Z@=|Sj7d=LYv9Z}>|tN( z=m1Nni?(L>P8+S5XGVv0Pn)i?v6=kG(tbVN9euLJ{({wKbSxYi{`?^TLGNRoGjpQ4b%U z+@B*CM~}Jr)4esXRi{n7A%dK=H^xY z>MqrnB;&I!26%idxm15--|HV+VP(Pcb zyIt2}u;w_HTs0opL6&gSSDBPrMT<4&#kuz_m*qb0d*{OX>PIt5%0GxhAtbykN3Pkf zA(0u`ln4aQy`tNbaZ6!iI!1Djjvk#_rzBSOR3TPRwhv4R(%NdIMsqM5(UaxEFlwt< zJPwyHU#5t$VVEaO-Jb{GB2_=nquIr1r=gFxmsdTlCp1MOav18BLzXdCSx3WdQ6cbG z7_#fRvJwX_d9Luw+YGwb-!RWUxIVe`@DWr6Rm7f?%E8TQz=!-}%0o!*iK{cW=UlK_ zOLHx=mT{LYxE=K{Yum8UUXBEf(n>?z$Y4=s`9M!V??2#PjMBB47~>k8yFLEeK8GF| zXZyo0VojmEqBWBEJ4$8V+6@#y80a0L?;__#L^O2CDam zS}D06JUDDNYq8;r1pa3fV22VC3_5I-DCM~2!PlGaPUvf<+N@KjPAv3JBnz;+-!Dji zk7g>$ip_g;KVHaaHDJv@ckMjg&)@PxOf4n-m)`tFTmA4k+UF;Omd_x*kqU&0n_bXj9~Z z|5aLNiTGkRYCTYl)zh!EMz*?jO!q*ZK~P!g%u~-!MW=ZrQe+j0@}C9)Vb_#vP)wJ) zt}d8nZZ0c#{qbGVTqsu0I(4DpX$oSaNXdSLKVp2k zW#lN+=-ct+ zRwr(DD4Tlxh*e%f{#D)Q$8dq7lcB|44e7k{7SHI0R-LktWb%sHpwQM>fBp65gq5L_ z+Zm(M*!yAB>V<5U#FOOOanSJ|S}Lq|B4;2mi3rb_{Nrh}PHy<5;{K7Wxo5DxK`~`z zZQU7qI3nT;0vF#N+yV$rLHwWz@!P9HiP7Cc+;c1FW9cztDI!jt>eWZv4~yPG$dOZSJqwQVPWwXc{v&g|k5^XbzG zr6rTSc7p%Bg+D4VUj0ofl=Z%!3Ty(FIH^Bn!!W-WoI@!iw|112A~-&jlB>~~a0;qv z=b($Uj7en2z09sPPQX%=nT*8z@maTHKN5x3)9)9WG6+nK4jtC3qjb&xVFbaV;{M|=8mDK`?232HKj=>4aJAhxM{$@za4N=Z;X*Q@M0Mk0g z90b4wpmzdK*q^M`wBwC7EOnbw^E!JcQ=ZiBBL?tNCON+4c#_>I^8JKSb371PkOvnW z{2XNyvlnfFo(Yn?>5xu{E&vW>_81b2d054#Aw!~Sejc41;nekTOhxp>J@H3tZ`<~= zxw4|H-`#JQ-!>Uuh-#egVc2~vPyqC+m_(^rCXF%Jl;Ck9L|964ekk)8FA`KYsH`Hv z)7azo^=?Uhx_ZYXfx>Q3mk{pi{4W9oK-N>ln2c>LM%CtXrKat9AhrD{V{|7-!N-`q z$;SxXP(M#g@CGeY^o1|^fdTufUkhSO?Aqd6QwN-In74rIb(;~k6p)|?(JSd6juGuY zbX?8;*hy`SaNkNofyIVG&LukY$z5accgj2h*K`oABv6u^L5@2r-t~_teWhGsRdY8@ z(aImNXOf0qQ9_y=5!asezED!Jk=rYCau;u6=0qgEs7-e@#)EIQvg9)m61Lu8{X}oRa2ZhVnn@H zxbDqV&#Z0^BSQjjttz^l{kTshU>$nCM09&O52CzZ9}#U~SA(jH70QAyr*HGk8!hg2 z(enYUu6%N6CJC`&n)ZsV($x5D^Ci~4yNTxNebb=#q2%Y;5e6YXIcz$H4Z2>BU=<{vPR>YkKj9>B+X++_`TO z2*2d<)+xG{432UxQV=D+%crVz&MAJ;yWF~4?{3+gPt|-YGpp#Kuogj<`R6}Aknrtt zy>un0Gl)7p=K%sk_6sSQmn$_iEmCY$_?0ah2PpiV)`zZKp?1&z70;=2O!fS3_xH!K zmkHNJ$s0=u6@{L;t*y7`8wGN7uZt?SiF2p3U{pJZw<{wvGt+fP^6=&$I4z#~t57`t zbc{Slt*u+lnEx^uK9s_mZIu3JG(%tL2K*-=!euXJAXXZ>>8;`6LhW&0on=qAIUX`* zYCB_0bE0l@c7BOJ&=%;5z*9|{t-AX=teiT*@b&A^1u+ABDvaNqsOvd7E_lKa)rHU? zmfpJ9Oh6^aa`Cg?WgAUa1q`8qC*Ow18AnHx=@8CaW=k5J|718tASf`Yz9uF&?Q=P0 zs{b4ClV^YU0F|JO0LNvElX}n4r8DQxpI z{t!FAswb08?HFQfNT})?WX%#|-P;uB^!%EEj^9asHD?6gK>>`Q;W+!D=_nxcHAk4# z$~e~R*9Q{aP<<#A=^0U>ZMVqY(&Ftc|2uVao2zH=ZF{Jxm)h<~b;IKQI&1H*(-8k{ zPJ79o6n(I3QLEm7cEX&c4g#E7^JvQinN+mE9-ioQ!OAJ~@~WsKE*%_Uyp}BTYm$6H zJGw(umq3=cTsr%h_G%bp%^%RseO8`g*IW^zo|KcxL~$np4blR+1{O#D1UV{e+R7NZko0wVQmuR}|N z2EP>jBq$)V`Ne}@As}$3{$Zqbr;{>j$dil-&hk-Q^-3FC8miv3=sl;M zG5nCfouk}`vFlYi;Z9-Ae>KirZ7#{jT=~%yHk65k*B0Ks9S7($1+bcF7;i5P@cztb z4Q7pTYL!niqoSe=p{qE-Y0Jf%J7lTDQ&~^aI!bX26-%D`YS7P|C#_Q~fcYCqQgq1)($`Woe!c50pw8*RB$EqVw4Y~{08*%c{1@o)e5 zsW(Lt!gU)%1T(JDv=5>wVqn(oaY4_u*}It?z)^l4b7wwE*|OdR}}YcwtFgKg#$016^x zK1&j>frv`4b~2SrC_pJAHNohphVIN_Uwwr!#D1lrrQNb!76(q#0ZiF-IcZB zNk7E&Zek}%xX%TP09utnyH*sq3@|e{3!8e|GPliZu6*C)aXqHxQCIQTVh0qtPnq8A z2QwBI-Fjr3XXCJbwBxGXRTHi~IBQaA{PdMItALfWMkzwSR^9i|@(KIANxVvKY^bFd zegrqUL-QBr9x3NMJfal+q|?deaIFG-En4&xSwiSp1TXM|e_&t=Pel6j|1$N{36M@A z`HtKl-&V$j^%l)m>{yZ{ra-b?N9ZZ38?*kBFn;31ON!JfV~B+EZ+&8RIn6s89wM=| zocJrR;>LZ)t!&*%??BAZ!BZub`EQUSJWM!V0D2Wbk@aB9sYk_kOb}DgaECE3kqCoa z_^-tqP^(0CLJG_l25)|MaoC}!Szs4yrO4#e5{GW0vSmxa_R}p8R9TF`?}B~!-`fp7 zZ(-|2$OFQAa8E+U7blZ{9)C76GLkWQ?#umaQx9Ciw?JJ~k-uyAo=f%)ce97h&(a#P z@y#&V=2pGt06`K1@XE>Pl)SRWt!F6`^)Wn0U{Mg!LGQEG2rwpF$*^JTTiwyvc!~8U zOKzG4CJxZF1sdHq{C-q>K_7{)<@^*i7b+e;#(&|r0t!U^JYp>R5dQx%5a|$oos1oq z8DBJ*;c*iQ_BA7Y0eG`AIJqu@;8K#K@z!40BK*43JRBMiu$6S3xi$Fu<9e4~mHv*V zHzK5QLj#0m>?S_y>Ewlg5Ng%klUV!K9H|y4HUYAHm_H#~Bm*1rj@bwCcm;(Ay;)_w zz&RwO>ZA$oZT7O1L2gF71{mEMkm|qrpchS;wjcCeZ1{E^w>L8swClZ|TY`_-Y(}W5 zoDrZZlL(}@#F;Cj?I$9eyIU^qgm1#g?oA-Fgp{0^KS6CT!s(1%o$e&KE`3$WK<&?r zI#ML4-G_VnNV5LrVzLah{lJl@c1T}4uQSVyO*;0Yw!Qq+(T9;}E}S!>B$!oC zr=f#>8a%pWPG|q>*yT&jJFMP1$xLt%g_%Bj>#n`y@(RZ;wDZ%=bp7)O8h(liTCO`O zLqK@Q@jleSj>P3h4?im6-@c-{e=rmGPkQ7O8W zX|ra5bmtTl)X8Y#;^E1i6gI30hBY_9yg1#kE=tflt?N4Vt$khM9M(TW;UqIR0i0#R z0g;wkMmzBvs?B9lX!`-xg5=6zL9T8h^Dp%*2bTFSc5ye<&fi$!k5X{Gy3~^r!hoD( z;m^s3r^qEh6^vfp6A52OezBV{KSz$E)dC!#wPVpGccrQ~Ob#?Xrc3u3VIuh22nj z{v2hM;VD0K3VJ(`hyRf;{6*m(M*jQ-w>mnIx`TqAbzZ%2>W^VM@J((! z@$4-a6C7hq{|1!WGxk&CX^#}ou ziIQ63074lfv2PIJ9KeaF2hpZ2i2mkQ+w3Vm%JoWnCAlJg1Hq)YwLJs4V{`Y3Vv37B zAfsxJOaC8{96Ivb7~{yw7sE){>bs&-95z3}qjyM^T+V+1ZaFx=Uy`g=lG%RaC5Xc5 zFxLzN2d(G)T#cVeM(7pK{VUFO@ng=GB+@k*g~`4fMpVfC&!i`yNx_qH%7+m;4CNaF z1J){7*~T7d!%)}e=T7L)K#In&(Zh#Vc0JHV{AHl1)*pUrktRSY7UAa*&m6?54=}~x zesckPrcTt~kjIF#-;HUFwUWf4#fQQm-nY+@sDPVCazQs&Dn%8(-BejWD|=1un_FV) z*1NJIEIn`Sv*)!glh8hgLW1HcFyEM5b2EyLhXK#mo17>=ZCI;HI6zlOVS%zN`ic>- z$%(SUv+8Q|LkU*);-C#4bm(BvI|tL^WuxD`@lwjE8j@6TA}Fir|48|e@}>D&sFG8l z{GM}PYO8?Z-CMJZyAcs=yK4@jqbVKw&E9-ul=25nQUO*S`=O*sKYe6Z`Cq99rT-j* zdbmw#((FD(g&*7^B?HqOk0nYW^Np|+U^Hx(zb0vHRt0-p;i*Y2fc`ny&f6Wmi+LHS zNGMZp;9k7|3#{#x;DnmCD%F7_iEwqBw|OQ&b8$N3jw4a&ht5Mw8HF7C7Y zwI0*`r*C8Z9XEWRuXAzl#P7#`zhGgHMFIcy!JI#9+ng{NX*u%dy{((nKH2i2zs}r( zKV52bRZZ>3xet3>|Ka?$ZQopSoMN{?6l^N-G4`j3* z>_{+^O!ivP0W9zSmI>YR;JSNJKP^P|bNpcIx7(vU?O6sPA5gLjlSPe_IqP+1LwP0= zt0bll$+YbBM}&6Mr(UCRf+dm37b3Z4#D=89p7H`UgpfXqfqf4W=kmZ-V>c~Me`a78kH4a(EleQ&C8}N@y^v8jiKNzTS+ts`!!@-(s9?Den1Uv;GLH{r$tZ#rl*B)J9C{e8@=5Ykr`? zsNk++36ary96jI!U;z${oROeydSm3|yS*IT9QW+(l&Fk4^HYat%R*?kL&R;HunL?^ zmGlqln?pe|^dk&-5>t+1{AZ*AC5b#nvjONioWOyUcbqR^`jVFMG%#NtZ%TR)iMz|@ zLwAC|@<~wCl|G&=qOr{5h^trXs#dnMx!(K?>$r{z`jr5p;;SMXan>CE32%Na6%mBd z0w)$k5;hQS;jzd_$pm(EbaY6gh9ekFhElTFkF(b2V^_*%kyOz{eYazh0o6uRN&Gg~hVQs$?#h`i-X$hO&0u?-JzF1+&5m4NNms~CZg}kyF}=_B$q`xWLMKO< z`;YID-N|>OhVeAer5a@{z@wkL7b!Dqn{lVF%#c_BemU#pxWXSbD9lg&F0{J35mAdY zjW3l`(~u{{BT)dClX09IR?qt*60R&_tz&mB7-ste&7o)U;P4SNJz^U`T`sR#1T++l zAxTtk$RhZNAJny)VNVZ6Dqq`4tFMw2tXnf)YK!XuauXt_A6`7$+`NquY2vF3c2(^< zfBrlj2mKiifQrJz;Rd2CrS@T~F$b+`NYl}&SAn|zJ$Oil!)I@ic zOU9a|m6fQ`cvxjZIovRe$|u?qt%+=Pgy-88eYP90lK}o{8C{vW$WvF;z| zs&bu?bjiF0_Me5l{2#8NMTr7BRpu4nC_PTA#D~Lu`q`NDbld$IZ3kRt^jkQmYoAKz zbH49^G%t@?Li&PU&Iu*w0nCV&l4Ep>U_u3Lq{$pctgK+fY-c*btc-epoGL7B_(;8|gpTAyof)bLNR{C!*B5P&4ow`7;$oLg$sbUhW$oHlbQD9Jj z81FdsPUjt?&6l`5$Sk(v3_mC`NUU9a7S7{NVJBaQ-+#tg`vL_~1g%q-XzU%Ug-c

9)-=roi%-;uVu`dtN8K0t;egdUnyVFxi9vrupcYG=ib(@Rk*Us?^!WP z=gR8lQWDBU{K3f&ObeE(gqj_!6 zQ9d2#dK;^7UF96ur&IGb^UTgwl{YuEzAlzL%nMK+iHl_{G5_9;ae;Qn6tDQ+{39yd zfP1SilGo*&WVJa6tqvhX_#uXVB3(}8bgF@*If_esE@h?)FStecL>^KZ3J0mQmX2d+ z29f*2AmXrm66D#-u2A_(A4aP1N*Cz{>`OQPWAQT(P02N6Iy*%Msyjn?bFw;0tRkl` zA*)W1LN+`Dpfrjugx+F>&Iqv-_Kt+!rzp43LjfkaQ`hY9h?#Cs6mMBGBs9EX4OlY6 z&V0^5w2yQx9YTF4c(}$Ky^U25*dj%JCp{ZlR)abbgUP5{j9b( zI{Fopmp|4XMZOkWp|+nC&w-S^GBa3leMB@SZYAcANUc0opK5_oYd#)OW?Co}t^35* zR1B@{wrjmc<^EkDdK|F=v~!3JPfWz(KskID>RD#&hPM9H(+DF7pp>^V_jp7f6}FCD z8z1Vg+5)Lu8hMDgH5uZuK+hdNC8l-4K6$h~LG=}ZazYQnp-rDIP%uRhdT$& zk4{g2#vo+zPSS7Je&NWh- zi~fJaj`SPI6%(MqC{lW7Ka%u(MDlN$3th}FqRsZ^$~@HfMmwNqCBwC4qNk}(0pV_p zWO|X8>FoxPU((ZSY0l5n;@b(*&*_H4(`?VE5K{)0p5USp#slW4+1KXhjqj%6(Cq8C zq9Qi;l%@x8_d0dS#dtPPvEE*Ie0lZpfFZxR_L{!Hv%3OW#~zunT`>tr->LH^CS_A^ zKzGIQU=F^o1R{q3O+dkkK8-Xw`dgVBh{#)5d>-|M;UR@G$C7uifp_%`xOcXMlru1B zb4a#BM87A+I}aIR^nabnipx&LBOwYw&r*x<8X0RnC3RRtAk1+6fk{ETiYb77P%Lm- zu419mW_(Ji?@8TS^_sz13{f6Kc~6xcX5f05rl<9&7h^S3$aO@UaXQhZY6OdaEwz|BjYa(zr2CUu79o%S;ywMC%_`)$~O@i#DV;{Wg&e3g; z3p6XMQrIu3&qst^bQWp8WwwJ{+BIAmkE*9zK0?%(R2>@?YoOh>NjAyG`A)MvlRB(e!@zfh-y5*{5J<;`1pG^g}* z?y@P_FXnkqrz@mGG>@#RKFF!nW6PDgKlm0+nbwZW7ty3O*`&fD?rVL?S<^_LcSjN5 zxr=;cPg1)NL)Kb6eo1&9urf_%j3^~32iqxXZN9SjMAnB9RAV7!Iss$OrIPnpwW#K$ zR>OU*2l{)cR>h9QMN4t6gH0Nizmj!{j<`JmZlf8QASJn5MGa1LxS+;5P`Xn*kV4RL zQKYZraadKpg6sQ+vxfea3#G6fLEplJdX-GEyL#4qaLMyNm4VD1_NsBo{(!9!Oy*7 z3N1%?K}MzU-#L-lba^P+2@MLf+`J!B&AVc$T}y4+9ue_t`ym{O;W^Qm9vLZ(qTkn6 zR-u!!j_K(ZPq;~YqTpuJR%Op!t1J*Vt5Ue1+!q(egkUxifVKta$xGXyj%ib3#yOg} zgUPhDz&tWo0)dH|Nbcly-M_HGA~FY5N0M^YjU0@Q430@;gBmB4W+b7Jix#mZGm^qI z8?(mMl};mTPDU-Ll{KL4$NmVfT}#iC!HzB5?2a^woc2aSdv9!iU*pDZ&My$bOK2}ixB~@<0W+R?nv&9ZT3Q|5zYPH2ju1;t z?rID%y|MvJ)q{QfME~)kmn~Xo6-^rd)$}gI+I8rVg!HAPrw3d3o&jct#s{rp0{dUE zp6rlY`kBo0LB1c_OSEM853-j%mLz>NCq2FDd0IRr)@LJ4Z@R>WJU0LQVPM14zy=w` z?j?gQS{}|Rx3u+qd5M#CXyHma%%jX%F4^VQ_%jE(B!F`H0aP4XqMjkL!j4LzA>;kz z;C(u;iZtah(VebB`FlNpqy?5~8HC~Fo^4Djk>^u`IwG6H>1Ecl4f&f)mJMP0H#)O! zMz`5K0E`Jt*g3K1+BeT^=FCYztW6*95FTPoDN7~$GGc&NNpzZSSzgQ&7DsK^bI;y> z*QpIP``V8<-PP-kO>|cd^V6v42|sr!%_-Tn^td~t!@}Xocch^a8U=N#ex7;vgD7iV z^nsyW^!XGQ%;xD0yT+Q_P#f#7BMv5^pgTS%wiE*-xqWdD0{V7ioH7=};a1ttv~DsC z4%`t6wtB}Cr=p~@%=V@d(x@p{Y$h*i`;*vF)U`P~i{i2>{T`s{&wEt7kt3VInvF95 z6MO2D#58xW9+Mlqck&!Uwo|AO<)1rMbe-6XfWdX=oYV;{^lfeR_a~(a+uObQ6}U=P zl2azaVzwfQ0F{|zYWK;&xUxE`=%v5TJC72o)lv{x@_ReOZNltI;LczAt-ineO*h)L zGq!wo*}0%}mtlRjA+Tx*Q1gb{<^Rk6%aF9e-b2QWF&Q%(DhFX2!UwZnXnWsE1`EZ^ z$iQR1fn)zS-nt_XFN18X0Hk<41$X5ckO%8IkZzJk{U)>VsYSE+<)S&;MV0x41Q@rZ z8pYi`mtr}$`4F4n3a8^8q!_;ZW3Ad%>mT}kvC92&;N_G@b#IiCSr z7;80#XkGEwvR9;uvFnn<>6X2M&`kb)6czXc<&fhRaSK#IEQ6K#?`bzU{1+`-)~|2h zrJW^p!90>}_sn!9Or_gZl?9-+g{TA3L8G}ni%x!5G1UXn7LSmLz&->;IVtYlxrm?s z=KzK$LH6H-+DGrcU7q08Iy6rl!{|vXS~uKlT~l3Ad$FwwI z=$l3r{W5nPQe!@8HKv3=%Sua$n7>`TT6t-%J54Ko-a)w-fBR3*+fBWeUTw5az?}7h z?u^37#nw42aR#Dqg6WW-Ab5=85WIQzNodH~NjtuE+>yF+Ud_zxGPm^1a$%&9;cm7> zEW3U}H}?ggz9ElfN-;t(BQ+>uN!q1X9l|^*hxw)5E5decvCMgx*0CJ%qofHg41Iu$~l?Ygp6#M303zF+jx)=_4AU35q%l#UPBJ# zg`q{tjcIJ6aeUpn<{IJwOc~5BGm=ilD^#?aDJB<){w{|f#x8-HZB?&PoWJ<%kRY#w zZ>R0;M!y4iM1zO9?2pzp&GW0A>m+d(HeD2^b(rm#-s-H(7g~d5nk2{zN z+%ZlKIt0}I=cp)PCXblOKw$_l`6RzEt-kiXxNU!reFW$}H5>Zd>qz+();}l={v3R( z6k~1mH-)YTg&*x&I-LeYPnNG;&o=&C%v(7*Q$zG3Q0K7@g2T+RzeozaR7u(g~oy%I;zjDI8y*BY%9+#y@>Qi#zOX|Dz0_Q=(bATyBjo z-@K#UpKLdNTF#QKd8DT+c|3P(gYp~uQ!WixW>M*ft8nzF)PG?Coac8(P5xKjD3iQR; zzF;?RP>{$Jt&pCZ9*WC}_E0$QLG%B3BoPBBAEE15F&TP;J$~%>ety58TK@`<+iq{q zYa~feMk!k8mhYJ11fMy;Zv`F$@2?js+rE>kY&$3C;U=Pu1A#n3`h2!0u$u_o(Y6Bb zG46;ETcTwsvfp6D-XLh$2%JZdJ496T;4!zG=<{U&(0L0Tws?J0t=Dv=VC#|I@-i#> zFL(S)$y^btoI$jClQvo>NW%s7jNF2B(4lQnNC*(kXHgbjoj=^yY==$&8o;b3 zgX#p8j@U5#sXwFQ2DMu}n}-o<9=)7rY}0xDnF>E_?A`H}j}r?w?E9zG*YYNkp+)fb z=bMjA_y$gAo8u#U0l<`dsq$r6&-u9Ww+ZZfjj;<)@0}6srFkx@adAq<;$f3MIrejY z&cF+vTkMVE&#yPK-}*_PAFrl=`1IRv84a-S{3(saTO#81S}u-h6VrR)=f7li`(97& z>cog2CYsnphE_gp^d6+IdCGm5R%ww}c;=IvdCzO?lFK~m-EM#TYd6$}__VCgl-ugZ z6Z@1jcMER%y06vECn-0dW`Cpacbg|G^@z>>mKN>&re`Uio@Rf~Pu&k}RZ8lb{Vgp% z(BAIS?621Eq^NaW0(>GjT@dFgUF;Ss0oZU3)npbcZoRKjunKQB?0XRk`uJp8ym>zL zwNEhwglJj-XPhLu0mPBuM=Nve3Vi(3B0_~X*!y!dVVi8$G$iDi(gm9Z(oSFUAi)51o-nTaxvnXR+Ul0b;Hw!2}EK|rYoj}w9pw6 zd7!x%af|D=?Tqs@Ec0%XF~kU;GsGosip@$h?LCz$E1J{$fCiU#ZcE;eH zUQiX1YX#U1Xa)z8Rv2GG=#C!NJ7Gn_OsVYiXgpyND-Le+Sf`tLb?|Oo*Ss^e*^8W< z1S!fK@nkn}c|i^PucDf}X0VjQ2yp&WZ8*2p@LRIuVw3qia8#QV=TkF+FQmq@OG0)5 z(XF=b46_7`5uN!63B_0VCeMHyRohE$SL1wUIrO_smHiSrQbd1F zlB`R=UP}1`tRt+H>6>m*3mbZJ3F7as7agR5(l)14CYcE%F*Mp{{QNeutLWVbb9ncj|JgEtq|7+|> z#@F4v8S8aYu|x~EsqjEmAP)1|(%$IjW5;aZLmb5XT0-AL!An6(*frW7FRpVlW#7>A@M zu!)!_PKni(m<*BFLN<4$7XmS}LjaiiMX)t1jj!uMglfZ{cRYVfc;Wmnlu{}&B2723 zoFOq@OoM-p9`3X=+J4~Kj&wR*`yy$5 z%au2qrw{&FM4Lw35wPZ+!XwCK*>>pgkQtU1>$HeQ%5&t%(%MCeT`b{CgS}BpntS>5 z+v6?P_M^ws4OiGsQ=FYnpiHDsF+k89Jp~Br?8HOa+&-Spgom2|y>4$Q6w(f=!X6n{ zN?C{_x9=b7Z=d}5 z^3x$RaM9u2ytO#zp=0^0qjeWjqtc2C!!J`Ga#izBxU)}^aOL#GZM#l@c>UU3m~<#R zWNI(2>e*E*?e#)j3<|4@OIE72s9^FKuCD4Eir&-3LWP3CWtNB>*|58DM1tjU1}#0J zkfF9Q>d3p6P!nR9fHr=>56|-w8rqKa5koCCjmQ9WOo`wTT&K>0K3nhr zb||Rurb*aAn2B&BHNY!Pm=W>;)b=96s2v^HJ9CBUjgnn|T)q403hY`PjR;4xONlr& zFJF0jo-^#OLV02!L4E4yfu3;LMPGvI^HYbcJjh-PlDa=W{vC2{o>ngmzTAo~MsdZv zmP!}`?}wUz(<&KCQQL3X22+n>JY6RhgK0Sj-UvOwBTj^&v>|HuN!MzvJ*w*ZILQfA z`ryb3q*LB*W3WAR54@AMA0-C0fs8!kS`oo*_r}AmPvc+T@9{IQuBxAB*C=w1JSN*q zcBpc<(%(ZTa-i9Bj@kwMb+@|9&W_0Q$}xx^MUK=S&TmsC4U|&DU&?GC_I7L4J z)scH#QF!zI8c6DPIz8RiHVK6Z>(x*F&a0CnBWzA&%ZO)6k+lBe0p<;-7v4T@7QFDW zmZ`VRFvF6?E^{*NM%=g$l~W2fQxr!(EcUV{LUg80Hnm zQY^s>z{9J5DHOgzR3?aDf z@MSf7WYNdQzg9OT-P`S87Vr%uXfA`AM$~?wqrzQl)AsRpmjs`Q+O6ht?m)%cL@$`+^b(0iID|6< z`d@zP&pOR-zs?mok#7ZdedU-Zhv!Gi$RpqLGqyFqgHiT=TNf&C$2r4ZD!eP@`KP0% z!al0}ma$(=RH4OCe$U57Dx5RQZ}}fY*mV4Hqi??Z{{a7f B3g!R+ diff --git a/doc/source/images/mvp0_demo_preparation_plan.png b/doc/source/images/mvp0_demo_preparation_plan.png deleted file mode 100644 index 94aa3bfd44159a232d3e3913ab0a43fe824345db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35697 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 S7yZF}mU=G#EMH8|>;C}fJoG96 diff --git a/doc/source/images/openstack_cloud_lifecycle.png b/doc/source/images/openstack_cloud_lifecycle.png deleted file mode 100644 index 33494ca69636416bd7f01d767c57d8f092d8001d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13455 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 diff --git a/doc/source/images/openstack_integration_tripleo_arch.png b/doc/source/images/openstack_integration_tripleo_arch.png deleted file mode 100644 index a7b7b79979cba7b61769a0189c17c57b0ace2a05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51253 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 Y7RuYXo{%rGNdSKoK7D{{R30 diff --git a/doc/source/images/openstack_integration_tripleo_seq.png b/doc/source/images/openstack_integration_tripleo_seq.png deleted file mode 100644 index 4b4f2a5c7b06f8f5445281504bdfa60dd28c7926..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22691 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 ImiDv%2kT+1Bme*a diff --git a/doc/source/images/packages_Rubick.png b/doc/source/images/packages_Rubick.png deleted file mode 100644 index 5b520f73ca4ac9e9513bd67858239a07d63751ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 219254 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 z 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

B8`oHWUAuMZ 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 sl>4bz+GSJt8GVtEJxu?{}ZaFxrLWP*hDgtopt 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

>wXm_|Y@CR{oB6iqOH4eo@qt##v3m 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 diff --git a/doc/source/images/service_architecture.png b/doc/source/images/service_architecture.png deleted file mode 100644 index 01c5c4f9166a88df3a728ae97a43314d22dfc331..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25440 zcmbrm2T+tv(=H66@`xfTNtUFNv%mt9MPSJ}Nfsn5ARsvh10dj%v*aab$r&XF$qPtU za?UxPS$N*_ec!3S{yJ6Xt*7c`?|bf=e$f6vFp_WqrL zmA!-IJ61bu2iv#CCf2s5#;jJx_I##lq@c%8SJl_{|7nAP;T)f!B4_>a<%2rwMz0v> z0W7iS+4+90t)9Qtk^N&bT-`WGD;=Ven#bX-ms7U_(r?FQ=)761i*>O!S!R?=4-&O{ z7??+m`_Mexx#P?dSBUw>f=gG=drnWC_-AC8Epc~#iPlNx{f6AgS=RX@BD1n8xd5lk z_I<$B{r>m%Z|cP*`!P0eVfHo~X>EEHL2Ethmn>r`{z_h}pOw68qn_q|!KTNTAtN+* z;D{uecrx!gYuz{9+QV0h8OrIjBEJ^Vbe(XYl_jn$=&PPhF7zK8^*OWE7`5_iS=2M;kt9z0ZhNPUw)%$?3i&Swsb z5R*`B_spxj*Q@6yXVdfNoNgxd)4eCZOncWB&xZA;H7yRtEJjY~Ffdd~KGQnlcl%yu6G{%Dwjc`&)PSvwZD}o#b(N>?lW?TXgo*myk6dnVmlQ>u z0I`NHBe%BR*ZFyD&xqsU;X!e{VQM)_y4Ci}wz~^*gIroVI(fA$jErFw`C4T;l}1Py z!sz5=f7KVt$l~D=`GdqMtF{wrN{Rtdduv%*S_Gu0guJ-8 zP!QM_1NvHHzx+(U-jGX0g!ybHkS*Yuu8z(<2j@rJ)>Ar}@(F$vu95;l=s5xnOi;uF z8xAM%yMX~|NdZR1#9=uG zS)D&ia|;W~|6qavWS;7mMQItzSuY)^FoN#Gc*+!m#8j zNt}1m(9p=mK||RjYbbz};z$z?lV6XIKU&vr!<3bk)zzb5NCsx+G}#;A9UP^40}E^Z zuF%ENtdf$F;lN;~!s6nh3N3onNORSyG-M9jYaJb(Lyh{g9T|2rbMqWkNf{X#hA3}X ze^xp)#|<&w(vq%{DL?Rxm61`|AJ+Z5r7uO)IFf|ZdMM{6aq(Q z$Gani`bm5aIlsaKmALl(9)~qTJPL zm&qY7_DA$bdVp&vV1N+fb?yP@6af}3aJGs>%~k@x(^reV z&PXQL!_z?p;kunpCUSm9RDiNuSH|{rclOIexzWE|H|q}JBUnH|)CaN}dxbC8R#t#h z9MShY7N6=Y{Z;32TF!CU9!lj4U0Gje8RU0dd+v!bQ@lQ2(G@np&12kxcA?eE`Zg-n z%vz?xE%p(1o!k&SD1L;^JZ> z^>A9b8#iwJJA)y(kx`nh2P~uE^5T?O&pE}oD+>62(&ulyQ6va^=g#)_5FP8GoXEhy zz$NRQxsGRS#_EQKGtK_^JzmtyG?k)It4P`p>oU5%%jSL zj{aa>@7gV{l^;hZC!NvcLhditUC}m=h!eH7Ep{Ir&etBiQo8=E*i!3hz4}d{wPsff z3`dcfbjQ(5ANmmMC10t2s*>H8;Na-Z@f1-%phhq;v9yc~^|f3)pc-((7$J}99p;SV zo}bef2NmF?W+cbcbKh<;8_YOA^twFsqx7uA_z^};OPi|XC%(LTAA>0UL|p{ws7UIN z==xLtVu$#+ey1h-*#|;Jb4GZ?B@8oJOZ?r&M3sw+%klBCkB`s7{&!Iz{Euv|lSSc6 zUM41)W;zb8!eDZ=caqOnqNJpJsPF1pUD;bJtL9oJbdA|9La^yhOyi9(E z5{IN9`ira!Wk$Ne^V2p-HRHp#H?pes*^D5ZRjFy<#M~r_wW;z%@d= zo|H90nR%mu4E|dT5v=%u`b!^;foJ@04N++_L?{ngHc##8%NO+YS#h7vLqr@Sg25!z zZ985a*CZ&LyKdjz(p}r!)bIZ3+5UvTQv%GH>9|miH=RB`gSa8&SSI~w=#A8qPpXON z@06wc=|M!*4>3crU3SylwM^~KdV~lQ0k3TR{b$-}Xu{z4%{>;zm|M8=x&dm)~xH(pC*~Op& zn_r|eUxdL5w)W2IegU7*)aYX!5ot`Hl*CWWZqV2l#qy2Ia?E+6@~K7v^%7BxRzpif zoxt(jTaH|nOvlxc%Q`-66C;bUTgoaGz!F@$;||xwk*mYqc21kG3ljs~N9Dc|E%k5_ z_{GQTzHPe?)Y>Q4qE5&|pxjzNl}BH8BJ`J5`I;q9g`dSpfhG0f{%!rujyD1&IVW{M zm&)p3ZhK1*%1dLV{*=4K2l9ym18t_CIhc4|R0{Pb=l2)7Re3%9@HQLZ{ogv7kI#O5 zV6&c-W}-iGJy?qd=cI<2C8|%)aZ`^*IWRzrro@O%B~wU00gJPk%h+(S$2b*>*O@;D zA#?&iZEoJ*K|Fd?|7fzgB|jT_KQ$&@X1dyO{f*gjXpbOd4Nv7`tg(tNDf!fk^=4ASjdVUhfyC$M#s*M3vnNBi5VCaPoDF*p1Xz}uLAX8m)+PPR~4uf%TGkUSjvcNIR!FOWk*Pj*oLNe@R zmM-a6>wOz;r6i_(2cneRT*1BRHRiab3$mGUsyT?pRU#SaWrnOo0N`V^rF>_bxg z&q6oq>sQNQ!Qu2&7znE$kk-J)8F`9{v#A}I`qUZyTMK1koZm!Rt?w-t1(8$gRahmS z>lp_4Yl0PoeSKWyw5fHhIILB&a9;1>w$x3G@1)Agc5l8u7R0>52dPTgaSp2sv<`fCvJXf}fhWI^>iC+M}bxNwgpTj}HMqI20++ zPa~8AU>#@|xUPvj_^oAci{O*RqC__}FG&r8kvH{Re<&RVc5!oqVqJ#=bkzBM{; zE2oUNhIVjKuf7w{Yo^oVlvp|yc@=k;-<#3#mo-v)%H zaQ0{6n~`EUJEA&od-)0>icWVU_Rs5H{(0cc@9lBHb3o|tv|Tk-nAK}x?JQ* zzBGf{Cs@Z5w4oI!iOwscj~ed(<0v4nQEE8jiDoYK=SFHl_OE)?F-$$O@ki(L*y~&N z$RlvPT6XGHor`$IMJ6rlwIvH9Soj4((PvSP4pQxeE=cUqZRa6qFU-6y(-W`|2S;l;tzhTKzOVr*V8j9-D zsp&}$Y49ML@c0@R+}Dhb6i|DlW?=Bv=n6{c-J6o2 zH-DbC%t^!#dx#F%WK*9o@sD}bMx52ORQSX887{baIxV5#BRHz+!3T=i`sd}Dy$F>> z@NRU{MfNWb1gv9!*5J12n>^@N@98=jSmwzm@NMIEY*OU z_*r-u?3W1I(D@h+H>dcyom?Wum(J#9#hL^*h^Fsb%s3Rz-M<>prRs4s(Wuqj@~zdD z9I>W*GuYh`kFVTALR?s&2EJc65%~n_Oct8c87uxRsG$T0?GbP;1uCE+LFp#%xz<(R zDNv&2qZdd9^J;yoJQi_m&z%40Z@1r6XWdsIc+T$c@o_iI*FHX!XO_Ct{@UN%JUHI6 z_CF6TbPdvEcl1r5s3l;9t`IE1=c&2Cfulk} z#*MmocXD(j8}riTf3NP(^7u3N_WAfb_Zh;~k2S$}Tn6Zj zCSj=t&!u}CD0X(V58Td%D04{>W7uDRzT-StpB7yI)Mp}Ucv1fG%@U1cNA(t+Uh(v7 z;l=AoI7;ZvJ(F=;!;y>jg13i3F&+n!wEgsLRVt>hNCoXSju`j_FIIwqRG6|edL0R~ zn|T56csO{NKfogz$oSql>g_$vJU@XGB;)AF@e|InGZ?2@n|WgP_t`pjMEx2~0)~vE zSZ2<^6Kt-ufr(b8Wb>hc7rhMn!Jb{7);@Wfb51R0eoi7t3=`YSjXKUiZt+rz#1dC* z(e-q>*vm;@U7!>hq1&HKHZ~7)>V#vm;^1dU75zj%u!-KW@rUCKL&~NUnALML zLt6`?K*er7PtvZ64sWX`on>D(A7fbj`VwsV;@JimpSA;6=8G+90=tDjz7X5y5r1x) zP!Q5&L0x|=ML2nr?tCKF<>Z>!Y$$6y7DX!YcejsP#!+o4#a zBr@0{rtbjd#boXZ{&|`@0n6-tz2%SX6 zqw3@XGNH24?ZJ#+(K+#0?&R6V{6o4aaDtb*mS?~$*XzXH8H6UYH_(GJrXGz?q&>7V z6rk1pDpN9T{rBC~_d`$bBOEC&_m?Wx4n5tE+21GDyaF2l33WUlrO|#ij);h=7gS%3 zUnx+8;w0-yv+Bux;}Gt&+{63u{lH;P-a!K_sUp9|p#1tOKZ|GIFAEaW^`)Y8#&zmX zH-UVoFJ~!P4EZ=bQtIpjY_B_?d|z>N(1CZpW{fciCJDAQ5WVRumD$I<`|~a}{J~1c zqSDg4cN^oJd7IEP`oUTiA49UpD?aZPvjN5tK7Iil2L_`!qwBQg@AL&>*@QW?fN!QF z2niURLUXq8RI)iXHxC)n%^baV{IbVfV*-YozTpw}Bf*Nkp`4?mj2=tMxd@eouuIHG zHv+^vLV__33@#PBl?e&j}WkUv~qdtD%)=7 zpl*t1DASZ0T*~!lwG$x5l3?@1N4AEv9TBRI$j7rUp7Y2jC_vchfUnJm72rpj7T$v) z4>Fa$i@whn4w048xNkB8@mn<1(R!zlbaPYlmgcDXl!MjlkIrO>v0PYh{%coW_824j z1nqj@N%5*D_pRsk%Evs@%^pv=XPsbUzC@mIF=kYHT|Vwmtd4l_6_$WN>mA!`Ha-61 zl%$~op%%P27X~46;4}S(;Mdu#rlw}tAxPsv4qw^&m!Zm8Z6!^~3JKhLY2y&x!^1n% zTyWKO2#b>(gIf!hh!Kb}GWyVoZdOSuOq7^8Fd!hTRzX1_dabv&w~a&om590{P-%9G z@SRjVO?wHT4=o3KBIrPbVI(3eer0HB_)z#hIHzYh?!?I7EvY%hQ2FYliha-X8F$ko%Y4hO2|pb6Yjo)EvCK9J*O8oY ziGf@#IfoNj0XoJRi754l)md_NPCnqSJ^b)To6o7T`7;{y+wd*wsKdKCJy13Kl04Ch zpv!4EV=Z!=(%xC?IMxcjv}L4?*x@t@ccc8LKHbi5<1n5Hj{3Rj@#H9~haB2jW%v+b zdnLn@BX#gVtH}(cg;rL0T`8TVJ6Z{<=PbXak!Na_P3R6H?b=4UTu%@F1`D~?Ndy<{ zuhwvb^!RsCCNfoBjSda|zp#hf$w?Iru&CM*M-9_EiT<9O!v1JIKVf5zh>9Sic>c#< zL+^NSdC(v|U7|o=VXR~^Fq8^go$kb81$8_h{VT3h#%+Xt()mt3=UkAAh5h!-C`g>y zi+@x*>{dJ2ouJ1i0ZoBy3M*VIWD?VWI0|Q&ta_U>6yAy6=fT=yL(z>w5bY{nXH<$UzXi+6Umftgu0N+Wiv%pzSKDd=h+i5D1fU$?TzX=g4}NQjD29j|Oq zNh!BE#ovF`*u}+Tum8Z63j(sGn%A!yH4^yB23d!5H4d?`>uVjD@{|9pj+W@hvA>O< z8p}#)c{iN3X!Xy>U>LbJ5*JdbSL4{%r(?FcIZ-7$l7ofqYCazsOR~55MLz)Gd9e=> zLc6lolMOoJZLVB=&hIJnvmE1Fvq_c!k{IwT)UF89LqN2C-6l`0ByIGq z>;6Xwq9%o$sstLpk{tv?FfXi6j*J{ePE1r57k?eEz+0V62yI#N>;>8fmQD;ANK|Jw z_b42?LiH?amHWE`>Au^mbX!?rk>YY zjNJeJ-J7QCn`_4lK0A}#*D=a;%5QHcR1i9jL6y(( zz&r~WSwrHg(>+dyErx6Lw|@tbj|;&=GM}l$a@(s4pA+N?n(z;0k^CG%6g5jcW3DQC z|CiL*n8fwa7|t#_`5kdsJDl*mxZ1zX7p9i4)S-GD8ol7CrS%d(Qo_eZ_aXVE)I4Sb z?ag7#Tpp9cqBAqY5!x^aNospmmRhl_d{05PN)lUzH^<{fkaMmGmh;-tT8|%mmvz55 z);Ave0!zo>_l3#f)pLZ#*GkF1bBPSsc_!fQd?_9{l~+kc6-criWSO>Dw(&V-NKSwo zn&XJDnmSYJP2500xSZF%vx1G+EodNs42>6%314X9%h*=Q*y-shL}_PuUFxNzBtgcO z{|j_l7A)d-8lc&n%Zk{*C+8PpPEr+E$jkdgK% zS@wM<=qs~H8h?3c;z%{VuR726?>_nj0WuL}wIotm`lCNhm5#*sD3-2iTmWmF=W5{Z zZ`fa)joiNHoLcmJv^`6g(tXQxT|0XgzS-4Bkq;0-tH}v8@N^QSt8d6bb<`;aFho%9 zq>{?gttoeB#V2$!GGeC!Yrl63mGHduYVG^8W>GNfX(9KycJ*uu&%ORtU+H3k7)CQy zA@;O>U?gcY6y)bsDOjYOtu^t+bKxsakKV`pv9LDj=o;5pW-tXk7IP~h|D6EDq4W~g zn>5XW;IO1o%5YefkO;m_Vs-^6O>o!Moo@Wzj!j9B4lD$UBO-E{RrzDS3p!gdx` zyrEmZQ-^?$wZ_ddy>eK`$(B)97*r5zKs`)J%Yr*7# z5LaXXY{^&)$Gfr+m{mc+zJQSiN6=!g_BWcX>B7^!VOJ5(BNJ8WNo&?H%R%FeO z!)b|{8mF^1;R}hw$BE7}PNxU?Oipih{0BauK5&`4Zk6S>vyFy4Rp7FkC;}iO$J6qG z8aB~DlK%|92ZkRW&QdjR4I)pC*S2l6oURw!e4O0c#-jUQ;IG~$_lCqAB_Z9tdO}w{ zq!LpCUuw_)z+g+s#X8R!A(R!Wo{znbp0=({S+0;9eaXyu=oz zvOM@}u(s=&^A`r)mB%}e5PU9M`4hVkgq9StzP_;3YVxdXg!br^4Ye+>B#&&xo>1X) z_%>N1w~ke`tIGAUS8yMWat^CbgR+8+qBV)om*j++8%Fc-vvdgD|MCZfr{?A-8#R-l z^3>0NJ8OA1Dz3i<5%%@!^m&U2dd&W2bE>SRg+W~0Z#d7T!Frm)wGD&IV?vqJwIaJt zw?kzJ95CWYn6mxeA}~#9nOcC^&9(_M5h~Zc^;S2V7|1!Wnq|a>&>X=dzKM{R_Tnn2 zQ60fi8&GKpaaV7AcW`dzrYk`>B8)yNZ1ux&;Su$=K(l;VU0;|g_ef#?bJ21xBA>_~ zl%d4ulBJ1E3-JHL|8fIewL^sEx%E?79iQ~w>MF0lwDI0F94*UNevdSLHKk|Ngmt7b zM)s!dXA+dB@@I00hPx#t?At<66W7WzQ>HXxB`huuLP$tRKrm;m^3jur_Q&B{FNY`n zAu*ChPza*#rq^nz(i-PsvdCnhG=K3dh{_|ENMC|_lI zH1!7c{YSX|{$jLjY`v@>DUXt@t-X$_ylI#!Uhrki1z|ZjrxwO1z*WnW5))bZ!}O07 z#~*S`^2{BNh^l!vi=;kf4{e`YT+9_ddQ=f|pGvf0jBMp*Oc=j?g9KXX&eFPA=PGoy zq_E#ftc5x7C&k&myd_CS4S9s`FKb|slJlv-+G{S0r^&VcaRbwdx7{1*t0l5TbXL(f ztk^1>L*vNCZTQ%^YP+|{2%p%5z$Im=InvY9S8y+Q77v1A>P&y+E(Rra+CXGG$gxMV zIGt3X={!k8)vP(;AZrB$u*;kHmD=w7An}UuuLm#-6{II!DNGvOz{4X`x9dgVEyi?^ zL!Y1Pb;qBR+;?C_tmxTD>)<~)-Xxi3KFh527!6+<)dn8(uP|0N`LQhYI3j zu5@NufRX}f^y+6(hh}G4+p*k%PDEnc0&C_!$x2z6X&km^32Gp{W1}@0b;$j;`DhPmRNET1hT`{(&ig#LaT_Uc~K-s`L** zC$~V>X0vu`xH(dlIoa;`j-`8Tw z&5`=>P_8)NM{LK~H#*^(G6Oft*z)r>)c+mNKN zY?Fo;AXET4S>HB&88qQZ#U}URaj=xYI(niKFI}q9inX?pNYbArsK->}b*KlXsT{d* z^*Onp8;w)i8?fjL07c{HTLZ44tS0m_l2i}?t^c+Oxf?1Kx(-X!EpE{(;P*eVQ{OB? z{u9WT{)iDWPfG*#i98CRap|cMe+0W&FG{-fNaDd<-Td>Re`f_U$-dQ)`GFl-`6Kx> z8plj*_3w(8Q47G}00Oo4ET?69q19QIukMW?-D9xAJ&k2wO91c^s$LRz*%*GJYg7}u zf|s!)rf_<4iKYW(VTvW2sVuY|>@l==s;`Uqa&0p*(JR|M-VG1-?mH!-^^QJ50+N|}yFbdcdTmae z679Uq??!y4Z+-iShXD-`x`sGgZcv^apLF?}ld}#$_cpw^WelonG?qs+ zS3BL)?nu=zUL=EyU4s1iByz8_TEmtOpsWL5c(0U^UbP1x@9FZ4!$mG$RJ>mSre;a; zz-kXv6bOE0yOV#b(HTRPlRLZs?wQ-`%=ZAM(1Qc^B&8F`6?Xdq;OLfWclk@;;g(4m z*%M0)em^?^C4@dkpIC;BTRX0ln?zEWhxw_?T21-M25=PuSE`qV*~5bS6&Ul0li<_~ z2R+75+{c~3Ia}^TVj?~^*|N;OD?L5hBMHoR$v(N5bbHEro_`tramU)XPWTO4^%TjU z^-&EHOYir^VZ}8c?1l1WM_x*WlnW?aiO$>t@XfRglQOS+z*$*zM{!+0&-=iI4dwk? z(`rujED4-3bZBG7QExQIij$n@0drJ8;sefXdc+CB(}hOw)LU?Xg_02DE!85-fuVvo3 zJ1w$D*_Eok3YOJx@7@8{{c*j@X2l(Vaj59UA?LxP)qd-Famt)+EY>P#F7#esiNN@3 ztOeMvn%TLmxBOK5RttG6hscfNE-~w6$J~;PD>d=7V>KC2E2TFNVGioP7isxW!ynCr*Is z(U#ClBu4AK*D5Eu*`meAAs6Va{oj1TkN9Ap*1$qTFZ!zt?x<4;;sLjFi+{mtdmZ#B zUWK>^$T5=y>q4w<#?N`4U;3{0IE@P}Z5x>c1x9MU@N3E!7Z-KHvV)4h+cE_fcFf)~l z)97O4JXua!acXI^!Jtv>Bn6vZm2-Ac5vW&1^q~!A%loaJFrhH5vjY2^V!l))pIKu~ zSK5!c`T3`4QVAx-SKCL!Mn&!0C*O5pWI2|TU12G~UnQlbJ3BiE;80L?i$Rx>-BEsV9O-VBW6jAYv>b0WXLBmbz#@;OaVR?nn~us=HrLM0JP^%EeIdP zOPw1JH)+kGHWL=b?ti{{jn}%^DJm+;%6?Uq+}+*vr$)C-Lwj{1d_Or(B_uz;;8H4O zDclFHnjMmnks)1^D2Y~b`GB35eGj5N#d+PB9G22Qzp;T!=BE7o`7^cO+uIw+XEtI1 zg*-!hpBHT4z$f4Zdt*G2(hxyDxz4-&0j3{M`smTj=BD-X4i;K@J>CPwdX3LEdl?cS ziceRcqAD(04uE)|G7WzL$oxgdD_vgeyMx#H?*c)EhO;-`VYjhFg^pj5Nh1LX)SDvQ zm)rF@pVSwbhNGvKG+cu!yTm5HwhAlT)sPf$>X@2U?7Zh!U4d|27CG@*x&!*Tj>_gJq@E*Q=NYI zBCtUfAx0|wBZHg+1K~_33Z)vl@IgQHjtdhd$2(3yn-4c)jFjt7NAcNRclzZeCgMhn z!>f^;^s)1?6#zp(ZV7yWfrr2xfWl;j|5;oF7*mDo{z}KHhQ3F7E=KJ9#s+H%VD?nI z?3zrLIj)b*FE490czVR{1Hzq`)8^DrK^cHlr|R6g@&Ii`K9*yCWhl2Z&${7Uy=M~u zzJQK?uslfj;>BxCJ>p|(etx&c&vyWg{oPpUa;43zy)`T>LFjlcym%fE<1K#|rKIKz z3=E7_ST}&d0{Fu5(ER2a&$I0|6%`e%8#k)Km>_XB1w7Q#&4xlKq%lM8+gw*Cv%f!c zMvXpI|DT)a{Qc)>m0jkyZ{OlA0keLG5#X*$TDJsFmXO$Z6wIuw^0Kl7cI$wk8|$#t zm!ena+OY~IE*8|}ho@ib{M|7h5b4`9jPh%1YXOP%^yrAbL@c2ziUly-PXLuPh>VxR z^US%fAe4oUni|k}PFoSAC8oWJ>~DQ{T1_e=rr3CN8I`Tll}`cc^lfabEBS;0 ztPRHtq?(6?Ugs9O3*A7NJP&@?y(MYnLt^5QDm&9jIQ-B;022QeXb0a5tlRenx&#d#Yk7bh0LtA0UKh0~t!0ubu|&bqZcOU=P)O>eZGRs{`8NE05b$9u ze@fx~uLM#(ma40mXa?E7%|lwg1or^)*MQ<}jFz;0fyud8P(wHjB#~+Xw}Dcxcq2~0O@qnuoKRRD^j)Nx zrU_tunZQ-M4yV1Q^E5e)$68wEf$olJ0%|fVE30}&cvx6zZlGRMW8=MbrMMx$>YWCp zBnPNDH3SCP|F>H>s1B3>-na6%K|Nk}TYm;_ZuM9~N=h~dQ7^Aca4BP|)TO)3vVXXLv^f9p1Or{)24Nv6?$O={w|9O~k9oKQ(!~t; z=!fj1T2o#5U)0wxK%i*#`i2d1GO7f8MDW!U9!vqK>!Ibq`{%Uw4Eq-vt3};0yFL@U3#OK`6ii!mM@xIb4q{ ze6uw}F7|)+;4=*e<>+f^Kq=K6g#B0IAHUZI1aNQjhx6QVndrfuCxJi&)KTfK7U1*v z3UI=zfu#()F26W{=icQ7+>(RNH`h~uh(*%wMECn!2!KLhC*6Whsy z>mTSWyc|%tF&6B=s1zml&|6xpahvj6P5l2@j(E4^t|{{H zy5D~{VJpTM^gT2Kq}Tl-doAC879gDRBtf&(|EjBS5NDEknG*hwk9EGvfXvh!rlHntl(y zHxZB?jsIyVWXJI|cTUoN5YVSVR0U#bS)^gW>0xl_y>yv7KY@Cq1C62oR%BL=0jw&V zyLWlL&^8F`)K%%!+kW|Alqo8Jp>$bZ1ZO2Ls~;eRsi~=H&oeVKWn6lCdl&5iff41B zo79RQsZs}-Jh^BS5fOR#@S$=d$cYG*<>}D&q=ED;U|<+g?#t3c+&*GGI6Nc{mrhXC zI)os62hm~2#l4};yU-kv=j=v<8!x(PKx=@^-msq}ko_(%P)hvz4kQZdehGc6@; zLF9%;9{{`y{!<5}=vvR?dB5r%oO?PGH5Gm+gYj}pUgOTJvoo=IJC=E}#l=Gd!0l|$ zn3&}6G{IfAo^8FQoRnYryUOk%KJ7ir(c)Ou*fs>I?Y#7>s!0Z!72SJRgGCK2%?8(G zrX7*Sky2dz(eF7rV!L}cd|oZXX%p(%2RiMN+sAh=*H*bovmO?l@w*K5+Uu0!<*ql0ds{7ps?m&Wt zE&}zr`h&ee!OOG7@0kjIlU3oYTt8!ChQ{tI{QcX-=U^TkvK4voF?a(UYi6poqv#YjYUSe<%?r*Gre>XbLW1V4Q^v(^`?8bWkr5T^%eM)J$Qr$NX5z^HT zOqQT>CLq99Q$6ek*x)q= zTN)0$6vwPHLJ3r2rS14xSdujgH8Y#{QED=2+~QtRKQQ#P%=4EKvBJoXvpW1VGjHs3lx_-#2s0(!|D zgXZs}=gBorh33=s4yvdeU?0WNpgcRGP0A&-lf4miHM3+Q#C_5Odso-wgLMVrmg*WO zRS;Ei11k7IUrP5(AE1i6w$NDzQ{rXYKkmCYck}V})G|X(0l|D7!L1Ci7~1BgR~}$E zlv>hFvxg?OuWm$7=-!><=8&T~OK`_P+7A*`cyT@ z@fG15$Go4O=M(xE=n>Zx3C&XZR;(fLKJD%`JSL3}*+@@1^Qy0?Ws@ve;*j`TdXE?_XjN4Q?8XH1$BD?3OL!1*HE zX+@yV8J~ z#t6o2vufiis{j3*kci0k-_L8Ga4|pp3`2GtFHC%3*nL(LBuL`)ybacT--X3v{Qxrk zZunqni@RyC;kQX^^&=AhU@<8}H7%`9Ui1nqWr8{x0NWcV&W9&w#<>N)0xZ+~49W6+ z9^i9;r?%ir6EcF-q5lnO8sbMPt=?C?vfQD|hj;9_K1{x<{TZkro3q#RrJb|pJDYXM z1nMP7&_^~;CbYe_bPA9f>JtYt{KiDX^ap#q93Fo`betn7xvd4pR-Zz~?ERjYkADhQ z;v+k2YdRqJdQMqqp5Sp+4pZiBT4kraMbGo+lL0uwmehl5JwlgkJ?QqQJbnH8t5T)x zm1s-fn?{h+k3=MWy7Yov01V5+B|J{8eud~A;eu#CcsnM7_p}6H@}vC*UF^i3$nQgi zK`~I{)Itw&^l4l44*)nH=KE>GWAFmQ{s^wx8fM_GZeI0ZD$#ifD5hyr!ShxZB2ptg=^0wEEY4>`3fZ60*uO6E#aB%k zR3AII&J2KkHLe8=ux@WeJpcKM00kjTU+w5rQUH+&*N#Pxu*?cvw5t>4~mADTWw*bv0nK_+*rWYtee{qo8CO#pz>Cc#4nLt`)Z0~{!UHrY$MwjM6Ryf` z_V4azc_0POsK9a|xu53?%)!+F#(p~-1dry^TxIkX{ZVc=*&$p$Ymq;%gs%~kwnkT8 z+>a!>FN_V&pGsV*$^D?6tzb}l<0cX5ImyyT21p?%+s4hGGop3b9HH|ttCR9VsYI*_ zp}szt%2L`)->S>T zCAr7rKSq2+bOZ_+W#V0CiJ+d_mblR3S_=_?X%>+vAF3vPc4wK*3-_A=b!kxDC~c!^ zco0i~hO5CwVu2k1mlUM762*fzymHLuOgJC-0s1J;@Iq_$ZvV#Y`uSfz0HcrG*qTBPlrEg#_I9$D;2&P;u@43{Ll;V0_f}m_W zVg*SuSWq7bY?hL|-}S|19Er%eXwVhM)$$Wckkf?4e>62<_28c~6ewlvN=bdaLHKZD|fIP+blH{l^Bvev(Cie{zM$@)-f`vsRm0{)f$J zVA5dMeHg<_TqQu+j(B$9AD`vl{UJy-%Lq_fZUieJI}bSXz%}yqHVK=D0G~p>&-w%? z?@v{+1i)#R`NokXEZY5J<4R5G+($zCK@MrlAe69rXXvMVTW4;LRB*ShJfPw9HGw*B z&+%3;gc|Iw-zG(x{nQUIg6Ai&#%5jPEuUD1zUl@8)5NFs>_fYazxo7T-$=&?C32K{ zcBzd5hnEt>Sb_F7HYieDY=fHxpHpG)y}$3|m@AvLJ#W1MaabXOM~uVyU1^I>K%F}Z z_<>z_eb7@vG$>URN;I^9NyLNPIF&H-r1MaE;|nZdBJF;z61z|QU|PWPsa%bdgY!jS z=Ao5exI)k`x z4lh1oxHNtn@8;P1_lQL8?|Zg}&!u>Dzf9n@3Hz}z!p`g-I9tZ1CY+xSR!10{Aysc>U7&s2oU`bU;(JZ~le@pw=uu zfb8jqnlC;2yo1M=-eXJi{D;%`hK2@$SJ^$1O^V3=*L!h~NOCS@1wdU-N_GVf;ZiM# zDEX{xTJ`8LhgWvQ4~PJwT@kyz8MvPwa4>=ph+4)tbvUgvoFLB*&nJEJrp-s#`OdV? z$3EIIZ^s-Z4%8G^P7JhovK?F;8Lskc9PrqzY!=Hd;Y5U`+)q~e3ks{it4&*vzU_CT z&$FZZBI@K^t;GCy@QSs)7pw_b+Y!r@ZzX6#?m18+aKPzN!++k9D(pF2h2I>Cz7stx zd7yTqL$R&BxpuNcy)O$$A%diaN*5c3H&!1izFv}l0F}<>r?nA98l`fc{j^Ns7wLn) zS5xR-i7zA)9O<5NPG?fzEgC}hhlMo-68CQOBP{@DPOB8oXY%#%;@mT`Cue)mTefsa zkbtNfA6>Pe8(2bR_crVeY;l@4ipNE>QT}uPqPc6eL)tV&$#410B0=RLLR}6S8p;G1 zb@~8I7%3npVs%I6F^e9b{cqxRp4njQHS=0TQz<&&n=ZH@3i!K~Ah$cSIgB9aSh!rB zs#9t5-A{7KICPp`=dK?NARTeLCp`vIqC9PY9@MzCfkeU#ueG@ego%+Bsvlj>U6s{L zV+)ix0P4`66PYwOCs*g{5IypZN5#(85tnkxt3Q<|Qgi1R&`qbRBh?kR_SZ()x?|W2 z1|T1Pg@rjDto4Az$LoA`4`cxlfy)2Y#+e5~^}T<5N}IBzO(sh#B7~8TEro`Jj2KIn z(ulD}$WBRwL87c#CX8h$k!4Kk7cnGDmJrI8U3?JPe$S&=bn4c z^SqvS_}utVW4&(aN2deQ&MW{8%ii)iD(*Ow_Sf@p;Iah`=3^F-&KUb3uFo3F$PsJT~sF^9W*;-4F-e@?i zMY1*iu^&K(jzS$d8zApJkdj?EFO_2lYJrbjs^o-#qG^*%Auua9M;X4m$RyD?fvni~ zwqVnm!C0&ssZDdWTQKI2GW^4H>vR*iE@6Jwip65P@xPv;DeR*iT_}yN9%yGJPAk?) zN=h1W%U#fVj&kTHN4cV+>Lg_Q0_O?g}8kam;647<+LE8(j{_~9HOVw8sN%{(bgmhA6f zW_{a#1T%N&85@s`yxdnOcpK|#WZ!o$?2Vdd19WRaOjq=o=i&2|CPS%Tz3S^-43K95 z^_0Vk8rmN*Cb%|J&eohD?uE_qTwQ!77gr~*XHJM~bgqe9#k<^+Ta%RbV-3|>wRWEy z#K+qI4oJz~&CmNXrLx&iKmv9sz2vLV@{0+s9UxaV;L&2WLRBJ zNvKl3Cx1+FY;6~37dZa@eKJJt8=H(W7UXK3$-7^E+6ngSH!#U_S!Pp>d30G7_T{7V?e0rl~ z)eo-O_tcq>Dz8=JI7GW?08bHhcfDFX#4l!FG9eB{2%Wn>1p#s#mAb%BA&1lUp;+Ww6e&$g@qIuE#wun ztqhV=7||6-Kzp{5%T2jg91A;6iXaFYd^l$C*-j4(v-D<0#uVD#L(^U$~Q z?)?EfJR!uLje9;H!d6P#j)53eL{tIpIwM zXn%Iqr*cAa_#bNaWJRLlsAA>+t+1BKOtVpuw+87nc;&uD0{GIaLcYR1a2m1l7$%B z0u1%i9y0C#hVO*Q91L`d<;5RZ5?X%F;ITz*ck7~;K$Yn2^?Wc!?HZIx{Z~xb7%JJs z=7zl)BLV|Ch+Uh~Qi_k@&dFnmwUQzk$->$j8BaWTa;bho@1s0+lV`T0i+o$>MISA< z5<0m3u-R>tB0RfPq`!;I(cM(z@C%xnq~PG~+qX{_v4Fc19Dd}+WE`!mLWS8m=7I(x zHJ}zAKg0Yq{eS#NY0;{nQ?9pY35S4 zLAR&d8om_sWYpKIl3m-EpX{nWGG49Hr*;hYQmpVC@fIJ2NQhs%U)r;0J7IXJALJVG zL+_=XSHNL18m*kH|5XHd-_Ma-nkWO%o`T*q`)F^TXDza$?ZkVL_dodg+e8rx`}ZRa z1FbY`maO(~9H~^sc$ew6+)jtipjaVAEjqEbH19-5Z3V9+@~X{IaoH|Ziuftp?YSQv z7RmJv4y#onbN5?3Vn3-u@eo;yv2M)WD|POBwc)DuWtaV2y|kmvY|o9vcGIf0@y^|p~ZNLZ1M!c?qUY&m`t zy5mZNzkb_>tJHgmp9&SLx}QOLvzC-)^MPC?t7dylmXE7~git}ZU!q8o=Z(UGR=zm} znQ>TZB_tvaySR#h3bJ|q_v`h85HWbaZ_0Y zNRbdhN9&6d)w+BH6leN2A>v^LyPno?wK@m&YE!WR4*HWpw$jt444w}-#3@K}yxz!9 zRd$gQ0#?MU=ql$oL1c&duGn#;Y~r#B37@b7sRLd~26Vz80mN~j_kK%&dEZDjH8uU4 z2i-X2g?c7jaREf`0#z|aJ5Xag>rG~W&!^FFD~i#pj`m<9qx%5%Y3E}8v)9C;$SxUIbT`k0#P zH>glIJ4aHJ!yZ(^PN@I7rWs-YLm}n}a7q6D^(PV0B7|C_{*etyT)*H?Hn{SCWkWos zNK^e=8Q{75kJA2UHn{S?vaKm3f=dl$r5ghTjS{l3aaH&kjh3X(Yu5ngm;yyHZ>yoXUJ`A9Dm+U;dF#7&>wU#2G>63WL`4@j1;8!%<5U zqPxYfEgei!=gE2+G*{1i2S}geKcXyV$*r=%7Etmj#N6LCGFp8yC?tbMf zjU(UhGkrL~)U(t%SQqbq=Z?9#`BSC1q@;^SL1^z`T^s zrsC3+;^N|j#yt)*`(YEKAf)vcX8)evraVDQhcq^N)Xo!ZtVAgcfHD~L&Ye5KNk0x| ze`Tb=znuX8eQ>R&!tfo>PiWY#C%gHqW-3b#9XbR$fWXo)v$86HPMDS!+tp2H$RBE{ zpKBo^G;~#2h)pwL{+`ZW*7jXM`ZR!1G{lhzm?MyBm95LO*JyL{%hUcF)X^*~3;jDB z1xX$-UR!$QV+L-osHwqnq08@kg{oJ9Qd@J3Nc4Bp` z+>3*!l2%zgZaIE$wKKXMEW0pGcN)GsLr2&fvzLSHn=e;1ZG+TQ&oIFh9KOUj0I`F{gT%;U@9WH?L+{oj4L3uDMp`ZYJXu_nW3L+%*@O@ zH9f6F29ZTgP!qZbAdSZ{N{ClvVxj^lgM#)Rz){Yhiycdg1Q5+hhCot|S-B4=HiFQf zHjYdr5&=Fjqq&M$?nj|rFt7-Lv2U*Kk`LN|PXsu^$Jpxgc8pLSMefxsB zqK8+O7bibGe;W}1g)h(dg(oTcKDoIAMUp)MCjev$(LL$;V?reQBLGsPEko>zODBDn z=HUqh>y}DgMy*%(6}yhdnUX%hg|GcKz?MA00B&lyZTt40;j8oPboA`p+}!N!Kj9r1 zw?s8Wkrnu{t{0Z<0{h@O_vM1(ad9!C+~+Q=xiV1u zxCiPA9T=`K7lSA342(6T`0L8BnwZPp9Mk~M^YYTtUvyLhg~02}$P zF8??eRg?4m`*%^3(q`&qeU9GW>`VtRQJ@oOT*MGtqi1qHB+5B_E`HwYyAe%#*VX0C zh&+~X6~-fz`i<<1zw$-v8Eu{@8tAd&+ z<5DzynS)yEE0=tBHG9wD;J{o{(>+{dznyZ>Rpf-Ao65o;|@um_)24?ZR3D1(zVZj&BkZ=4OtiT z8p8)on|WYO;rAcV@7m%3UL7DDkYxh=`jZI428eS7rA2P6sHj-TQU#lnzr5S`g8~>o zNo(C2Uy+t0XuZ|5q6W|WcB5arOMy-!{k1EIF$x|&+>2m~tUULvoNouOzn>p+aZ-Y3 z!rnAIpe&W+W-E3gA8on+lJ}Jj+Q;yiwBfLsV20?3{7e=?jDL&DagEhY=&g1`diwlDxZ)yXV5Rh5I6{XF0d` z5h#=jypVMnAp~Q^Ov{G8e!UIZr)rXHyBJ{Shv65j$+8YlpLm9W@*f@HmHJT%PVDj+sN>h$=Fib&umDeIFe z$ed==z;7GR=QDqGTp(Qz$TdF&VzaC+11SSuOzyQM8NL=d)TK6p`riGGKy_Lsa)j00 zK-PkKHoC*F37T1J&jy;3g@ei}>jzn_6cc$A(?7;4qN@z++;y_{&r0uKCtxJOpoR>; zR+0bf{0%G8qrH28k}Gi9MKbcuhy<4_85Y?_Z_#>B2ah6Jkce8cNGc+PWva#E`o-CP z0qpK@ih|>)1NBGlzrfgvUAqrnpX^xMmXV%*-NNGjzIB8N-Y7IRA6vVIFufK-5GE@G zVG35Z#yG#pr%(hN%|YriMqE*m4=M=5w>ip2JxpIl4^uk391g3V!{A#D)e(pWkQ|=( zI;izY9UIUIC0k?GZKpB1BS53KSz(|_NpYDtH{=_0r10N0k2z9nechAQY)cKV ztx9_xQDMek+2(z0n!vl2MW4SarhMhI%h}CVs;D=cv=To3m>mr%_c|-FJ)&`_#>#%8 zBR#z|Az>`SQd6Uh8=W6tw^>SxRxNl2t5$*}?jYZP)6+bFoBRmy8PTb73x!S72vY@=2*!NCq z`rBhMrnhg|Yip&YG2G2;3^#{KsgjwM?_Y;glxaUE^OoXAcutpP6wZc@8JD?f%&kT= zR;cVo${-LhN5`!U+xav8*1FP_pRbcqUR@Qw44>W?cn7DZlB>#(>VK%u^_1Uwn$FKq zYcOqR?5?=@i|%yqBt^x?V!}ef1Tw!Oq4jTXlmZ1$NBRqISSXV zan^=K=^o%i=YRW_CyC}vOQXKJ@s+X~wUzxtdWOIOmK}FYWdsCh8Q;_!%#I%E*s8{W zEva;ejh*&q1;*A!?BniSr8`f$`$?ln1$!J=cJt29ijK3f)M+gmTWx zH-*73=hIvRBK*kZGS{P2J08GQAB4$=I5WJKok* z1p3$kq|_BIRgE~KLHB;xbLN48#M3C6~0Xr~{4IO`^lRM6wPuK8DI*)(*%0WI%$ng{(? z8s4&LhhaKnvqN4g!CK;MY`TW4msbK*RkuD=9Z$H;@9jwIdK(;>$=GBOCt;XWuL?EJ zvc#T+|J1Qai!lVD>VjM_O4k2!A)|in7|s#)oOx|ecqGqOKH|z$#(2Xdr&8P?*>L3|)X8pKY@Xs-dum`I3`*?u^g=Cl5 f{_Fggo~2D19`9GS@N!$C;NSUkS}M6pSMK~jQa!2> diff --git a/doc/source/images/src/classes_Rubick.dot b/doc/source/images/src/classes_Rubick.dot deleted file mode 100644 index a03badd..0000000 --- a/doc/source/images/src/classes_Rubick.dot +++ /dev/null @@ -1,132 +0,0 @@ -digraph "classes_Rubick" { -charset="utf-8" -rankdir=BT -"4" [shape="record", label="{KeystoneEndpointsInspection|name : str\ldescription\l|inspect()\l}"]; -"6" [shape="record", label="{SimpleNodeDiscovery|logger : NoneType, RootLogger\l|test_connection()\ldiscover()\l}"]; -"7" [shape="record", label="{SshShell|\l|}"]; -"8" [shape="record", label="{NodeClient|use_sudo\lshell\llogger : NoneType, RootLogger\l|open()\lrun()\l}"]; -"9" [shape="record", label="{JokerNodeDiscovery|logger : NoneType, RootLogger\l|test_connection()\ldiscover()\l}"]; -"10" [shape="record", label="{OpenstackDiscovery|logger : NoneType, RootLogger\lnode_discovery_klass\l|discover()\ltest_connection()\l}"]; -"12" [shape="record", label="{KeystoneAuthtokenSettingsInspection|name : str\ldescription : str\l|inspect()\l}"]; -"14" [shape="record", label="{LettuceRunnerInspection|base_path\l|rules()\linspect()\l}"]; -"16" [shape="record", label="{Configuration|\l|set()\lget()\lkeys()\lsection()\lcontains()\lis_default()\litems()\lset_default()\l}"]; -"17" [shape="record", label="{ConfigSection|name\lparameters\l|}"]; -"18" [shape="record", label="{TextElement|text\l|}"]; -"19" [shape="record", label="{Element|end_mark\lstart_mark\l|}"]; -"20" [shape="record", label="{ComponentConfig|errors : list\lsections : list\lname\l|}"]; -"21" [shape="record", label="{ConfigurationWrapper|state\lconfig\l|}"]; -"22" [shape="record", label="{ConfigParameterName|\l|}"]; -"23" [shape="record", label="{ConfigParameterValue|quotechar : NoneType\lvalue : NoneType\l|}"]; -"24" [shape="record", label="{ConfigSectionName|\l|}"]; -"25" [shape="record", label="{ConfigurationSection|section\lconfig\l|set()\lget()\lkeys()\lcontains()\lis_default()\litems()\lset_default()\l}"]; -"26" [shape="record", label="{ConfigParameter|delimiter\lname\lvalue\l|}"]; -"29" [shape="record", label="{InspectionRequest|username\lnodes\lpassword : NoneType\lprivate_key : NoneType\l|}"]; -"30" [shape="record", label="{InspectionResult|request\lvalue\l|}"]; -"38" [shape="record", label="{SchemaWriter|project\lversion\lfile\l|comment()\lparam()\lsection()\l}"]; -"43" [shape="record", label="{Cluster|data : dict\l|as_doc()\lfor_json()\lfrom_doc()\l}"]; -"44" [shape="record", label="{RuleGroup|all : list\lHA : str\lVALIDITY : str\lBEST_PRACTICES : str\l|}"]; -"47" [fontcolor="red", shape="record", label="{RubickException|\l|}"]; -"48" [fontcolor="red", shape="record", label="{SchemaException|\l|}"]; -"49" [fontcolor="red", shape="record", label="{ValidatorException|\l|}"]; -"55" [shape="record", label="{MarkTests|\l|test_merge()\ltest_creation()\l}"]; -"57" [shape="record", label="{StringDictTypeValidatorTests|type_name : str\l|test_single_value()\ltest_empty_value()\ltest_list_of_values()\l}"]; -"58" [shape="record", label="{StringTypeValidatorTests|type_name : str\l|test_validation_always_passes()\ltest_empty_string_passes()\ltest_should_return_same_string_if_valid()\l}"]; -"59" [shape="record", label="{TypeValidatorTestHelper|validator\l|setUp()\lassertInvalid()\lassertValid()\l}"]; -"60" [shape="record", label="{IntegerTypeValidatorTests|type_name : str\l|test_negative_values_are_valid()\ltest_positive_values_are_valid()\ltest_invalid_char_error_contains_proper_column_in_mark()\ltest_invalid_char_error_contains_proper_column_if_leading_whitespaces()\ltest_trailing_whitespace_is_ignored()\ltest_non_digits_are_invalid()\ltest_returns_integer_if_valid()\ltest_zero_is_valid()\ltest_leading_whitespace_is_ignored()\l}"]; -"61" [shape="record", label="{NetworkAddressTypeValidatorTests|type_name : str\l|test_no_prefix_length()\ltest_non_integer_prefix_length()\ltest_prefix_greater_than_32()\ltest_ipv4_network()\ltest_value_with_less_than_4_numbers_separated_by_dots()\ltest_returns_address()\ltest_ipv4_like_string_with_numbers_greater_than_255()\l}"]; -"62" [shape="record", label="{PortTypeValidatorTests|type_name : str\l|test_leading_and_or_trailing_whitespace_is_ignored()\ltest_high_boundary_is_valid()\ltest_returns_integer_if_valid()\ltest_zero_invalid()\ltest_negatives_are_invalid()\ltest_non_digits_are_invalid()\ltest_empty()\ltest_low_boundary_is_valid()\ltest_values_greater_than_65535_are_invalid()\ltest_positive_integer()\l}"]; -"63" [shape="record", label="{BooleanTypeValidatorTests|type_name : str\l|test_True()\ltest_other_values_produce_error()\ltest_False()\l}"]; -"64" [shape="record", label="{HostAndPortTypeValidatorTests|type_name : str\l|test_no_port()\ltest_port_is_not_an_integer()\ltest_port_is_greater_than_65535()\ltest_value_with_less_than_4_numbers_separated_by_dots()\ltest_returns_address()\ltest_ipv4_like_string_with_numbers_greater_than_255()\ltest_ipv4_address()\l}"]; -"65" [shape="record", label="{HostAddressTypeValidatorTests|type_name : str\l|test_value_with_less_than_4_numbers_separated_by_dots()\ltest_host_with_empty_parts()\ltest_mark_should_point_to_incorrect_symbol()\ltest_host_parts_with_invalid_chars()\ltest_host_with_single_host_label()\ltest_host_name()\ltest_returns_address()\ltest_ipv4_like_string_with_numbers_greater_than_255()\ltest_host_that_ends_with_a_hyphen()\ltest_ipv4_address()\ltest_host_part_starting_with_non_letter()\l}"]; -"66" [shape="record", label="{StringListTypeValidatorTests|type_name : str\l|test_single_value()\ltest_empty_value()\ltest_list_of_values()\l}"]; -"68" [shape="record", label="{FileResource|owner\lpath\lgroup\lcontents\lpermissions\l|}"]; -"69" [shape="record", label="{IssueReporter|issues : list\l|all_issues()\lreport_issue()\l}"]; -"70" [shape="record", label="{CinderSchedulerComponent|config_files : list\lversion\lcomponent : str\lname : str\l|}"]; -"71" [shape="record", label="{MysqlComponent|config_files : list\lversion\lcomponent : str\lname : str\l|}"]; -"72" [shape="record", label="{Service|issues : list\l|report_issue()\lall_issues()\lhost()\lopenstack()\l}"]; -"73" [shape="record", label="{Host|components : list\lname\lnetwork_addresses : list\lid\l|openstack()\ladd_component()\lall_issues()\l}"]; -"74" [shape="record", label="{NovaApiComponent|config_files : list\lversion\lpaste_config_file : NoneType\lcomponent : str\lname : str\l|paste_config()\lall_issues()\l}"]; -"75" [shape="record", label="{KeystoneComponent|config_files : list\lversion\ldb : dict\lcomponent : str\lname : str\l|}"]; -"76" [shape="record", label="{GlanceApiComponent|config_files : list\lversion\lcomponent : str\lname : str\l|}"]; -"77" [shape="record", label="{CinderApiComponent|config_files : list\lversion\lpaste_config_file : NoneType\lcomponent : str\lname : str\l|}"]; -"78" [shape="record", label="{NovaComputeComponent|config_files : list\lversion\lcomponent : str\lname : str\l|}"]; -"79" [shape="record", label="{NovaSchedulerComponent|config_files : list\lversion\lcomponent : str\lname : str\l|}"]; -"80" [shape="record", label="{OpenstackComponent|logger : NoneType, RootLogger\lcomponent : NoneType\l|config()\l}"]; -"81" [shape="record", label="{RabbitMqComponent|version : str\lname : str\l|}"]; -"82" [shape="record", label="{GlanceRegistryComponent|config_files : list\lversion\lcomponent : str\lname : str\l|}"]; -"83" [shape="record", label="{CinderVolumeComponent|config_files : list\lversion\lrootwrap_config : NoneType\lcomponent : str\lname : str\l|}"]; -"84" [shape="record", label="{Openstack|hosts : list\l|components()\ladd_host()\lall_issues()\l}"]; -"87" [shape="record", label="{IniConfigParser|key_value_re\l|parse()\l}"]; -"90" [shape="record", label="{Inspection|\l|rules()\lall_inspections()\linspect()\l}"]; -"91" [shape="record", label="{Issue|message\ltype\lINFO : str\lWARNING : str\lFATAL : str\lERROR : str\l|}"]; -"92" [shape="record", label="{MarkedIssue|mark\l|offset_by()\l}"]; -"93" [shape="record", label="{Mark|column : int\lsource\lline : int\l|merge()\l}"]; -"94" [shape="record", label="{Version|parts : list\l|major()\lmaintenance()\lminor()\l}"]; -"95" [shape="record", label="{Error|message\l|}"]; -"97" [shape="record", label="{ConfigSchemaRegistryTests|\l|test_sample()\l}"]; -"99" [shape="record", label="{IniConfigParserTests|parser\l|test_default_section_name()\ltest_multiline_value()\lparse()\ltest_use_equals_delimiter_if_it_comes_before_colon()\ltest_errors_doesnt_affect_valid_parameters()\ltest_colon_as_delimiter()\ltest_wrapping_value_with_double_quotes_and_trailing_whitespace()\ltest_parsing_with_same_section()\ltest_wrapping_value_with_single_quotes_and_trailing_whitespace()\ltest_hash_in_value_is_part_of_the_value()\ltest_whole_line_comments_starting_with_hash()\ltest_returning_multiple_errors()\lsetUp()\ltest_spaces_in_key_causes_error()\ltest_multiline_value_finished_by_other_parameter()\ltest_use_colon_delimiter_if_it_comes_before_equals_sign()\ltest_wrapping_value_with_single_quotes()\ltest_whole_line_comments_starting_with_semicolon()\ltest_unclosed_section_causes_error()\ltest_parsing_with_different_sections()\lassertAttributes()\ltest_parsing_with_section()\ltest_missing_equals_sign_or_colon_causes_error()\lassertParameter()\ltest_parsing_iolike_source()\ltest_wrapping_value_with_double_quotes()\ltest_multiline_value_finished_by_empty_line()\ltest_parsing()\l}"]; -"101" [shape="record", label="{memoized|cache : dict\lfunc\l|}"]; -"104" [shape="record", label="{ConfigurationTests|default_value : str\lsection : str\lvalue : str\lparam : str\lfullparam\l|test_explicit_default_on_get()\ltest_contains_default()\ltest_is_default_returns_true_if_only_default_value_set()\ltest_normal_overrides_default()\ltest_keys()\ltest_storage()\ltest_cycle_template_substitution_resolves_in_empty_string()\ltest_subsection_keys()\ltest_subsection_getitem()\ltest_subsection_contains()\ltest_subsection_get()\ltest_subsection_items()\ltest_default()\ltest_is_default_returns_false_if_param_missing()\ltest_returns_section_object_even_if_section_doesnot_exist()\ltest_template_substitution()\ltest_parameter_names_containing_sections()\ltest_is_default_returns_false_if_both_values_set()\ltest_getitem()\ltest_contains()\ltest_subsection_setitem()\ltest_subsection_set()\ltest_is_default_returns_false_if_normal_value_set()\ltest_parameter_with_default_section()\ltest_empty()\ltest_getting_raw_values()\ltest_setitem()\ltest_contains_normal()\l}"]; -"106" [shape="record", label="{VersionTests|\l|test_equility()\ltest_creation_from_components()\ltest_non_equility()\ltest_creation_from_string()\ltest_creation_from_string_with_less_parts()\ltest_creation_from_other_version()\ltest_comparision()\l}"]; -"109" [shape="record", label="{ParseError|\l|}"]; -"114" [shape="record", label="{TypeValidatorRegistry|\l|register_validator()\lget_validator()\l}"]; -"115" [shape="record", label="{SchemaVersionRecord|checkpoint\lremovals : list\lversion\ladds : list\l|section()\lparam()\lremove_param()\l}"]; -"116" [shape="record", label="{ConfigParameterSchema|name\ldefault : NoneType\lsection : NoneType\lrequired : bool\ldeprecation_message : NoneType\ltype\ldescription : NoneType\l|}"]; -"117" [shape="record", label="{TypeValidator|f\l|validate()\l}"]; -"118" [shape="record", label="{ConfigSchema|version\lname\lparameters\lformat\l|get_parameter()\lhas_section()\l}"]; -"119" [shape="record", label="{ConfigSchemaRegistry|\l|register_schema()\lget_schema()\l}"]; -"120" [shape="record", label="{InvalidValueError|\l|}"]; -"121" [shape="record", label="{SchemaBuilder|data\l|version()\l}"]; -"122" [fontcolor="red", shape="record", label="{SchemaError|\l|}"]; -"123" [shape="record", label="{SchemaIssue|\l|}"]; -"4" -> "90" [arrowtail="none", arrowhead="empty"]; -"12" -> "90" [arrowtail="none", arrowhead="empty"]; -"14" -> "90" [arrowtail="none", arrowhead="empty"]; -"17" -> "19" [arrowtail="none", arrowhead="empty"]; -"18" -> "19" [arrowtail="none", arrowhead="empty"]; -"20" -> "19" [arrowtail="none", arrowhead="empty"]; -"22" -> "18" [arrowtail="none", arrowhead="empty"]; -"23" -> "18" [arrowtail="none", arrowhead="empty"]; -"24" -> "18" [arrowtail="none", arrowhead="empty"]; -"26" -> "19" [arrowtail="none", arrowhead="empty"]; -"48" -> "47" [arrowtail="none", arrowhead="empty"]; -"49" -> "47" [arrowtail="none", arrowhead="empty"]; -"57" -> "59" [arrowtail="none", arrowhead="empty"]; -"58" -> "59" [arrowtail="none", arrowhead="empty"]; -"60" -> "59" [arrowtail="none", arrowhead="empty"]; -"61" -> "59" [arrowtail="none", arrowhead="empty"]; -"62" -> "59" [arrowtail="none", arrowhead="empty"]; -"63" -> "59" [arrowtail="none", arrowhead="empty"]; -"64" -> "59" [arrowtail="none", arrowhead="empty"]; -"65" -> "59" [arrowtail="none", arrowhead="empty"]; -"66" -> "59" [arrowtail="none", arrowhead="empty"]; -"68" -> "69" [arrowtail="none", arrowhead="empty"]; -"70" -> "80" [arrowtail="none", arrowhead="empty"]; -"71" -> "72" [arrowtail="none", arrowhead="empty"]; -"72" -> "69" [arrowtail="none", arrowhead="empty"]; -"73" -> "69" [arrowtail="none", arrowhead="empty"]; -"74" -> "80" [arrowtail="none", arrowhead="empty"]; -"75" -> "80" [arrowtail="none", arrowhead="empty"]; -"76" -> "80" [arrowtail="none", arrowhead="empty"]; -"77" -> "80" [arrowtail="none", arrowhead="empty"]; -"78" -> "80" [arrowtail="none", arrowhead="empty"]; -"79" -> "80" [arrowtail="none", arrowhead="empty"]; -"80" -> "72" [arrowtail="none", arrowhead="empty"]; -"81" -> "72" [arrowtail="none", arrowhead="empty"]; -"82" -> "80" [arrowtail="none", arrowhead="empty"]; -"83" -> "80" [arrowtail="none", arrowhead="empty"]; -"84" -> "69" [arrowtail="none", arrowhead="empty"]; -"92" -> "91" [arrowtail="none", arrowhead="empty"]; -"109" -> "92" [arrowtail="none", arrowhead="empty"]; -"120" -> "92" [arrowtail="none", arrowhead="empty"]; -"122" -> "47" [arrowtail="none", arrowhead="empty"]; -"123" -> "91" [arrowtail="none", arrowhead="empty"]; -"7" -> "8" [arrowhead="diamond", style="solid", arrowtail="none", fontcolor="green", label="shell"]; -"9" -> "10" [arrowhead="diamond", style="solid", arrowtail="none", fontcolor="green", label="node_discovery_klass"]; -"68" -> "74" [arrowhead="diamond", style="solid", arrowtail="none", fontcolor="green", label="paste_config_file"]; -"68" -> "77" [arrowhead="diamond", style="solid", arrowtail="none", fontcolor="green", label="paste_config_file"]; -"68" -> "83" [arrowhead="diamond", style="solid", arrowtail="none", fontcolor="green", label="rootwrap_config"]; -"87" -> "99" [arrowhead="diamond", style="solid", arrowtail="none", fontcolor="green", label="parser"]; -"94" -> "115" [arrowhead="diamond", style="solid", arrowtail="none", fontcolor="green", label="version"]; -"94" -> "118" [arrowhead="diamond", style="solid", arrowtail="none", fontcolor="green", label="version"]; -} diff --git a/doc/source/images/src/mvp0_demo_preparation_plan.txt b/doc/source/images/src/mvp0_demo_preparation_plan.txt deleted file mode 100644 index 16de79c..0000000 --- a/doc/source/images/src/mvp0_demo_preparation_plan.txt +++ /dev/null @@ -1,30 +0,0 @@ -@startuml -frame "Peter" { - [network emulation] - cloud { - [demo scenario] - } -} -frame "Sergey" { - [network emulation] --> [salt bootstrap] - [salt bootstrap] --> [nodes discovery] -} - -frame "Max" { - [config files collector] - [config-inspector] -up-> [demo scenario] -} -frame "Ilya" { - [tripleo-image-elements] --> [os-collect-config] - [tripleo-heat-templates] --> [os-collect-config] -} -frame "Kirill" { - [rules editing engine] <-- [config-inspector] - [rules editing engine] --> [demo scenario] -} -[nodes discovery] --> nodelist -nodelist --> [config files collector] -[config files collector] --> JSON -JSON --> [config-inspector] -[os-collect-config] --> JSON -@enduml diff --git a/doc/source/images/src/openstack_cloud_lifecycle.txt b/doc/source/images/src/openstack_cloud_lifecycle.txt deleted file mode 100644 index 4581544..0000000 --- a/doc/source/images/src/openstack_cloud_lifecycle.txt +++ /dev/null @@ -1,7 +0,0 @@ -@startuml - -(*) -right-> [OpenStack Services\nNova, Keystone, Neutron,\nGlance, Heat, Swift] "Deployment" -"Deployment" -right-> [OpenStack Deployment\nFuel, TripleO, Devstack] "Operation\nMaintenance" -"Operation\nMaintenance" -right-> [DRAGONS?\nTuskar, Rubick] (*) - -@enduml diff --git a/doc/source/images/src/openstack_integration_tripleo_arch.txt b/doc/source/images/src/openstack_integration_tripleo_arch.txt deleted file mode 100644 index 9185caa..0000000 --- a/doc/source/images/src/openstack_integration_tripleo_arch.txt +++ /dev/null @@ -1,61 +0,0 @@ -@startuml - -frame "Undercloud" { - - package "Metadata services" { - [Heat] - [CFN] - [EC2] - } - - frame "TripleO" { - cloud { - folder "tripleo-image-elements" { - () "nova.conf" - () "keystone.conf" - () "glance.conf" - () "..." - } - [diskimage-builder] -- nova.conf - [diskimage-builder] -- keystone.conf - [diskimage-builder] -- glance.conf - [diskimage-builder] -- ... - } - [os-collect-config] --> JSON - JSON --> [os-refresh-config] - } - - frame "Tuskar" { - [Tuskar] - } - - frame "OpenStack Dashboard" { - [Tuskar-UI] - [Rubick-UI] - } - - cloud { - [OpenStack Diagnostics] << Rubick >> - } - - () HOT - () Templates - - frame "Glance" { - [Images] - } -} - -[Heat] --> [os-collect-config] -[CFN] --> [os-collect-config] -[EC2] --> [os-collect-config] -[Tuskar] -- HOT -HOT -- [Heat] -HOT -- [OpenStack Diagnostics] -[OpenStack Diagnostics] -- [Rubick-UI] -[Tuskar] -- [Tuskar-UI] -[diskimage-builder] -right-> [Images] -[diskimage-builder] -up-> Templates -Templates --> [OpenStack Diagnostics] - -@enduml diff --git a/doc/source/images/src/openstack_integration_tripleo_seq.txt b/doc/source/images/src/openstack_integration_tripleo_seq.txt deleted file mode 100644 index 8e16142..0000000 --- a/doc/source/images/src/openstack_integration_tripleo_seq.txt +++ /dev/null @@ -1,15 +0,0 @@ -@startuml - -User -> Tuskar: Create cluster (metadata) -Tuskar -> Heat: Create HOT (metadata) -Tuskar -> diskimagebuilder: Create images\n(config files templates) -Tuskar -> Rubick: Verify config -Rubick -> Heat: Get HOT -Heat -> Rubick: HOT (metadata) -Rubick -> diskimagebuilder: Get config\nfiles templates -diskimagebuilder -> Rubick: Templates -Rubick -> Rubick: Create data model\nInpspect config -Rubick -> Tuskar: Config report -Tuskar -> User: Config report - -@enduml diff --git a/doc/source/images/src/packages_Rubick.dot b/doc/source/images/src/packages_Rubick.dot deleted file mode 100644 index f00fe04..0000000 --- a/doc/source/images/src/packages_Rubick.dot +++ /dev/null @@ -1,103 +0,0 @@ -digraph "packages_Rubick" { -charset="utf-8" -rankdir=BT -"3" [shape="box", label="rubick.inspections.keystone_endpoints"]; -"5" [shape="box", label="rubick.discovery"]; -"11" [shape="box", label="rubick.inspections.keystone_authtoken"]; -"13" [shape="box", label="rubick.inspections.lettuce_runner"]; -"15" [shape="box", label="rubick.config_model"]; -"27" [shape="box", label="rubick.main"]; -"28" [shape="box", label="rubick.celery"]; -"31" [shape="box", label="rubick"]; -"32" [shape="box", label="rubick.config_formats"]; -"33" [shape="box", label="rubick.schemas.glance"]; -"34" [shape="box", label="rubick.schemas.swift.v2013_2"]; -"35" [shape="box", label="rubick.schemas.glance.v2013_2"]; -"36" [shape="box", label="rubick.json"]; -"37" [shape="box", label="rubick.schemas.schema_generator"]; -"39" [shape="box", label="rubick.schemas.keystone.v2013_2"]; -"40" [shape="box", label="rubick.schemas.nova.v2013_2"]; -"41" [shape="box", label="rubick.schemas.cinder"]; -"42" [shape="box", label="rubick.database"]; -"45" [shape="box", label="rubick.schemas.nova.v2013_1_4"]; -"46" [shape="box", label="rubick.exceptions"]; -"50" [shape="box", label="rubick.schemas.nova.v2013_1_3"]; -"51" [shape="box", label="rubick.schemas.nova"]; -"52" [shape="box", label="rubick.schemas.keystone.v2013_1_4"]; -"53" [shape="box", label="rubick.schemas.keystone.v2013_1_3"]; -"54" [shape="box", label="rubick.test_mark"]; -"56" [shape="box", label="rubick.test_type_validators"]; -"67" [shape="box", label="rubick.model"]; -"85" [shape="box", label="rubick.inspections"]; -"86" [shape="box", label="rubick.config_formats.ini"]; -"88" [shape="box", label="rubick.schemas.neutron.v2013_2"]; -"89" [shape="box", label="rubick.common"]; -"96" [shape="box", label="rubick.test_config_schema_registry"]; -"98" [shape="box", label="rubick.config_formats.test_ini"]; -"100" [shape="box", label="rubick.utils"]; -"102" [shape="box", label="rubick.schemas.keystone"]; -"103" [shape="box", label="rubick.test_configuration"]; -"105" [shape="box", label="rubick.test_version"]; -"107" [shape="box", label="rubick.schemas.swift"]; -"108" [shape="box", label="rubick.config_formats.common"]; -"110" [shape="box", label="rubick.schemas.cinder.v2013_2"]; -"111" [shape="box", label="rubick.schemas.neutron"]; -"112" [shape="box", label="rubick.schemas"]; -"113" [shape="box", label="rubick.schema"]; -"124" [shape="box", label="rubick.schemas.cinder.v2013_1_3"]; -"3" -> "89" [arrowtail="none", arrowhead="open"]; -"5" -> "67" [arrowtail="none", arrowhead="open"]; -"5" -> "46" [arrowtail="none", arrowhead="open"]; -"5" -> "89" [arrowtail="none", arrowhead="open"]; -"11" -> "89" [arrowtail="none", arrowhead="open"]; -"13" -> "89" [arrowtail="none", arrowhead="open"]; -"27" -> "31" [arrowtail="none", arrowhead="open"]; -"28" -> "85" [arrowtail="none", arrowhead="open"]; -"28" -> "28" [arrowtail="none", arrowhead="open"]; -"28" -> "89" [arrowtail="none", arrowhead="open"]; -"28" -> "42" [arrowtail="none", arrowhead="open"]; -"28" -> "36" [arrowtail="none", arrowhead="open"]; -"28" -> "5" [arrowtail="none", arrowhead="open"]; -"31" -> "27" [arrowtail="none", arrowhead="open"]; -"32" -> "89" [arrowtail="none", arrowhead="open"]; -"32" -> "86" [arrowtail="none", arrowhead="open"]; -"33" -> "35" [arrowtail="none", arrowhead="open"]; -"34" -> "113" [arrowtail="none", arrowhead="open"]; -"35" -> "113" [arrowtail="none", arrowhead="open"]; -"39" -> "113" [arrowtail="none", arrowhead="open"]; -"40" -> "113" [arrowtail="none", arrowhead="open"]; -"41" -> "124" [arrowtail="none", arrowhead="open"]; -"45" -> "113" [arrowtail="none", arrowhead="open"]; -"50" -> "113" [arrowtail="none", arrowhead="open"]; -"51" -> "50" [arrowtail="none", arrowhead="open"]; -"52" -> "113" [arrowtail="none", arrowhead="open"]; -"53" -> "113" [arrowtail="none", arrowhead="open"]; -"54" -> "89" [arrowtail="none", arrowhead="open"]; -"56" -> "113" [arrowtail="none", arrowhead="open"]; -"56" -> "89" [arrowtail="none", arrowhead="open"]; -"67" -> "113" [arrowtail="none", arrowhead="open"]; -"67" -> "89" [arrowtail="none", arrowhead="open"]; -"67" -> "15" [arrowtail="none", arrowhead="open"]; -"67" -> "100" [arrowtail="none", arrowhead="open"]; -"67" -> "32" [arrowtail="none", arrowhead="open"]; -"85" -> "11" [arrowtail="none", arrowhead="open"]; -"85" -> "13" [arrowtail="none", arrowhead="open"]; -"85" -> "3" [arrowtail="none", arrowhead="open"]; -"86" -> "15" [arrowtail="none", arrowhead="open"]; -"86" -> "108" [arrowtail="none", arrowhead="open"]; -"88" -> "113" [arrowtail="none", arrowhead="open"]; -"96" -> "113" [arrowtail="none", arrowhead="open"]; -"96" -> "89" [arrowtail="none", arrowhead="open"]; -"98" -> "86" [arrowtail="none", arrowhead="open"]; -"102" -> "53" [arrowtail="none", arrowhead="open"]; -"103" -> "15" [arrowtail="none", arrowhead="open"]; -"105" -> "113" [arrowtail="none", arrowhead="open"]; -"107" -> "34" [arrowtail="none", arrowhead="open"]; -"108" -> "89" [arrowtail="none", arrowhead="open"]; -"110" -> "113" [arrowtail="none", arrowhead="open"]; -"111" -> "88" [arrowtail="none", arrowhead="open"]; -"112" -> "41" [arrowtail="none", arrowhead="open"]; -"113" -> "89" [arrowtail="none", arrowhead="open"]; -"113" -> "46" [arrowtail="none", arrowhead="open"]; -"124" -> "113" [arrowtail="none", arrowhead="open"]; -} diff --git a/doc/source/images/src/rules_engine_class_model.txt b/doc/source/images/src/rules_engine_class_model.txt deleted file mode 100644 index 98628e6..0000000 --- a/doc/source/images/src/rules_engine_class_model.txt +++ /dev/null @@ -1,23 +0,0 @@ -@startuml - -package "common.py" { - class "Inspection" { - } - class "Issue" { - } - class "Mark" { - } - class "Error" { - } - class "Version" { - } -} - -package "model.py" { - class "Model" { - } -} - -Inspection --|> Issue - -@enduml diff --git a/doc/source/images/src/service_architecture.txt b/doc/source/images/src/service_architecture.txt deleted file mode 100644 index 95418ca..0000000 --- a/doc/source/images/src/service_architecture.txt +++ /dev/null @@ -1,36 +0,0 @@ -@startuml - -frame "Rubick" { - [Rubick API] - [Rule engine] - [Config data\nextractor] - [Heat metadata\n plugin] - [SSH metadata\nplugin] - [...] - [Config data\nstore] - () "openstack.model" - folder "Rulesets" { - [healthcheck\nruleset] - [best practices\nruleset] - } -} - -frame "Heat" { - [Heat API] -} - -() Stack - -[Rubick API] -- openstack.model -[Config data\nstore] -- openstack.model -[Heat API] -up-> Stack -Stack -up-> [Heat metadata\n plugin] -[Config data\nextractor] -up- openstack.model -[Rule engine] -- openstack.model -[Config data\nextractor] -- [Heat metadata\n plugin] -[Config data\nextractor] -- [...] -[Config data\nextractor] -- [SSH metadata\nplugin] -[Rule engine] -up- [healthcheck\nruleset] -[Rule engine] -up- [best practices\nruleset] - -@enduml diff --git a/doc/source/openstack_architecture_model.rst b/doc/source/openstack_architecture_model.rst deleted file mode 100644 index d02c6ae..0000000 --- a/doc/source/openstack_architecture_model.rst +++ /dev/null @@ -1,93 +0,0 @@ -Architecture Data Model -======================= - -Overview --------- - -We want to introduce unified data structure which contains all information -necessary to inspect, analyze, describe and visualize OpenStack architecture. - -Architecture data model serves multiple actual and potential use cases. - -Diagnostics -^^^^^^^^^^^ - -Architecture data model provides necessary data for the configuration analysis -and diagnostics tool (**Rubick**). - -Deployment -^^^^^^^^^^ - -Arhictecture data model must include all information necessary to deployment -systems (e.g. **Fuel** or **TripleO**). We will implement simple conversion -tools which will allow to configure these deployment systems and effectively -support 'portable' clouds. - -Benchmarking -^^^^^^^^^^^^ - -This model could be reused by **Rally** project to compare benchmarking -results for different architectures. Definitions of architectures must be -comparable and portable, which is exactly what architecture model aimed to -solve. - -Upgrade -^^^^^^^ - -Upgrade system could potentially utilize the model just in the way the -Deployment systems do. In addition, existing clouds could be inspected and -described for subsequent upgrade using this model. - -Tech Support -^^^^^^^^^^^^ - -The model suits as base for questionaire to assess existing installations for -support contract pricing purposes. - -Hardening -^^^^^^^^^ - -The model could be used to perform automated/guided hardening of OpenStack -architecture and configuration. This is achieved through use of 'best practice' -rulesets for the inspection of cloud. - -Expert system -^^^^^^^^^^^^^ - -The model could be used as a part of production/reactive rules system capable -of automated reporting and handling of operational errors, based on combination -of *base* status of the cloud, logging messages and notifications. - -Data Format ------------ - -This section proposes data model format which allows to describe an OpenStack -installation. The model includes data regarding physical infrastructure, logical -topology of services and mapping between the two. - -Current model of OpenStack architecture used in Rubick is defined in module -``rubick/model.py``. This module contains following classes in hierarchy below: - - OpenStack: - hosts: - - Host: hostname1 - components: - - Service: NovaApiComponent - config: - - key: value - - ... - - Service: KeystoneComponent - config: - - key: value - - ... - - ... - filesystem: - - resource1: FileResource - - resource2: DirectoryResource - - ... - - Host: hostname2 - components: - - ... - filesystem: - - ... - - ... diff --git a/doc/source/openstack_diagnostics_proposal.rst b/doc/source/openstack_diagnostics_proposal.rst deleted file mode 100644 index 5effb3a..0000000 --- a/doc/source/openstack_diagnostics_proposal.rst +++ /dev/null @@ -1,108 +0,0 @@ -============================== -OPENSTACK DIAGNOSTICS PROPOSAL -============================== - -.. contents:: - -Project Name -============ - -**Official:** OpenStack Diagnostics - -**Codename:** Rubick - -OVERVIEW -======== - -The typical OpenStack cloud life cycle consists of 2 phases: - -- initial deployment and -- operation maintenance - -OpenStack cloud operators usually rely on deploymnet tools to configure all the -platform components correctly and efficiently in **initial deployment** phase. -Multiple OpenStack projects cover that area: TripleO/Tuskar, Fuel and Devstack, -to name a few. - -However, once you installed and kicked off the cloud, platform configurations -and operational conditions begin to change. These changes could break -consistency and integration of cloud platform components. Keeping cloud up and -running is the essense of **operation maintenance** phase. - -Cloud operator must quickly and efficiently identify and respond to the root -cause of such failures. To do so, he must check if his OpenStack configuration -is sane and consistent. These checks could be thought of as rules of diagnostic -system. - -There are not many projects in OpenStack ecosystem aimed to increase reliability -and resilience of the cloud at the operation stage. With this proposal we want -to introduce a project which will help operators to diagnose their OpenStack -platform, reduce response time to known and unknown failures and effectively -support the desired SLA. - -Mission -------- - -Diagnostics' mission is to **provide OpenStack cloud operators with tools which -minimize time and effort needed to identify and fix errors in operations -maintenance phase of cloud life cycle.** - -User Stories ------------ - -- As a **cloud operator**, I want to make sure that my OpenStack architecture - and configuration is sane and consistent across all platform components and - services. -- As a **cloud architect**, I want to make sure that my OpenStack architecture - and configuration are compliant to best practices. -- As a **cloud architect**, I need a knowledge base of sanity checks and best - practices for troubleshooting my OpenStack cloud which I can reuse and update - with my own checks and rules. -- As a **cloud operator**, I want to be able to automatically extract - configuration parameters from all OpenStack components to verify their - correctness, consistency and integrity. -- As a **cloud operator**, I want automatic diagnostics tool which can inspect - configuration of my OpenStack cloud and report if it is sane and/or compliant - toc community-defined best practices. -- As a **cloud operator**, I want to be able to define rules used to inspect - and verify configuration of OpenStack components and store them to use for - verification of future configuration changes. - -Roadmap -------- - -Proof of concept implementation - end October 2013. PoC implementation includes: - -#. Open source code in stackforge repository -#. Standalone service with REST API v0.1 -#. Simple SSH-based configuration data extraction -#. Rules engine with grammatic analysis -#. Basic healthcheck ruleset v0.1 with example rules of different types -#. Filesystem-based ruleset store - -PoC scope does not include: - -#. Basic integration with OpenStack Deployment program projects (Tuskar, - TripleO) -#. Extraction of configuration data from Heat metadata -#. Extended ruleset with example best practices -#. Healthcheck ruleset v1.0 -#. Ruleset store back-ends - -Assumptions ------------ - -We assume that we must reuse as much as possible from OpenStack Deployment -program in terms of platform configuration and architecture definitions (i.e. -TripleO Heat and configuration files templates). - -DESIGN -====== - -.. include:: service_architecture.rst - -.. include:: rules_engine.rst - -.. include:: openstack_integration.rst - -.. include:: openstack_architecture_model.rst diff --git a/doc/source/openstack_integration.rst b/doc/source/openstack_integration.rst deleted file mode 100644 index 5ecdb5a..0000000 --- a/doc/source/openstack_integration.rst +++ /dev/null @@ -1,57 +0,0 @@ -Integration with OpenStack -========================== - -Use Case #1. Validate initial configuration -------------------------------------------- - -OpenStack Diagnostics could add value to OpenStack Deployment by providing -on-demand or automated verification of OpenStack configuration created by user -of Deployment tools. - -OpenStack Deployment (TripleO) allows user to manage OpenStack cloud (called -'overcloud' in terms of TripleO) as standard OpenStack environment. This -involves Heat, Nova with baremetal driver (or Ironic service) and Tuskar as a -user interface application, all installed in small 'management' environment -called 'undercloud'. - -When user wants to install 'overcloud', he uses Tuskar UI to configure bare -metal in cluster and set roles for all nodes. Tuskar then creates Heat -Orcestration Template (HOT) which describes overcloud architecture. This -template also contains node-specific configurations of overcloud OpenStack -components as nodes metadata. This template could be used by Diagnostics as a -source of information for analysis. - -Currently (as of Havana release) there is no support for automated creation of -images for overcloud nodes in TripleO. However, once such functionality added to -the project, Diagnostics could fetch base configuration templates for all -overcloud components. Until then, user will have to provide these templates to -Diagnostics service via API. - -Combining node-specific metadata with configuration templates, Diagnostics will -have comprehensive configuration information for the new 'overcloud' and will be -able to match it to ruleset to verify configuration consistency. - -The following diagram illustrates architecture of the described case: - -.. image:: images/openstack_integration_tripleo_arch.png - -The following sequence diagram shows data exchange in dynamic: - -.. image:: images/openstack_integration_tripleo_seq.png - -This diagram shows integration points between OpenStack TripleO (OpenStack on -OpenStack) program and the diagnostics system. Diagnostic system will perform -the following steps: - -* extract initial environment configuration from **metadata services** - of the 'undercloud' (in terms of TripleO). Heat Orchestration Templates for - OpenStack 'overcloud' describe nodes and their roles, as well as configuration - parameters. -* populate an **architecture data model** with actual configuration - parameters from metadata services. -* run **inspections** through the architecture data model by - set of **production rules** defined by user, or selected by user from the list - of all available rules, defined externally. -* report **results of inspection** as a list of rules that were checked with - indication of matched and unmatched rules. For unmatched rules, diagnostics - could give **recommendations and hints**. diff --git a/doc/source/rules_engine.rst b/doc/source/rules_engine.rst deleted file mode 100644 index 9ab2df9..0000000 --- a/doc/source/rules_engine.rst +++ /dev/null @@ -1,96 +0,0 @@ -Production Rules Engine -======================= - -This document describes rule engine used for inspection and diagnostics of -OpenStack configuration. - -Summary -------- - -The consistent configuration across all components is essential to OpenStack -cloud operation. If something is wrong with configuration, you as an operator -will know this immidiately either from monitoring or clients complaining. But -diagnosing the exact problem is always a challenge, given the number of -components and configuration options per component. - -You could think about troubleshooting OpenStack as going through some scenarios -which can be expressed as sets of rules. Your configuration must comply to all -those rules to be operational. On the other hand, if you know rules which your -configuration breaks, you can identify incorrect parameters reliably and easy. -That is how production rule systems and diagnostic systems work. - -Example production rule ------------------------ - -Example production rule for OpenStack system would be:: - - Given (condition_parameter_1) is (value) and - (condition_parameter_2) is (value) - then (check_parameter_1) must be (value) - -Rule-based inspection ---------------------- - -All rule-based inspections are using pre-defined actions written in python, -currently they are defined in "steps.py" file in the directory: -``rubick/inspections/lettuce``. They are based on lettuce framework - -bdd framework for python. - -Store and reuse rules ---------------------- - -First version of Rubick project stores rules to text files and loads them to -memory at runtime. You can add your own rules to the set using web UI, and those -rules can be saved to files for persistence. - -In future versions, we plan to add module which will save rules to database. It -will also support migrating existing rule set to the database. - -You can store your rules wherever you want and add it through the UI or simply -by putting them in text files in directory -``rubick/inspections/lettuce``. -Rules file must have name in the following format:: - - \*.feature - -The main requirement is that all rule conditions and actions in those files must -be written in accordance with code of rule steps in -``ostack-validator/inspections/lettuce/steps.py``. - -Extending rules ---------------- - -Also you can extend rules definition by adding your own steps to steps.py. As -an example:: - - #This decorator is for defining step for using them in the scenario. - @step(r'Nova has "(.+)" equal to "(.*)"') - def nova_has_property(step, name, value): - name = subst(name) - value = subst(value) - - for nova in [c for c in world.openstack.components if - c.name.startswith('nova')]: - if not nova.config[name] == value: - stop() - -New methods can use 2 classes from the inspections framework: -``rubick/model.py`` and ``rubick/common.py``. There you can -find many adapters to OpenStack services configuration data and all additional -information collected from OpenStack nodes. After that you can use you brand -new rule in the scenarios as described above. - -In module ``rubick/common.py`` you can find ``Inspection``, ``Issue``, -``Mark``, ``Error`` and ``Version`` classes for your convenience in rule -defining. Module ``model.py`` contains Openstack model based on configuration -schemas. - -.. image:: images/rules_engine_class_model.png - -Default rule sets ------------------ - -We plan to provide 2 rule sets with Rubick initial version: - -* healthcheck or sanity rule set -* best practices rule set diff --git a/doc/source/service_architecture.rst b/doc/source/service_architecture.rst deleted file mode 100644 index e1711b0..0000000 --- a/doc/source/service_architecture.rst +++ /dev/null @@ -1,24 +0,0 @@ -Design & Architecture -===================== - -This section describes design and architecture of OpenStack Diagnostics (Rubik) -service. - -Service includes the following components: - -* **openstack.model** is an OpenStack architecture model representation. It is a - common format used by components of the system to exchange configuration of - the inspected environment -* **Rubick API** is a web service which implements APIs to rules, inspections - and OpenStack architecture model -* **Rule engine** is a logic which performs inspections on the data model. Rule - engine will have an interface to the ruleset store in future. -* **Config data store** is a storage for architecture models -* **Config data extractor** creates OpenStack model based on data collected from - different sources, implemented as pluggable back-ends -* **Heat metadata plugin** extracts configration metadata from Heat stacks - created by TripleO/Tuskar service -* **SSH metadata plugin** extracts configuration metadata from actual nodes of - OpenStack cloud via secure SSH connection - -.. image:: images/service_architecture.png diff --git a/joker/__init__.py b/joker/__init__.py deleted file mode 100644 index 4fa23c4..0000000 --- a/joker/__init__.py +++ /dev/null @@ -1,110 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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 nodes import Node -import os - -TMP_PATH = "/tmp/joker_%s_%d" - - -class Joker(): - - def __init__(self, default_key, *args, **kwargs): - - self.useKey = False - - self.discoverQueue = [] - self.discoveryResult = [] - self.cleanUp = [] - self.name = "EntryPoint" - self.seenNodes = {} - self.default_key = None - - if (default_key): - try: - with open(default_key) as f: - self.default_key = f.read() - except Exception: - self.default_key = default_key - - self.useKey = True - - # keys temporary files - - def __del__(self): - for filePath in self.cleanUp: - if os.path.exists(filePath): - os.remove(filePath) - - def addNode(self, name, host, port=22, user='root', password=None): - - node = Node(name, host, port) - node.assignCredential(user, self.default_key, password) - - self.discoverQueue.append(node) - - if (self.useKey): - self.cleanUp.append(node.keyPath) - - return node - - def addResult(self, hostname, ip, user, key, proxyCommand=None, port=22): - return self.discoveryResult.append( - self.dkOutput(hostname, ip, user, key, proxyCommand, port)) - - def dkOutput(self, hostname, ip, user, key, proxyCommand=None, port=22): - return { - "name": hostname, - "ip": ip, - "user": user, - "key": key, - "port": port, - "proxy_command": proxyCommand - } - - def discover(self): - - while self.discoverQueue: - point = self.discoverQueue.pop() - - nodes = point.discover() - - # this host can't be discovered by ssh method - if nodes is None: - continue - - self.addResult( - hostname=point.hostName, ip=point.hostName, user=point.user, - key=point.origKey, proxyCommand=point.proxyCommandTxt, - port=point.accessPort) - - # merge already seen nodes with new discovered nodes - self.seenNodes = dict(self.seenNodes.items() + point.link.items()) - - for node in nodes: - if node['hwAddr'] not in self.seenNodes: - # add to discovering queue - newNode = self.addNode( - name=node['ip'], - host=node['ip'], - user=point.user) - - # new node connection channel working through master node - newNode.setProxyCommand( - point.hostName, - point.accessPort, - point.user, - point.keyPath - ) - - return self.discoveryResult diff --git a/joker/nodes.py b/joker/nodes.py deleted file mode 100644 index 0d7698d..0000000 --- a/joker/nodes.py +++ /dev/null @@ -1,203 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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 paramiko - -import os -from paramiko.dsskey import DSSKey -from paramiko.rsakey import RSAKey -from six import StringIO -import stat - -TMP_KEY_PATH = "/tmp/joker_%s_%d" - - -class Node(): - - def __init__(self, name, ip, port): - - self.ssh = paramiko.SSHClient() - self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) - self.setHostName(ip) - self.setName(name) - self.setAccessPort(port) - self.connected = False - - self.neighbours = [] - self.debug = True - - self.proxyCommandTxt = self.proxyCommand = None - self.link = None - - self.origKey = self._pkey = None - self.keyPath = TMP_KEY_PATH % (name, os.getpid()) - - def dumpKey(self, path, key): - if (key): - f = open(path, "w", stat.S_IRUSR | stat.S_IWUSR) - f.write(key) - f.close() - - # def __del__(self): - # print "Del %s" % self.keyPath - # if os.path.exists(self.keyPath): - # print "Remove %s" % self.keyPath - # os.remove(self.keyPath) - - def proxyCommandGen(self, masterHost, masterPort, masterUser, - masterKeyfile): - return "ssh -i %s -o StrictHostChecking=no -p%d %s@%s nc -q0 %s %d" % ( - masterKeyfile, masterPort, masterUser, masterHost, - self.hostName, self.accessPort) - - def discoverHwAddr(self): - try: - (stdout, stderr) = self.runCommand( - "ip addr | grep -A2 BROADCAST,MULTICAST,UP,LOWER_UP | " - "awk '/link\/ether/ {ether=$2} /inet/ {print $2 \" \" ether}'") - - except Exception: - raise () - - macDict = {} - - for line in stdout: - (ip, hwAddr) = line.strip().split(" ") - macDict[hwAddr] = ip - - return macDict - - def setUniqData(self): - self.link = self.discoverHwAddr() - - def getUniqData(self): - return self.link - - def debugLog(self, debugData): - if self.debug is True: - print debugData - - def prepare(self): - # install arp-scan on node - try: - self.runCommand( - "[ ! -x arp-scan ] && sudo apt-get --force-yes -y install " - "arp-scan") - except Exception: - raise () - self.setUniqData() - - return True - - def infect(self): - # infect node - return True - - def setName(self, name): - self.name = name - - def setHostName(self, hostname): - self.hostName = hostname - - def setAccessPort(self, port): - self.accessPort = port - - def assignKey(self, key): - self.origKey = key - # dump key to file - self.dumpKey(self.keyPath, self.origKey) - - try: - self._pkey = RSAKey.from_private_key(StringIO(self.origKey)) - except paramiko.SSHException: - try: - self._pkey = DSSKey.from_private_key(StringIO(self.origKey)) - except paramiko.SSHException: - raise "Unknown private key format" - - def assignCredential(self, user, key, password=None): - self.user = user - self.password = password - - if (key): - self.assignKey(key) - - def setProxyCommand(self, masterHost, masterPort, masterUser, - masterKeyfile): - self.proxyCommandTxt = self.proxyCommandGen( - masterHost, masterPort, masterUser, masterKeyfile) - self.proxyCommand = paramiko.ProxyCommand(self.proxyCommandTxt) - - def connect(self): - - if self.connected is True: - raise AssertionError(self.connected is True) - - try: - - self.ssh.connect(self.hostName, self.accessPort, self.user, - pkey=self._pkey, sock=self.proxyCommand, - timeout=5, password=self.password) - - self.connected = True - return True - - except paramiko.BadHostKeyException as e: - print "Host key could not be verified: ", e - return False - except paramiko.AuthenticationException as e: - print "Error unable to authenticate: ", e - return False - except paramiko.SSHException as e: - return False - except EOFError as e: - return False - - def runCommand(self, command): - if (command == ""): - AssertionError(command == "") - - if self.connected is False: - self.connect() - - self.debugLog("---> " + self.hostName + " " + command) - stdin, stdout, stderr = self.ssh.exec_command(command) - self.debugLog("OK " + self.hostName + " " + command) - - return (stdout.readlines(), stderr.readlines()) - - def __discover__(self): - - (data, _) = self.runCommand( - "(test -x arp-scan && ip link |\ - awk -F: '/^[0-9]+?: eth/ {print $2}' |\ - sudo xargs -I% arp-scan -l -I % 2>&1 | grep -E '^[0-9]+?\.';\ - arp -an | awk -F\" \" '{ gsub(\"[^0-9\\.]\", \"\", $2);\ - printf(\"%s\\t%s\\t%s\\n\", $2, $4, $7)}'\ - )") - - for line in data: - (ip, hwAddr, _) = line.strip().split("\t") - self.neighbours.append({"hwAddr": hwAddr, "ip": ip}) - self.debugLog("%s -> %s" % (self.hostName, ip)) - - return self.neighbours - - def discover(self): - - if self.connect() is False: - return None - - self.prepare() - - return self.__discover__() diff --git a/joker/ssh.py b/joker/ssh.py deleted file mode 100644 index 22edb8b..0000000 --- a/joker/ssh.py +++ /dev/null @@ -1,124 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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 os import environ -#import shlex -#import subprocess - - -class JokerSecureShell(): - - def __init__(self, hostName): - self.tempDir = "/tmp" - - # TODO(metacoma): implement password authentication scheme - self.credentials = { - "user": None, - "host": None, - "port": 22, - "key": None, - } - - self.options = { - "proxyCommand": None, - "StrictHostKeyChecking": "no" - } - - self.haveMasterSocket = False - self.masterSocketPid = None - - # FIXME use inspect.stack()[0][3] ? - @property - def host(self): - print "called host getter" - return self.credentials['host'] - - @host.setter - def host(self, value): - print "called host setter" - self.credentials['host'] = value - - @property - def user(self): - if self.credentials['user']: - return self.credentials['user'] - else: - return environ['USER'] - - @user.setter - def user(self, value): - self.credentials.user = value - - @property - def key(self): - assert self.credentials['key'] is not None, \ - "Keyfile for %s@%s:%d not present" \ - % (self.user, self.host, self.port) - return self.credentials['key'] - - @key.setter - def key(self, value): - self.credentials['key'] = value - - @property - def port(self): - return self.credentials['port'] - - @port.setter - def port(self, value): - self.credentials.port = value - - @property - def proxyCommand(self): - return self.credentials.proxyCommand - - @proxyCommand.setter - def proxyCommand(self, value): - self.credentials.proxyCommand = value - - @property - def masterSocketPath(self): - return "%s/%s:%d" % (self.tempDir, self.host, self.port) - - @property - def sshOptions(self): - r = "" - - # compile ssh options in one string - - for i in self.options: - if self.options[i] is not None: - r = r + ('-o %s=%s' % (i, self.options[i])) - - return r - - def createMasterSocket(self): - self.haveMasterSocket = True - - # XXX we support only keys without password encryption - #cmd = "ssh -i %s -p %d %s -M -S %s %s@%s" \ - # % (self.key, self.port, self.sshOptions, - # self.masterSocketPath, self.user, self.host) - - # subprocess.Popen(shlex.split(cmd)) - - def call(self, destinationCmd): - if (not self.haveMasterSocket): - self.createMasterSocket() - - #cmd = "ssh %s %s" % (self.host, destinationCmd) - - #stdout = stderr = None - - # exitCode = subprocess.call(shlex.split(destinationCmd), \ - # stdout = stdout, stderr = stderr) diff --git a/joker_test.py b/joker_test.py deleted file mode 100644 index f5043f0..0000000 --- a/joker_test.py +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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 argparse -from joker import Joker -import sys - - -def arg_parse(): - p = argparse.ArgumentParser(description='Joker cli interface') - p.add_argument('-i', '--identity', help='Path to identity file', - default=None) - p.add_argument('-H', '--host', help='destination host') - p.add_argument('-p', '--port', help='destination port', default=22, - type=int) - p.add_argument('-u', '--user', help='username', default="root") - p.add_argument('-P', '--password', help='username', default=None) - return p.parse_args() - - -def main(): - args = arg_parse() - - print args - - j = Joker(args.identity) - j.addNode("EntryPoint", args.host, args.port, args.user, args.password) - - print j.discover() - - -if __name__ == '__main__': - sys.exit(main()) diff --git a/openstack-configuration.txt b/openstack-configuration.txt deleted file mode 100644 index 0260344..0000000 --- a/openstack-configuration.txt +++ /dev/null @@ -1,252 +0,0 @@ -= Configutation -== keystone (identity) - -* MySQL database exists -* MySQL user exists and has proper permissions for keystone database -* /etc/keystone/keystone.conf: - * contains proper 'connection' setting - * 'admin_token' ??? -* Keystone certificates exists (what config options control other communication methods?) -* /etc/keystone/* has user and group set to keystone user - -== glance (image) - -* /var/lib/glance/glance.sqlite -* MySQL database exists -* MySQL user exists and has proper permissions for glance database -* /etc/glance/glance-api.conf: - [keystone_authtoken] - auth_host = ... - auth_port = ... - auth_protocol = http - admin_tenant_name = service - admin_user = glance - admin_password = glance - - [paste_deploy] - config_file = /etc/glance/glance-api-paste.ini - - flavor = keystone - - * sql_connection = mysql://glance:glance-password@/glance - -* /etc/glance/glance-registry.conf: - [keystone_authtoken] - auth_host = ... - auth_port = ... - auth_protocol = http - admin_tenant_name = service - admin_user = glance - admin_password = glance - - [paste_deploy] - config_file = /etc/glance/glance-registry-paste.ini - - flavor = keystone - -* /etc/glance/glance-registry-paste.ini: - # Use this pipeline for keystone auth - [pipeline:glance-registry-keystone] - pipeline = authtoken context registryapp - - * sql_connection = mysql://glance:glance-password@/glance - -= nova (compute) - -* Enabling KVM: - - /etc/nova/nova.conf: - - compute_driver = libvirt.LibvirtDriver - libvirt_type = kvm - - * Check for supported CPU features: - - egrep '(vmx|svm)' --color=always /proc/cpuinfo - - output: - - flags : fpu vme de pse tsc msr pae mce ... - - - lsmod | grep kvm - -* Enabling QEMU - - /etc/nova/nova.conf: - - compute_driver=libvirt.LibvirtDriver - libvirt_type=qemu - -* Enabling Xen: - - /etc/nova/nova.conf: - - compute_driver=xenapi.XenAPIDriver - xenapi_connection_url=http://your_xenapi_management_ip_address - xenapi_connection_username=root - xenapi_connection_password=your_password - - or - - compute_driver=libvirt.LibvirtDriver - libvirt_type=xen - -* Network configuration - * Network interface in promiscuous mode - - ip link set eth0 promisc on - - * /etc/qppid.conf has "auth=no" - * SELinux in permissive mode - - sudo setenforce permissive - -* MySQL - * Database exists - * User exists and has proper permissions to access nova database -* PostgreSQL - * Database exists - * User exists and has proper permissions to access nova database - * /etc/nova/nova.conf has sql_connection=postgres://novadbadmin:[[YOUR_NOVADB_PASSWORD]]@127.0.0.1/nova - -== cinder (block storage) - * /etc/cinder/api-paste.ini: - - [filter:authtoken] - paste.filter_factory = keystone.middleware.auth_token:filter_factory - service_protocol = http - service_host = 10.211.55.20 - service_port = 5000 - auth_host = 10.211.55.20 - auth_port = 35357 - auth_protocol = http - admin_tenant_name = service - admin_user = cinder - admin_password = openstack - - * /etc/cinder/cinder.conf: - - [DEFAULT] - rootwrap_config=/etc/cinder/rootwrap.conf - sql_connection = mysql://cinder:openstack@192.168.127.130/cinder - api_paste_config = /etc/cinder/api-paste.ini - - iscsi_helper=tgtadm - volume_name_template = volume-%s - volume_group = cinder-volumes - verbose = True - auth_strategy = keystone - #osapi_volume_listen_port=5900 - - * If RabbitMQ: - - rabbit_host = 10.10.10.10 - rabbit_port = 5672 - rabbit_userid = rabbit - rabbit_password = secure_password - rabbit_virtual_host = /nova - - * If Qpid: - - qpid_hostname=192.168.206.130 - - * /etc/nova/nova.conf: - - volume_api_class=nova.volume.cinder.API - - -(continue from http://docs.openstack.org/grizzly/openstack-compute/install/yum/content/compute-minimum-configuration-settings.html) - - * Ensure user 'nova' exists, group 'nova' exists, user 'nova' belongs to group 'nova' - * Ensure that '/etc/nova' has 'nova:nova' owners. - * Ensure that '/etc/nova/nova.conf' has 'root:nova' owners and 0640 permissions. - - * Minimal /etc/nova/nova.conf: - - auth_strategy=keystone - network_manager=nova.network.manager.FlatDHCPManager - fixed_range=192.168.100.0/24 - public_interface=eth0 - flat_interface=eth0 - flat_network_bridge=br100 - - * Sample /etc/nova/nova.conf: - - [DEFAULT] - - # LOGS/STATE - verbose=True - logdir=/var/log/nova - state_path=/var/lib/nova - lock_path=/var/lock/nova - rootwrap_config=/etc/nova/rootwrap.conf - - # SCHEDULER - compute_scheduler_driver=nova.scheduler.filter_scheduler.FilterScheduler - - # VOLUMES - volume_api_class=nova.volume.cinder.API - volume_driver=nova.volume.driver.ISCSIDriver - volume_group=cinder-volumes - volume_name_template=volume-%s - iscsi_helper=tgtadm - - # DATABASE - sql_connection=mysql://nova:yourpassword@192.168.206.130/nova - - # COMPUTE - libvirt_type=qemu - compute_driver=libvirt.LibvirtDriver - instance_name_template=instance-%08x - api_paste_config=/etc/nova/api-paste.ini - - # COMPUTE/APIS: if you have separate configs for separate services - # this flag is required for both nova-api and nova-compute - allow_resize_to_same_host=True - - # APIS - osapi_compute_extension=nova.api.openstack.compute.contrib.standard_extensions - ec2_dmz_host=192.168.206.130 - s3_host=192.168.206.130 - enabled_apis=ec2,osapi_compute,metadata - - # QPID - qpid_hostname=192.168.206.130 - - # GLANCE - image_service=nova.image.glance.GlanceImageService - glance_api_servers=192.168.206.130:9292 - - # NETWORK - network_manager=nova.network.manager.FlatDHCPManager - force_dhcp_release=True - dhcpbridge_flagfile=/etc/nova/nova.conf - firewall_driver=nova.virt.libvirt.firewall.IptablesFirewallDriver - # Change my_ip to match each host - my_ip=192.168.206.130 - public_interface=eth100 - vlan_interface=eth0 - flat_network_bridge=br100 - flat_interface=eth0 - fixed_range=192.168.100.0/24 - - # NOVNC CONSOLE - novncproxy_base_url=http://192.168.206.130:6080/vnc_auto.html - # Change vncserver_proxyclient_address and vncserver_listen to match each compute host - vncserver_proxyclient_address=192.168.206.130 - vncserver_listen=192.168.206.130 - - # AUTHENTICATION - auth_strategy=keystone - [keystone_authtoken] - auth_host = 127.0.0.1 - auth_port = 35357 - auth_protocol = http - admin_tenant_name = service - admin_user = nova - admin_password = nova - signing_dirname = /tmp/keystone-signing-nova - - * 'nova-manage version' to find out version of nova. The output will be something like '2013.1'. - diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index cf5c70b..0000000 --- a/requirements.txt +++ /dev/null @@ -1,13 +0,0 @@ -spur==0.3.5 -WTForms-JSON>=0.2.2 -gunicorn==18.0 -honcho==0.4.2 -jinja2==2.7 -lettuce>=0.2.19 -pymongo==2.6.1 -https://bitbucket.org/jstasiak/recordtype/get/default.tar.gz -paramiko==1.11.0 -oslo.config==1.2.1 -requests==1.2.0 -PyYAML==3.10 -six>=1.4.1 diff --git a/rubick/__init__.py b/rubick/__init__.py deleted file mode 100644 index 1aec8c1..0000000 --- a/rubick/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ - -if __name__ == '__main__': - from rubick.main import main - import sys - main(sys.argv[1:]) diff --git a/rubick/common.py b/rubick/common.py deleted file mode 100644 index f24cf08..0000000 --- a/rubick/common.py +++ /dev/null @@ -1,261 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -# implied. -# See the License for the specific language governing permissions and# -# limitations under the License. -import copy -import os.path - -from recordtype import recordtype - - -def find(l, predicate): - results = [x for x in l if predicate(x)] - return results[0] if len(results) > 0 else None - - -def index(l, predicate): - i = 0 - while i < len(l): - if predicate(l[i]): - return i - i += 1 - return -1 - - -def all_subclasses(klass): - subclasses = klass.__subclasses__() - for d in list(subclasses): - subclasses.extend(all_subclasses(d)) - return subclasses - - -def path_relative_to(path, base_path): - if not path.startswith('/'): - path = os.path.join(base_path, path) - - return path - - -class Version: - - def __init__(self, major, minor=0, maintenance=0): - "Create Version object by either passing 3 integers," - "one string or an another Version object" - if isinstance(major, str): - self.parts = [int(x) for x in major.split('.', 3)] - while len(self.parts) < 3: - self.parts.append(0) - - elif isinstance(major, Version): - self.parts = major.parts - else: - self.parts = [int(major), int(minor), int(maintenance)] - - @property - def major(self): - return self.parts[0] - - @major.setter - def major(self, value): - self.parts[0] = int(value) - - @property - def minor(self): - return self.parts[1] - - @minor.setter - def minor(self, value): - self.parts[1] = int(value) - - @property - def maintenance(self): - return self.parts[2] - - @maintenance.setter - def maintenance(self, value): - self.parts[2] = value - - def __str__(self): - return '.'.join([str(p) for p in self.parts]) - - def __repr__(self): - return '' % str(self) - - def __cmp__(self, other): - for i in range(0, 3): - x = self.parts[i] - other.parts[i] - if x != 0: - return -1 if x < 0 else 1 - return 0 - - def __lt__(self, other): - for i in range(0, 3): - x = self.parts[i] - other.parts[i] - if x != 0: - return True if x < 0 else False - return False - - def __le__(self, other): - for i in range(0, 3): - x = self.parts[i] - other.parts[i] - if x != 0: - return True if x < 0 else False - return True - - def __ne__(self, other): - for i in range(0, 3): - x = self.parts[i] - other.parts[i] - if x != 0: - return True - return False - - def __eq__(self, other): - for i in range(0, 3): - x = self.parts[i] - other.parts[i] - if x != 0: - return False - return True - - -class Mark(object): - - def __init__(self, source, line=0, column=0): - self.source = source - self.line = line - self.column = column - - def __eq__(self, other): - return ( - (self.source == other.source) and - (self.line == other.line) and - (self.column == other.column) - ) - - def __ne__(self, other): - return not self == other - - def merge(self, other): - return ( - Mark( - self.source, - self.line + - other.line, - self.column + - other.column) - ) - - def __repr__(self): - return '%s line %d column %d' % (self.source, self.line, self.column) - - -class Error: - - def __init__(self, message): - self.message = message - - def __repr__(self): - return ( - '<%s "%s">' % ( - str(self.__class__).split('.')[-1][:-2], - self.message) - ) - - def __str__(self): - return self.message - - -class Issue(object): - FATAL = 'FATAL' - ERROR = 'ERROR' - WARNING = 'WARNING' - INFO = 'INFO' - - def __init__(self, type, message): - self.type = type - self.message = message - - def __eq__(self, other): - if not isinstance(other, Issue): - return False - - return self.type == other.type and self.message == other.message - - def __ne__(self, other): - return not self == other - - def __repr__(self): - return ( - '<%s type=%s message=%s>' % ( - str(self.__class__).split('.')[-1][:-2], - self.type, - self.message) - ) - - def __str__(self): - return '[%s] %s' % (self.type, self.message) - - -class MarkedIssue(Issue): - - def __init__(self, type, message, mark): - super(MarkedIssue, self).__init__(type, message) - self.mark = mark - - def offset_by(self, base_mark): - other = copy.copy(self) - other.mark = base_mark.merge(self.mark) - return other - - def __eq__(self, other): - if not isinstance(other, MarkedIssue): - return False - - return super(MarkedIssue, self).__eq__(other) and self.mark == other.mark - - def __ne__(self, other): - return not self == other - - def __repr__(self): - return ( - '<%s type=%s message=%s mark=%s>' % ( - str(self.__class__).split('.')[-1][:-2], - self.type, - self.message, - self.mark) - ) - - def __str__(self): - return ( - super(MarkedIssue, self).__str__() + - (' (source "%s" line %d column %d)' % - (self.mark.source, self.mark.line + 1, self.mark.column + 1)) - ) - - -Rule = recordtype('Rule', ['name', 'description']) - - -class Inspection(object): - - @classmethod - def all_inspections(klass): - return [c for c in all_subclasses(klass)] - - @classmethod - def rules(klass): - if hasattr(klass, 'name') and hasattr(klass, 'description'): - return [Rule(klass.name, klass.description)] - else: - return [] - - def inspect(self, openstack): - pass diff --git a/rubick/config_formats/__init__.py b/rubick/config_formats/__init__.py deleted file mode 100644 index 4c70887..0000000 --- a/rubick/config_formats/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from rubick.config_formats.ini import IniConfigParser # noqa diff --git a/rubick/config_formats/common.py b/rubick/config_formats/common.py deleted file mode 100644 index 2d4849c..0000000 --- a/rubick/config_formats/common.py +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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 rubick.common import Issue, MarkedIssue - - -class ParseError(MarkedIssue): - - def __init__(self, message, mark): - super(ParseError, self).__init__(Issue.ERROR, message, mark) diff --git a/rubick/config_formats/ini.py b/rubick/config_formats/ini.py deleted file mode 100644 index 6362e37..0000000 --- a/rubick/config_formats/ini.py +++ /dev/null @@ -1,177 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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 re - -from six import StringIO - -from rubick.common import Mark -from rubick.config_model import ComponentConfig, ConfigSection, \ - ConfigSectionName, ConfigParameter, ConfigParameterName, \ - ConfigParameterValue, TextElement -from rubick.config_formats.common import ParseError - - -class IniConfigParser: - key_value_re = re.compile("^(\S+?)\s*([:=])\s*('.*'|\".*\"|.*)\s*$") - - def parse(self, name, base_mark, io): - if not hasattr(io, 'readlines'): - io = StringIO(io) - - def mark(line, column=0): - return base_mark.merge(Mark('', line, column)) - - errors = [] - current_section_name = ConfigSectionName(mark(0), mark(0), '') - current_param_name = None - current_param_value = None - current_param_delimiter = None - sections = [] - parameters = [] - - line_number = -1 - for line in io.readlines(): - line = line.rstrip() - - line_number += 1 - - if current_param_name \ - and (current_param_value.quotechar - or (line == '' or not line[0].isspace())): - param = ConfigParameter( - current_param_name.start_mark, - current_param_value.end_mark, - current_param_name, - current_param_value, - current_param_delimiter) - parameters.append(param) - - current_param_name = None - current_param_value = None - current_param_delimiter = None - - if line == '': - continue - - if line[0] in '#;': - continue - - if line[0].isspace(): - if current_param_name: - current_param_value.end_mark = mark(line_number, len(line)) - current_param_value.text += line.lstrip() - continue - else: - errors.append( - ParseError('Unexpected multiline value continuation', - mark(line_number))) - continue - - if line[0] == '[': - end_index = line.find(']') - if end_index == -1: - errors.append( - ParseError('Unclosed section', mark(line_number, - len(line)))) - - end_index = len(line) - while line[end_index - 1].isspace(): - end_index -= 1 - if end_index <= 1: - errors.append( - ParseError('Missing section name', - mark(line_number))) - continue - else: - i = end_index + 1 - while i < len(line): - if not line[i].isspace(): - errors.append( - ParseError('Extra chars after section name', - mark(line_number, i))) - break - i += 1 - - if current_section_name.text != '' or len(parameters) > 0: - section = ConfigSection( - current_section_name.start_mark, - mark(line_number), - current_section_name, - parameters) - sections.append(section) - parameters = [] - - current_section_name = ConfigSectionName( - mark(line_number, 0), - mark(line_number, end_index), - line[1:end_index] - ) - else: - m = self.key_value_re.match(line) - if m: - current_param_name = ConfigParameterName( - mark(line_number, m.start(1)), - mark(line_number, m.end(1)), - m.group(1) - ) - current_param_delimiter = TextElement( - mark(line_number, m.start(2)), - mark(line_number, m.end(2)), - m.group(2) - ) - - # Unquote value - value = m.group(3) - quotechar = None - if len(value) > 0 and (value[0] == value[-1] - and value[0] in "\"'"): - quotechar = value[0] - value = value[1:-1] - - current_param_value = ConfigParameterValue( - mark(line_number, m.start(3)), - mark(line_number, m.end(3)), - value, - quotechar=quotechar - ) - else: - errors.append( - ParseError('Syntax error in line "%s"' % - line, mark(line_number))) - - if current_param_name: - param = ConfigParameter( - current_param_name.start_mark, - current_param_value.end_mark, - current_param_name, - current_param_value, - current_param_delimiter) - parameters.append(param) - - if current_section_name.text != '' or len(parameters) > 0: - section = ConfigSection( - current_section_name.start_mark, - mark(line_number), - current_section_name, - parameters) - sections.append(section) - parameters = [] - - end_mark = base_mark - if len(sections) > 0: - end_mark = base_mark.merge(sections[-1].end_mark) - - config = ComponentConfig(base_mark, end_mark, name, sections, errors) - - return config diff --git a/rubick/config_formats/test_ini.py b/rubick/config_formats/test_ini.py deleted file mode 100644 index c069e1c..0000000 --- a/rubick/config_formats/test_ini.py +++ /dev/null @@ -1,248 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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 unittest - -from six import StringIO - -from rubick.common import Mark -from rubick.config_formats.ini import IniConfigParser - - -class IniConfigParserTests(unittest.TestCase): - - def setUp(self): - self.parser = IniConfigParser() - - def _strip_margin(self, content): - lines = content.split("\n") - if lines[0] == '' and lines[-1].strip() == '': - lines = lines[1:-1] - first_line = lines[0] - margin_size = 0 - while margin_size < len(first_line) \ - and first_line[margin_size].isspace(): - margin_size += 1 - - stripped_lines = [line[margin_size:] for line in lines] - - return "\n".join(stripped_lines) - - def parse(self, content, margin=False): - if margin: - content = self._strip_margin(content) - - return self.parser.parse('test.conf', Mark(''), content) - - def test_parsing(self): - config = self.parse("param1 = value1") - - self.assertEqual(0, len(config.errors)) - - self.assertParameter( - 'param1', - 'value1', - config.sections[0].parameters[0]) - self.assertEqual(1, len(config.sections[0].parameters)) - - def test_colon_as_delimiter(self): - c = self.parse('param1 : value1') - - self.assertEqual(0, len(c.errors)) - self.assertParameter('param1', 'value1', c.sections[0].parameters[0]) - - def test_use_colon_delimiter_if_it_comes_before_equals_sign(self): - c = self.parse('param1: value=123') - self.assertEqual(0, len(c.errors)) - self.assertParameter( - 'param1', - 'value=123', - c.sections[0].parameters[0]) - - def test_use_equals_delimiter_if_it_comes_before_colon(self): - c = self.parse('param1=value:123') - self.assertEqual(0, len(c.errors)) - self.assertParameter( - 'param1', - 'value:123', - c.sections[0].parameters[0]) - - def test_wrapping_value_with_single_quotes(self): - c = self.parse("param = 'foo bar'") - - self.assertEqual(0, len(c.errors)) - self.assertParameter('param', 'foo bar', c.sections[0].parameters[0]) - self.assertEqual("'", c.sections[0].parameters[0].value.quotechar) - - def test_wrapping_value_with_single_quotes_and_trailing_whitespace(self): - c = self.parse("param = 'foo bar' ") - - self.assertEqual(0, len(c.errors)) - self.assertParameter('param', 'foo bar', c.sections[0].parameters[0]) - - def test_wrapping_value_with_double_quotes(self): - c = self.parse("param = \"foo bar\"") - - self.assertEqual(0, len(c.errors)) - self.assertParameter('param', 'foo bar', c.sections[0].parameters[0]) - self.assertEqual('"', c.sections[0].parameters[0].value.quotechar) - - def test_wrapping_value_with_double_quotes_and_trailing_whitespace(self): - c = self.parse("param = \"foo bar\" ") - - self.assertEqual(0, len(c.errors)) - self.assertParameter('param', 'foo bar', c.sections[0].parameters[0]) - - def test_parsing_iolike_source(self): - c = self.parse(StringIO("param1 = value1")) - - self.assertEqual(0, len(c.errors)) - - self.assertParameter('param1', 'value1', c.sections[0].parameters[0]) - self.assertEqual(1, len(c.sections[0].parameters)) - - def test_default_section_name(self): - c = self.parse("param1 = value1") - - self.assertEqual('', c.sections[0].name.text) - - def test_parsing_with_section(self): - c = self.parse(""" - [section1] - param1 = value1 - """, margin=True) - - self.assertEqual(0, len(c.errors)) - self.assertEqual('section1', c.sections[0].name.text) - self.assertEqual(1, len(c.sections[0].parameters)) - - def test_parsing_with_same_section(self): - c = self.parse(""" - [section1] - param1 = value1 - param2 = value2 - """, margin=True) - - self.assertEqual(0, len(c.errors)) - self.assertEqual(2, len(c.sections[0].parameters)) - - def test_parsing_with_different_sections(self): - c = self.parse(""" - [section1] - param1 = value1 - [section2] - param2 = value2 - """, margin=True) - - self.assertEqual(0, len(c.errors)) - - self.assertEqual('section1', c.sections[0].name.text) - self.assertParameter('param1', 'value1', c.sections[0].parameters[0]) - self.assertEqual(1, len(c.sections[0].parameters)) - self.assertEqual('section2', c.sections[1].name.text) - self.assertParameter('param2', 'value2', c.sections[1].parameters[0]) - self.assertEqual(1, len(c.sections[1].parameters)) - - def test_whole_line_comments_starting_with_hash(self): - c = self.parse("#param=value") - self.assertEqual(0, len(c.errors)) - self.assertEqual(0, len(c.sections)) - - def test_whole_line_comments_starting_with_semicolon(self): - c = self.parse(";param=value") - self.assertEqual(0, len(c.errors)) - self.assertEqual(0, len(c.sections)) - - def test_hash_in_value_is_part_of_the_value(self): - c = self.parse("param=value#123") - self.assertEqual(0, len(c.errors)) - self.assertParameter("param", "value#123", c.sections[0].parameters[0]) - - def test_multiline_value(self): - c = self.parse(""" - param1 = line1 - line2 - """, margin=True) - - self.assertEqual(0, len(c.errors)) - self.assertParameter( - 'param1', - 'line1line2', - c.sections[0].parameters[0]) - - def test_multiline_value_finished_by_other_parameter(self): - c = self.parse(""" - param1 = foo - bar - param2 = baz - """, margin=True) - - self.assertEqual(0, len(c.errors)) - self.assertParameter('param1', 'foobar', c.sections[0].parameters[0]) - - def test_multiline_value_finished_by_empty_line(self): - c = self.parse(""" - param1 = foo - bar - - param2 = baz - """, margin=True) - - self.assertEqual(0, len(c.errors)) - self.assertParameter('param1', 'foobar', c.sections[0].parameters[0]) - - def test_unclosed_section_causes_error(self): - c = self.parse("[section1\nparam1=123") - self.assertEqual(1, len(c.errors)) - - def test_missing_equals_sign_or_colon_causes_error(self): - c = self.parse("param1 value1") - self.assertEqual(1, len(c.errors)) - - def test_spaces_in_key_causes_error(self): - c = self.parse("param 1 = value1") - self.assertEqual(1, len(c.errors)) - - def test_returning_multiple_errors(self): - c = self.parse("[unclosed section\npararm 1 = value1") - self.assertEqual(2, len(c.errors)) - - def test_errors_doesnt_affect_valid_parameters(self): - c = self.parse('param1 value1\nparam2 = value2') - self.assertEqual(1, len(c.errors)) - self.assertParameter('param2', 'value2', c.sections[0].parameters[0]) - - def _getattr(self, o, name): - if name.find('.') != -1: - parts = name.split('.') - o = getattr(o, parts[0]) - if o is None: - return None - return self._getattr(o, '.'.join(parts[1:])) - else: - return getattr(o, name) - - def assertAttributes(self, attribute_values, subject): - for attr, expected in attribute_values.items(): - actual = self._getattr(subject, attr) - self.assertEqual( - expected, actual, - "%s expected to have %s = %s, but the value was %s" % - (subject, attr, expected, actual)) - - def assertParameter(self, name, value, o): - self.assertAttributes({'name.text': name, 'value.text': value}, o) - - -if __name__ == '__main__': - unittest.main() diff --git a/rubick/config_model.py b/rubick/config_model.py deleted file mode 100644 index 9efab21..0000000 --- a/rubick/config_model.py +++ /dev/null @@ -1,390 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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 string - -from rubick.schema import TypeValidatorRegistry, InvalidValueError - - -class ConfigurationSection(object): - - def __init__(self, config, section): - super(ConfigurationSection, self).__init__() - self.config = config - self.section = section - - def _combine_names(self, section, param): - if section == 'DEFAULT': - return param - - return '%s.%s' % (section, param) - - def get(self, name, *args, **kwargs): - return self.config.get( - self._combine_names(self.section, name), *args, **kwargs) - - def set(self, name, *args, **kwargs): - self.config.set( - self._combine_names(self.section, name), *args, **kwargs) - - def set_default(self, name, *args, **kwargs): - self.config.set_default( - self._combine_names(self.section, name), *args, **kwargs) - - def set_cli(self, name, *args, **kwargs): - self.config.set_cli( - self._combine_names(self.section, name), *args, **kwargs) - - def set_env(self, name, *args, **kwargs): - self.config.set_env( - self._combine_names(self.section, name), *args, **kwargs) - - def contains(self, name, *args, **kwargs): - return self.config.contains( - self._combine_names(self.section, name), *args, **kwargs) - - def is_default(self, name, *args, **kwargs): - return self.config.is_default( - self._combine_names(self.section, name), *args, **kwargs) - - def __getitem__(self, key): - return self.config.get(self._combine_names(self.section, key)) - - def __setitem__(self, key, value): - return self.config.set(self._combine_names(self.section, key), value) - - def __contains__(self, key): - return self.config.contains(self._combine_names(self.section, key)) - - def keys(self): - return self.config.keys(self.section) - - def items(self, *args, **kwargs): - return self.config.items(self.section, *args, **kwargs) - - -class ConfigurationWrapper(object): - - def __init__(self, config, state): - super(ConfigurationWrapper, self).__init__() - self.config = config - self.state = state - - def __getitem__(self, key): - if key in self.state: - return '' - - return self.config.get(key, _state=self.state) - - -class Configuration(object): - - def __init__(self, schema=None): - super(Configuration, self).__init__() - self._defaults = dict() - self._normal = dict() - self._cli = dict() - self._env = dict() - self._cache = dict() - self.schema = schema - - def _normalize_name(self, name): - if name.find('.') == -1: - section = 'DEFAULT' - else: - section, name = name.split('.', 1) - - return (section, name) - - def _combine_names(self, section, param): - if section == 'DEFAULT': - return param - - return '%s.%s' % (section, param) - - def get(self, fullname, default=None, raw=False, _state=[]): - if not raw and fullname in self._cache: - return self._cache[fullname] - - section, name = self._normalize_name(fullname) - - if section in self._cli and name in self._cli[section]: - value = self._cli[section][name] - elif section in self._env and name in self._env[section]: - value = self._env[section][name] - elif section in self._normal and name in self._normal[section]: - value = self._normal[section][name] - elif section in self._defaults and name in self._defaults[section]: - value = self._defaults[section][name] - else: - value = default - - if not isinstance(value, str): - return value - - if raw: - return value - - tmpl = string.Template(value) - value = tmpl.safe_substitute( - ConfigurationWrapper(self, _state + [name])) - - if self.schema: - param_schema = self.schema.get_parameter(name, section=section) - - if param_schema: - type_validator = TypeValidatorRegistry.get_validator( - param_schema.type) - type_validation_result = type_validator.validate(value, **param_schema.type_args) - if not isinstance(type_validation_result, InvalidValueError): - value = type_validation_result - - self._cache[fullname] = value - - return value - - def validate(self, fullname): - if not self.schema: - return None - - section, name = self._normalize_name(fullname) - - value = self.get(fullname, raw=True) - - tmpl = string.Template(value) - value = tmpl.safe_substitute( - ConfigurationWrapper(self, [name])) - - param_schema = self.schema.get_parameter(name, section=section) - - if not param_schema: - return None - - type_validator = TypeValidatorRegistry.get_validator( - param_schema.type) - type_validation_result = type_validator.validate(value, **param_schema.type_args) - if not isinstance(type_validation_result, InvalidValueError): - return None - - return type_validation_result - - def contains(self, name, ignoreDefault=False): - section, name = self._normalize_name(name) - - if section in self._normal and name in self._normal[section]: - return True - - if section in self._cli and name in self._cli[section]: - return True - - if section in self._env and name in self._env[section]: - return True - - if (not ignoreDefault and section in self._defaults and - name in self._defaults[section]): - return True - - return False - - def is_default(self, name): - section, name = self._normalize_name(name) - - return ( - not (section in self._normal and name in self._normal[section]) and - not (section in self._cli and name in self._cli[section]) and - not (section in self._env and name in self._env[section]) and - (section in self._defaults and name in self._defaults[section]) - ) - - def set_env(self, fullname, value): - section, name = self._normalize_name(fullname) - - self._env.setdefault(section, {})[name] = value - - self._invalidate_cache(fullname) - - def set_cli(self, fullname, value): - section, name = self._normalize_name(fullname) - - self._cli.setdefault(section, {})[name] = value - - self._invalidate_cache(fullname) - - def set_default(self, fullname, value): - section, name = self._normalize_name(fullname) - - self._defaults.setdefault(section, {})[name] = value - - self._invalidate_cache(fullname) - - def set(self, fullname, value): - section, name = self._normalize_name(fullname) - - self._normal.setdefault(section, {})[name] = value - - self._invalidate_cache(fullname) - - def _invalidate_cache(self, fullname): - # We need to invalidate not only value of given parameter - # but also values that depend on that parameter - # Since this is hard, we'll just invalidate all cached values - self._cache = dict() - - def section(self, section): - return ConfigurationSection(self, section) - - def __getitem__(self, key): - return self.get(key) - - def __setitem__(self, key, value): - self.set(key, value) - - def __contains__(self, section): - return ((section in self._defaults) or - (section in self._cli) or - (section in self._env) or - (section in self._normal)) - - def keys(self, section=None): - if section: - names = set() - for param in self._defaults.get(section, {}).keys(): - names.add(param) - for param in self._normal.get(section, {}).keys(): - names.add(param) - for param in self._cli.get(section, {}).keys(): - names.add(param) - for param in self._env.get(section, {}).keys(): - names.add(param) - - return list(names) - else: - sections = set() - for section in self._defaults.keys(): - sections.add(section) - - for section in self._normal.keys(): - sections.add(section) - - for section in self._cli.keys(): - sections.add(section) - - for section in self._env.keys(): - sections.add(section) - - return list(sections) - - def items(self, section=None): - if section: - return ( - [(name, self.get(self._combine_names(section, name))) - for name in self.keys(section)] - ) - else: - return ( - [(name, ConfigurationSection(self, name)) - for name in self.keys()] - ) - - -class Element(object): - - def __init__(self, start_mark, end_mark): - self.start_mark = start_mark - self.end_mark = end_mark - - def __eq__(self, other): - return ( - (self.__class__ == other.__class__) - and (self.start_mark == other.start_mark) - and (self.end_mark == other.end_mark) - ) - - def __ne__(self, other): - return not self == other - - -class ComponentConfig(Element): - - def __init__(self, start_mark, end_mark, name, sections=[], errors=[]): - super(ComponentConfig, self).__init__(start_mark, end_mark) - self.name = name - self.sections = sections - for section in self.sections: - section.parent = self - - self.errors = errors - - -class TextElement(Element): - - def __init__(self, start_mark, end_mark, text): - super(TextElement, self).__init__(start_mark, end_mark) - self.text = text - - -class ConfigSection(Element): - - def __init__(self, start_mark, end_mark, name, parameters): - super(ConfigSection, self).__init__(start_mark, end_mark) - self.name = name - self.parameters = parameters - for parameter in self.parameters: - parameter.parent = self - - -class ConfigSectionName(TextElement): - pass - - -class ConfigParameter(Element): - - def __init__(self, start_mark, end_mark, name, value, delimiter): - super(ConfigParameter, self).__init__(start_mark, end_mark) - self.name = name - self.name.parent = self - - self.value = value - self.value.parent = self - - self.delimiter = delimiter - self.delimiter.parent = self - - def __eq__(self, other): - return ( - (self.name.text == other.name.text) and ( - self.value.text == other.value.text) - ) - - def __ne__(self, other): - return not self == other - - def __repr__(self): - return ( - "" % ( - self.name.text, - self.value.text, - self.delimiter.text) - ) - - -class ConfigParameterName(TextElement): - pass - - -class ConfigParameterValue(TextElement): - - def __init__(self, start_mark, end_mark, text, value=None, quotechar=None): - super(ConfigParameterValue, self).__init__(start_mark, end_mark, text) - self.value = value - self.quotechar = quotechar diff --git a/rubick/database.py b/rubick/database.py deleted file mode 100644 index 5e578eb..0000000 --- a/rubick/database.py +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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 bson.objectid import ObjectId -from copy import copy -import os -from pymongo import MongoClient -assert ObjectId -from recordtype import recordtype - - -def connect_to_db(): - mongo_url = os.environ.get("MONGODB_URI") or "mongodb://localhost/rubick" - client = MongoClient(mongo_url) - return client[mongo_url.split('/')[-1]] - - -def get_db(): - db = connect_to_db() - return db - - -class Cluster(recordtype('Cluster', - [('id', str(ObjectId())), 'name', 'description', - 'status', 'nodes', 'private_key', 'data'], - default=None)): - @classmethod - def from_doc(klass, doc): - doc['id'] = str(doc['_id']) - del doc['_id'] - return Cluster(**doc) - - def as_doc(self): - doc = copy(self._asdict()) - doc['_id'] = ObjectId(doc['id']) - del doc['id'] - return doc - - def for_json(self): - return copy(self._asdict()) - - -class RuleGroup: - VALIDITY = 'validity' - HA = 'high-availability' - BEST_PRACTICES = 'best-practices' - - all = [VALIDITY, HA, BEST_PRACTICES] diff --git a/rubick/discovery.py b/rubick/discovery.py deleted file mode 100644 index cebf99b..0000000 --- a/rubick/discovery.py +++ /dev/null @@ -1,1038 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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 collections import deque -import logging -import os.path -import re -from recordtype import recordtype -import shlex -import spur -import stat -import tempfile - -import paramiko -from paramiko.dsskey import DSSKey -from paramiko.rsakey import RSAKey -from paramiko.ssh_exception import SSHException -from six import StringIO - -from rubick.common import index, find, all_subclasses -from rubick.exceptions import ValidatorException -import rubick.model as model - - -def parse_nodes_info(nodes, password=None, private_key=None): - result = [] - for node in nodes: - m = parse_nodes_info.connection_re.match(node) - if not m: - continue - - username = m.group(1) or 'root' - host = m.group(2) - port = int(m.group(3) or '22') - - result.append( - dict(host=host, - port=port, - username=username, - password=password, - private_key=private_key)) - - return result - -parse_nodes_info.connection_re = re.compile('(?:(\w+)@)?([^:]+)(?::(\d+))?') - - -def parse_private_key(private_key): - try: - return RSAKey.from_private_key(StringIO(private_key)) - except SSHException: - try: - return DSSKey.from_private_key(StringIO(private_key)) - except SSHException: - return None - - -# SshShell wrapper to add support for sock parameter (for proxy command) -class SshShell(spur.SshShell): - - def __init__(self, - hostname, - username=None, - password=None, - port=22, - private_key=None, - connect_timeout=None, - missing_host_key=None, - sock=None): - super(SshShell, self).__init__(hostname=hostname, - username=username, - password=password, - port=port, - connect_timeout=connect_timeout, - missing_host_key=missing_host_key) - - self._pkey = parse_private_key(private_key) - if not self._pkey: - raise ValidatorException("Unknown private key format") - - self._sock = sock - - def _connect_ssh(self): - if self._client is None: - if self._closed: - raise RuntimeError("Shell is closed") - - client = paramiko.SSHClient() - client.load_system_host_keys() - client.set_missing_host_key_policy(self._missing_host_key) - client.connect( - hostname=self._hostname, - port=self._port, - username=self._username, - password=self._password, - pkey=self._pkey, - timeout=self._connect_timeout, - sock=self._sock) - - self._client = client - - return self._client - - -class NodeClient(object): - logger = logging.getLogger('rubick.ssh') - - def __init__(self, host, port=22, username='root', password=None, - private_key=None, proxy_command=None): - super(NodeClient, self).__init__() - self.host = host - self.use_sudo = (username != 'root') - - if proxy_command and proxy_command.find('%%PATH_TO_KEY%%') != -1: - self._pkey_file = tempfile.NamedTemporaryFile(suffix='.key') - self._pkey_file.write(private_key) - self._pkey_file.flush() - - proxy_command = proxy_command.replace('%%PATH_TO_KEY%%', - self._pkey_file.name) - - sock = paramiko.ProxyCommand(proxy_command) if proxy_command else None - - self.shell = SshShell( - hostname=host, - port=port, - username=username, - password=password, - private_key=private_key, - missing_host_key=spur.ssh.MissingHostKey.accept, - sock=sock) - - def run(self, command, *args, **kwargs): - if self.use_sudo: - command = ['sudo'] + command - result = self.shell.run(command, allow_error=True, *args, **kwargs) - self.logger.debug('Executed command: %s, ' - 'result code %d, output:\n%s' % (' '.join(command), - result.return_code, - result.output)) - return result - - def open(self, path, mode='r'): - self.logger.debug('Opening file %s mode %s' % (path, mode)) - return self.shell.open(path, mode) - - -ProcessInfo = recordtype('ProcessInfo', ['pid', 'command']) - - -class ExtendedNodeClient(object): - - def __init__(self, client): - super(ExtendedNodeClient, self).__init__() - self._client = client - - def run(self, command, *args, **kwargs): - return self._client.run(command, *args, **kwargs) - - def open(self, path, mode='r'): - return self._client.open(path, mode) - - def __getattr__(self, name): - return getattr(self._client, name) - - def get_processes(self, reload=False): - if not hasattr(self, '_processes') or reload: - self._processes = get_processes(self._client) - - return self._processes - - def get_listen_sockets(self, reload=False): - if not hasattr(self, '_listen_sockets') or reload: - self._listen_sockets = get_listen_sockets(self._client) - - return self._listen_sockets - - def get_host_id(self, reload=False): - if not hasattr(self, '_host_id') or reload: - self._host_id = get_host_id(self._client) - - return self._host_id - - -def get_processes(client): - if hasattr(client, 'get_processes'): - return client.get_processes() - - lines = client.run(['ps', '-Ao', 'pid,cmd', - '--no-headers']).output.split("\n") - results = [] - for line in lines: - line = line.strip() - if line == '': - continue - - parts = line.split() - - pid = int(parts.pop(0)) - command = ' '.join(parts) - results.append(ProcessInfo(pid=pid, command=command)) - - return results - - -def get_process_by_pid(client, pid): - return find(get_processes(client), lambda p: p.pid == pid) - - -def get_listen_sockets(client): - if hasattr(client, 'get_listen_sockets'): - return client.get_listen_sockets() - - result = client.run(['lsof', '-i', '-s', 'TCP:LISTEN', '-nP', '-Fn']) - if result.return_code != 0: - return {} - - host_addresses = get_host_network_addresses(client) - sockets = {} - - current_pid = 0 - for line in result.output.split("\n"): - if line.startswith('p'): - current_pid = int(line[1:]) - sockets.setdefault(current_pid, []) - elif line.startswith('n'): - host, port = line[1:].split(':', 1) - if host == '*': - for address in host_addresses: - sockets[current_pid].append((address, port)) - else: - sockets[current_pid].append((host, port)) - - return sockets - - -def get_process_listen_sockets(client, pid): - sockets_per_process = get_listen_sockets(client) - if pid not in sockets_per_process: - return [] - - return sockets_per_process[pid] - - -def find_process_by_name(client, name): - processes = get_processes(client) - for process in processes: - args = shlex.split(process.command) - if os.path.basename(args[0]) == name: - return process - - return None - - -def find_process(client, pid=None, name=None, sockets=None): - if pid: - return find(get_processes(client), lambda p: p.pid == pid) - elif sockets: - current_sockets = get_listen_sockets(client) - x = find(current_sockets.items(), lambda x: sockets[0] in x[1]) - if not x: - return None - - return get_process_by_pid(x[0]) - elif name: - processes = get_processes(client) - for process in processes: - args = shlex.split(process.command) - if os.path.basename(args[0]) == name: - return process - - return None - - -def find_python_process(client, name): - processes = get_processes(client) - for process in processes: - args = shlex.split(process.command) - if len(args) > 0 and (args[0] == name or args[0].endswith('/' + name)): - return process - if len(args) > 1 and find_python_process.python_re.match(args[0]) \ - and (args[1] == name or args[1].endswith('/' + name)): - return process - - return None - -find_python_process.python_re = re.compile('(/?([^/]*/)*)python[0-9.]*') - - -def find_python_package_version(client, package): - result = client.run( - ['python', '-c', - 'import pkg_resources; version = pkg_resources' - '.get_provider(pkg_resources.Requirement.parse("%s"))' - '.version; print(version)' % - package]) - - s = result.output.strip() - parts = [] - for p in s.split('.'): - if not p[0].isdigit(): - break - - parts.append(p) - - version = '.'.join(parts) - - return version - - -def get_host_id(client): - if hasattr(client, 'get_host_id'): - return client.get_host_id() - - ether_re = re.compile('link/ether (([0-9a-f]{2}:){5}([0-9a-f]{2})) ') - result = client.run(['bash', '-c', 'ip link | grep "link/ether "']) - macs = [] - for match in ether_re.finditer(result.output): - macs.append(match.group(1).replace(':', '')) - return ''.join(macs) - - -def get_host_network_addresses(client): - ipaddr_re = re.compile('inet (\d+\.\d+\.\d+\.\d+)/\d+') - addresses = [] - result = client.run(['bash', '-c', 'ip address list | grep "inet "']) - for match in ipaddr_re.finditer(result.output): - addresses.append(match.group(1)) - return addresses - - -def permissions_string_to_mode(s): - mode = 0 - - if s[0] == 'd': - mode |= stat.S_IFDIR - elif s[0] == 's': - mode |= stat.S_IFSOCK - elif s[0] == 'l': - mode |= stat.S_IFLNK - else: - mode |= stat.S_IFREG - - if s[1] == 'r': - mode |= stat.S_IRUSR - if s[2] == 'w': - mode |= stat.S_IWUSR - if s[3] == 'x': - mode |= stat.S_IXUSR - if s[4] == 'r': - mode |= stat.S_IRGRP - if s[5] == 'w': - mode |= stat.S_IWGRP - if s[6] == 'x': - mode |= stat.S_IXGRP - if s[7] == 'r': - mode |= stat.S_IROTH - if s[8] == 'w': - mode |= stat.S_IWOTH - if s[9] == 'x': - mode |= stat.S_IXOTH - - return mode - - -def collect_process(client, process_info): - result = client.run(['readlink', '/proc/%d/cwd' % process_info.pid]) - cwd = result.output.strip() - - process = model.ProcessResource( - pid=process_info.pid, - cmdline=process_info.command, - cwd=cwd) - process.listen_sockets = get_process_listen_sockets(client, process.pid) - - return process - - -def collect_file(driver, client, path, searchpath=[]): - "collect_file(driver, client, path, searchpath=[]) - collect file resource." - "path can be absolute path, absolute wildcard or relative path + searchpath" - def _collect_file(path): - ls = client.run(['ls', '-ld', '--time-style=full-iso', path]) - if ls.return_code != 0: - return None - - line = ls.output.split("\n")[0] - perm, links, owner, group, size, date, time, timezone, name = \ - line.split() - permissions = permissions_string_to_mode(perm) - - with client.open(path) as f: - contents = f.read() - - r = model.FileResource(path, contents, owner, group, permissions) - r.host_id = get_host_id(client) - return r - - if not path: - return None - - if not os.path.isabs(path): - for base_path in searchpath: - f = _collect_file(os.path.join(base_path, path)) - if f: - return f - - return None - else: - ls = client.run(['ls', path]) - if ls.return_code != 0: - return None - - files = [] - for path in ls.output.split("\n"): - f = _collect_file(path) - if f: - files.append(f) - - if len(files) == 1: - return files[0] - - return files - - return None - - -def collect_directory(driver, client, path): - if not path: - return None - - if not path.endswith('/'): - path += '/' - - ls = client.run(['ls', '-ld', '--time-style=full-iso', path]) - if ls.return_code != 0: - return None - - line = ls.output.split("\n")[0] - perm, links, owner, group, size, date, time, timezone, name = line.split() - permissions = permissions_string_to_mode(perm) - - r = model.DirectoryResource(path, owner, group, permissions) - r.host_id = get_host_id(client) - return r - - -def collect_component_configs(driver, client, component, - command, default_config=None): - config_files = [] - - args = shlex.split(command)[1:] - - p = index(args, lambda s: s == '--config-file') - if p != -1 and p + 1 < len(args): - config_path = args[p + 1] - else: - config_path = default_config - - if config_path: - r = driver.discover('file', client.host, path=config_path) - if r: - config_files.append(r) - - p = index(args, lambda s: s == '--config-dir') - if p != -1 and p + 1 < len(args): - files = driver.discover('file', client.host, path='%s/*.conf' % args[p + 1]) - if files: - if not isinstance(files, list): - files = [files] - - config_files.extend(files) - - component.config_files = config_files - - for i, arg in enumerate(args): - if arg.startswith('--'): - name = arg[2:] - if '=' in name: - name, value = name.split('=', 1) - elif i + 1 < len(args): - value = args[i + 1] - i += 1 - else: - continue - - component.config.set_cli(name, value) - - -# Marker class -class BaseDiscovery(object): - - def __init__(self): - self.items = [] - - -class HostDiscovery(BaseDiscovery): - item_type = 'host' - - def discover(self, driver, host, **data): - item = find(self.items, lambda h: host in h.network_addresses) - if item: - return item - - client = driver.client(host) - - hostname = client.run(['hostname']).output.strip() - - item = model.HostResource(name=hostname) - item.id = get_host_id(client) - item.network_addresses = get_host_network_addresses(client) - - process_sockets = get_listen_sockets(client) - - # Service detection part - process = find_python_process(client, 'keystone-all') - if process: - driver.enqueue( - 'keystone', host=host, pid=process.pid, - sockets=process_sockets.get(process.pid, [])) - - for service in [ - 'nova-api', 'nova-volume', 'nova-scheduler', - 'glance-api', 'glance-registry', - 'cinder-api', 'cinder-volume', 'cinder-scheduler', - 'neutron-server', 'neutron-dhcp-agent', 'neutron-l3-agent', - 'neutron-metadata-agent', 'neutron-openvswitch-agent', - 'swift-proxy-server', 'swift-container-server', - 'swift-account-server', 'swift-object-server' - ]: - process = find_python_process(client, service) - if not process: - continue - - driver.enqueue( - service, host=host, pid=process.pid, - sockets=process_sockets.get(process.pid, [])) - - for service in ['mysql', 'rabbitmq']: - process = find_process(client, name=service) - if not process: - continue - - driver.enqueue( - service, host=host, pid=process.pid, - sockets=process_sockets.get(process.pid, [])) - - self.items.append(item) - - return item - - -class FileDiscovery(BaseDiscovery): - item_type = 'file' - - def discover(self, driver, host, path=None, **data): - client = driver.client(host) - host_id = get_host_id(client) - - item = find(self.items, - lambda f: f.path == path and f.host_id == host_id) - if item: - return item - - item = collect_file(driver, client, path) - if not item: - return None - - self.items.append(item) - - driver.discover('directory', host, path=os.path.dirname(item.path)) - - return item - - -class DirectoryDiscovery(BaseDiscovery): - item_type = 'directory' - - logger = logging.getLogger('rubick.discovery.directory') - - def discover(self, driver, host, path=None, withBaseDirs=True, **data): - client = driver.client(host) - host_id = get_host_id(client) - - item = find(self.items, - lambda f: f.path == path and f.host_id == host_id) - if item: - return item - - self.logger.debug('Discovering directory %s' % path) - - if path == '/': - return None - - item = collect_directory(driver, client, path) - if not item: - return None - - self.items.append(item) - - if withBaseDirs: - path = os.path.dirname(path) - while path != '/': - self.discover(driver, host, path, withBaseDirs=False) - path = os.path.dirname(path) - - return item - - -class ServiceDiscovery(BaseDiscovery): - - def find_item(self, driver, host, **data): - if 'sockets' in data: - item = find(self.items, - lambda s: data['sockets'] == s.process.listen_sockets) - elif 'port' in data: - item = find(self.items, - lambda s: (host, data['port']) in s.process.listen_sockets) - else: - client = driver.client(host) - host_id = client.get_host_id() - item = find(self.items, lambda s: host_id == s.host_id) - - return item is not None - - -class OpenstackComponentDiscovery(ServiceDiscovery): - - def __init__(self): - super(OpenstackComponentDiscovery, self).__init__() - assert self.item_type - if not hasattr(self, 'python_process_name'): - self.python_process_name = self.item_type - if not hasattr(self, 'project'): - self.project = self.item_type.split('-')[0] - if not hasattr(self, 'model_class'): - class_name = ''.join([p.capitalize() - for p in self.item_type.split('-') - ]) + 'Component' - self.model_class = getattr(model, class_name) - if not hasattr(self, 'default_config_path'): - self.default_config_path = os.path.join('/etc', self.project, - self.project + '.conf') - - def discover(self, driver, host, **data): - item = self.find_item(driver, host, **data) - if item: - return item - - client = driver.client(host) - - process = find_python_process(client, self.python_process_name) - if not process: - return None - - service = self.model_class() - service.host_id = get_host_id(client) - - service.process = collect_process(client, process) - - service.version = find_python_package_version(client, self.project) - - collect_component_configs( - driver, client, service, process.command, - default_config=self.default_config_path) - - searchpaths = [ - service.process.cwd, - os.path.join('/etc', self.project) - ] - - if service.config and service.config.schema: - for param in service.config.schema: - if param.type == 'file': - path = service.config[param.name] - if path and path != '': - driver.enqueue('file', host=host, path=path, - searchpath=searchpaths) - elif param.type == 'directory': - path = service.config[param.name] - if path and path != '': - driver.enqueue('directory', host=host, path=path) - - self.items.append(service) - - return service - - -class KeystoneDiscovery(OpenstackComponentDiscovery): - item_type = 'keystone' - - python_process_name = 'keystone-all' - - def discover(self, driver, host, **data): - item = self.find_item(driver, host, **data) - if item: - return item - - keystone = super(KeystoneDiscovery, self).discover(driver, host, **data) - if not keystone: - return None - - client = driver.client(host) - - process = find_python_process(client, 'keystone-all') - if not process: - return None - - token = keystone.config['admin_token'] - host = keystone.config['bind_host'] - if host == '0.0.0.0': - host = '127.0.0.1' - port = int(keystone.config['admin_port']) - - keystone_env = { - 'OS_SERVICE_TOKEN': token, - 'OS_SERVICE_ENDPOINT': 'http://%s:%d/v2.0' % (host, port) - } - - def db(command): - return self._get_keystone_db_data(client, command, - env=keystone_env) - - keystone.db = dict() - keystone.db['tenants'] = db('tenant-list') - keystone.db['users'] = db('user-list') - keystone.db['services'] = db('service-list') - keystone.db['endpoints'] = db('endpoint-list') - - return keystone - - def _get_keystone_db_data(self, client, command, env={}): - result = client.run(['keystone', command], update_env=env) - if result.return_code != 0: - return [] - - lines = result.output.strip().split("\n") - - columns = [] - last_pos = 0 - l = lines[0] - while True: - pos = l.find('+', last_pos + 1) - if pos == -1: - break - - columns.append({'start': last_pos + 1, 'end': pos - 1}) - - last_pos = pos - - l = lines[1] - for c in columns: - c['name'] = l[c['start']:c['end']].strip() - - data = [] - for l in lines[3:-1]: - d = dict() - for c in columns: - d[c['name']] = l[c['start']:c['end']].strip() - - data.append(d) - - return data - - -class NovaApiDiscovery(OpenstackComponentDiscovery): - item_type = 'nova-api' - - -class NovaComputeDiscovery(OpenstackComponentDiscovery): - item_type = 'nova-compute' - - -class NovaSchedulerDiscovery(OpenstackComponentDiscovery): - item_type = 'nova-scheduler' - - -class GlanceApiDiscovery(OpenstackComponentDiscovery): - item_type = 'glance-api' - - -class GlanceRegistryDiscovery(OpenstackComponentDiscovery): - item_type = 'glance-registry' - - -class CinderApiDiscovery(OpenstackComponentDiscovery): - item_type = 'cinder-api' - - -class CinderVolumeDiscovery(OpenstackComponentDiscovery): - item_type = 'cinder-volume' - - -class CinderSchedulerDiscovery(OpenstackComponentDiscovery): - item_type = 'cinder-scheduler' - - -class MysqlDiscovery(ServiceDiscovery): - item_type = 'mysql' - - def discover(self, driver, host, **data): - item = self.find_item(driver, host, **data) - if item: - return item - - client = driver.client(host) - - process = find_process(client, name='mysqld') - if not process: - return None - - mysqld_version_re = re.compile('mysqld\s+Ver\s(\S+)\s') - - mysql = model.MysqlComponent() - mysql.host_id = get_host_id(client) - - mysql.process = collect_process(client, process) - - version_result = client.run(['mysqld', '--version']) - m = mysqld_version_re.match(version_result.output) - mysql.version = m.group(1) if m else 'unknown' - - mysql.config_files = [] - config_locations_result = client.run( - ['bash', '-c', - 'mysqld --help --verbose ' - '| grep "Default options are read from" -A 1']) - config_locations = config_locations_result.output\ - .strip().split("\n")[-1].split() - for path in config_locations: - f = driver.discover('file', host, path=path) - if f: - mysql.config_files.append(f) - - self.items.append(mysql) - - return mysql - - -class RabbitmqDiscovery(ServiceDiscovery): - item_type = 'rabbitmq' - - def discover(self, driver, host, **data): - item = self.find_item(driver, host, **data) - if item: - return item - - client = driver.client(host) - - process = find_process(client, name='beam.smp') - if not process: - process = find_process(client, name='beam') - if not process: - return None - - if process.command.find('rabbit') == -1: - return None - - rabbitmq = model.RabbitMqComponent() - rabbitmq.host_id = get_host_id(client) - - rabbitmq.process = collect_process(client, process) - - rabbitmq.version = 'unknown' - - env_file = '/etc/rabbitmq/rabbitmq-env.conf' - env_vars = {} - result = client.run(['bash', '-c', 'source %s && set' % env_file]) - if result.return_code == 0: - lines = result.output.split("\n") - env_vars = dict((k, v) for k, v in lines.split('=', 1)) - - rabbitmq_env_vars = \ - dict((key.replace('RABBITMQ_', ''), value) - for key, value in env_vars if key.startswith('RABBITMQ_')) - - for key, value in rabbitmq_env_vars: - rabbitmq.config.set_env(key, value) - - args = shlex.split(process.command) - for i, s in enumerate(args): - if s == '-rabbit' and i + 2 <= len(args): - rabbitmq.config.set_cli(args[i + 1], args[i + 2]) - - self.items.append(rabbitmq) - - return rabbitmq - - -class SwiftProxyServerDiscovery(OpenstackComponentDiscovery): - item_type = 'swift-proxy-server' - - -class SwiftContainerServerDiscovery(OpenstackComponentDiscovery): - item_type = 'swift-container-server' - default_config_path = '/etc/swift/container-server/1.conf' - - -class SwiftAccountServerDiscovery(OpenstackComponentDiscovery): - item_type = 'swift-account-server' - default_config_path = '/etc/swift/account-server/1.conf' - - -class SwiftObjectServerDiscovery(OpenstackComponentDiscovery): - item_type = 'swift-object-server' - default_config_path = '/etc/swift/object-server/1.conf' - - -class NeutronServerDiscovery(OpenstackComponentDiscovery): - item_type = 'neutron-server' - - -class NeutronDhcpAgentDiscovery(OpenstackComponentDiscovery): - item_type = 'neutron-dhcp-agent' - default_config_path = '/etc/neutron/dhcp_agent.ini' - - -class NeutronL3AgentDiscovery(OpenstackComponentDiscovery): - item_type = 'neutron-l3-agent' - default_config_path = '/etc/neutron/l3_agent.ini' - - -class NeutronMetadataAgentDiscovery(OpenstackComponentDiscovery): - item_type = 'neutron-metadata-agent' - default_config_path = '/etc/neutron/metadata_agent.ini' - - -class NeutronOpenvswitchAgentDiscovery(OpenstackComponentDiscovery): - item_type = 'neutron-openvswitch-agent' - default_config_path = '/etc/neutron/plugins/ml2/ml2_conf.ini' - - -class DiscoveryDriver(object): - Task = recordtype('Task', ['type', 'host', 'data']) - - logger = logging.getLogger('rubick.discovery') - - def __init__(self, defaultPrivateKey): - self.queue = deque() - self.defaultPrivateKey = defaultPrivateKey - self.agents = dict([(c.item_type, c()) - for c in all_subclasses(BaseDiscovery) - if hasattr(c, 'item_type')]) - self._hosts = {} - self._clients = {} - - def setHostConnectionInfo(self, host, port=22, - username='root', password=None, privateKey=None): - self._hosts[host] = dict( - host=host, - port=port, - username=username, - password=password, - private_key=privateKey or self.defaultPrivateKey) - - def client(self, host): - if host not in self._clients: - host_info = self._hosts[host] if host in self._hosts else dict( - host=host, port=22, - username='root', private_key=self.defaultPrivateKey) - - self._clients[host] = ExtendedNodeClient(NodeClient(**host_info)) - - return self._clients[host] - - def discover(self, type, host, **data): - if type not in self.agents: - self.logger.error('Request for discovery of unknown type "%s"' % type) - return None - - self.logger.info('Processing item of type %s, host = %s, %s' % - (type, host, ', '.join(['%s=%s' % (k, v) for k, v in data.items()]))) - - return self.agents[type].discover(self, host, **data) - - def enqueue(self, type, host, **data): - self.queue.append(DiscoveryDriver.Task(type, host, data)) - - -class OpenstackDiscovery(object): - logger = logging.getLogger('rubick.discovery') - - def discover(self, initial_nodes, private_key): - "Takes a list of node addresses " - "and returns discovered openstack installation info" - driver = DiscoveryDriver(private_key) - - # Set connection info and queue initial nodes - for info in parse_nodes_info(initial_nodes, private_key): - driver.setHostConnectionInfo( - host=info['host'], port=info['port'], - username=info['username'], password=info['password'], - privateKey=info['private_key']) - - driver.enqueue('host', info['host']) - - while len(driver.queue) > 0: - task = driver.queue.popleft() - - driver.discover(task.type, task.host, **task.data) - - items = sum([agent.items for agent in driver.agents.values()], []) - - # Rebuild model tree - openstack = model.Openstack() - - for host in filter(lambda i: isinstance(i, model.HostResource), items): - openstack.add_host(host) - - for service in filter(lambda i: isinstance(i, model.Service), items): - host = find(openstack.hosts, lambda h: h.id == service.host_id) - if not host: - self.logger.error('Got resource "%s" ' - 'that belong to non-existing host' % service) - continue - - host.add_component(service) - - for fs_resource in filter(lambda f: isinstance(f, model.FileSystemResource), items): - host = find(openstack.hosts, lambda h: h.id == fs_resource.host_id) - if not host: - self.logger.error('Got resource "%s" ' - 'that belong to non-existing host' % fs_resource) - continue - - host.add_fs_resource(fs_resource) - - return openstack diff --git a/rubick/exceptions.py b/rubick/exceptions.py deleted file mode 100644 index efdae5f..0000000 --- a/rubick/exceptions.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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. - - -class RubickException(BaseException): - pass - - -class ValidatorException(RubickException): - pass - - -class SchemaException(RubickException): - pass diff --git a/rubick/inspections/__init__.py b/rubick/inspections/__init__.py deleted file mode 100644 index b9b7b69..0000000 --- a/rubick/inspections/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from rubick.inspections.keystone_authtoken import KeystoneAuthtokenSettingsInspection # noqa -from rubick.inspections.keystone_endpoints import KeystoneEndpointsInspection # noqa -from rubick.inspections.lettuce_runner import LettuceRunnerInspection # noqa diff --git a/rubick/inspections/keystone_authtoken.py b/rubick/inspections/keystone_authtoken.py deleted file mode 100644 index c49748a..0000000 --- a/rubick/inspections/keystone_authtoken.py +++ /dev/null @@ -1,121 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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 rubick.common import Inspection, Issue, find - -AUTHTOKEN_FILTER_FACTORY = ('keystoneclient.middleware.auth_token:' - 'filter_factory') - - -class KeystoneAuthtokenSettingsInspection(Inspection): - name = 'Keystone auth' - description = 'Validate correctness of keystone settings' - - def inspect(self, openstack): - components = [] - for host in openstack.hosts: - components.extend(host.components) - - keystones = [c for c in components if c.name == 'keystone'] - if len(keystones) == 0: - openstack.report_issue( - Issue(Issue.FATAL, 'No keystone service found')) - return - - keystone = keystones[0] - keystone_addresses = [keystone.config['bind_host']] - if keystone_addresses == ['0.0.0.0']: - keystone_addresses = keystone.host.network_addresses - - for nova in [c for c in components if c.name == 'nova-api']: - if nova.config['auth_strategy'] != 'keystone': - continue - - authtoken_section = find( - nova.paste_config.items(), - lambda name_values: name_values[0].startswith('filter:') and - name_values[1].get( - 'paste.filter_factory') == AUTHTOKEN_FILTER_FACTORY) - - if not authtoken_section: - continue - - authtoken_settings = authtoken_section[1] - - def get_value(name): - return ( - authtoken_settings[name] or - nova.config['keystone_authtoken.%s' % name] - ) - - auth_host = get_value('auth_host') - auth_port = int(get_value('auth_port')) - auth_protocol = get_value('auth_protocol') - admin_user = get_value('admin_user') - # admin_password = get_value('admin_password') - admin_tenant_name = get_value('admin_tenant_name') - admin_token = get_value('admin_token') - - msg = 'Keystone authtoken config %s' - - def missing_param_issue(param): - return Issue(Issue.ERROR, - msg % (' miss "%s" setting' % param)) - - def incorrect_param_issue(param): - return Issue(Issue.ERROR, - msg % (' has incorrect "%s" setting' % param)) - - if not auth_host: - nova.report_issue(missing_param_issue('auth_host')) - elif not auth_host in keystone_addresses: - nova.report_issue(incorrect_param_issue('auth_host')) - - if not auth_port: - nova.report_issue(missing_param_issue('auth_port')) - elif auth_port != keystone.config['admin_port']: - nova.report_issue(incorrect_param_issue('auth_port')) - - if not auth_protocol: - nova.report_issue(missing_param_issue('auth_protocol')) - elif not auth_protocol in ['http', 'https']: - nova.report_issue(incorrect_param_issue('auth_protocol')) - - if not admin_user: - nova.report_issue(missing_param_issue('admin_user')) - else: - user = find( - keystone.db['users'], - lambda u: u['name'] == admin_user) - if not user: - nova.report_issue( - Issue(Issue.ERROR, msg % - ' has "admin_user" that is missing')) - - if not admin_tenant_name: - nova.report_issue(missing_param_issue('admin_tenant_name')) - else: - tenant = find(keystone.db['tenants'], - lambda t: t['name'] == admin_tenant_name) - if not tenant: - nova.report_issue( - Issue(Issue.ERROR, msg % - ' has "admin_tenant_name" that is missing')) - - if admin_token: - nova.report_issue( - Issue( - Issue.WARNING, - msg % ' uses insecure admin_token method' - 'for authentication')) diff --git a/rubick/inspections/keystone_endpoints.py b/rubick/inspections/keystone_endpoints.py deleted file mode 100644 index 3e6a7ba..0000000 --- a/rubick/inspections/keystone_endpoints.py +++ /dev/null @@ -1,82 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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 six.moves.urllib.parse import urlparse - -from rubick.common import Inspection, Issue, find - -SERVICE_WITH_NO_ENDPOINT_MSG = """ -Keystone catalog contains service "%s" that has no defined endpoints -""".strip() -SERVICE_ENDPOINT_MSG = """ -Keystone catalog has endpoint for service "%s" (id %s) that has "%s" -""".strip() -UNKNOWN_HOST_ENDPOINT_MSG = (SERVICE_ENDPOINT_MSG + - ' set pointing to unknown host') -UNKNOWN_SERVICE_ENDPOINT_MSG = (SERVICE_ENDPOINT_MSG + - ' set pointing to no service') - - -class KeystoneEndpointsInspection(Inspection): - name = 'Keystone endpoints' - description = """ - Validate that each keystone endpoint leads to proper service - """.strip() - - def inspect(self, openstack): - keystone = find(openstack.components, lambda c: c.name == 'keystone') - if not keystone: - return - - for service in keystone.db['services']: - if service['type'] == 'compute': - endpoint = find( - keystone.db['endpoints'], - lambda e: e['service_id'] == service['id']) - if not endpoint: - keystone.report_issue( - Issue( - Issue.WARNING, SERVICE_WITH_NO_ENDPOINT_MSG % - service['name'])) - continue - - for url_attr in ['adminurl', 'publicurl', 'internalurl']: - url = urlparse(endpoint[url_attr]) - - # TODO(someone): resolve endpoint url host address - host = find( - openstack.hosts, - lambda h: url.hostname in h.network_addresses) - if not host: - keystone.report_issue( - Issue(Issue.ERROR, UNKNOWN_HOST_ENDPOINT_MSG % - (service['name'], service['id'], url_attr))) - continue - - nova_api = None - for c in host.components: - if c.name != 'nova-api': - continue - - listen_address = c.config['osapi_compute_listen'] - listen_port = c.config['osapi_compute_listen_port'] - - if (listen_address in ['0.0.0.0', url.hostname] and - listen_port == url.port): - nova_api = c - break - - if not nova_api: - keystone.report_issue( - Issue(Issue.ERROR, UNKNOWN_SERVICE_ENDPOINT_MSG % - (service['name'], service['id'], url_attr))) diff --git a/rubick/inspections/lettuce/sample.feature b/rubick/inspections/lettuce/sample.feature deleted file mode 100644 index 8f985d6..0000000 --- a/rubick/inspections/lettuce/sample.feature +++ /dev/null @@ -1,19 +0,0 @@ -Feature: Configuration consistency - - Scenario: Nova has proper Keystone host - Given I use OpenStack 2013.1 - And Nova has "auth_strategy" equal to "keystone" - And Keystone addresses are @X - Then Nova should have keystone authtoken filter's "auth_host" in "$X" - - Scenario: Nova has proper fixed_range settings for Grizzly release - Given I use OpenStack 2013.1 - And Nova has "fixed_range" equal to "" - Then "nova" component have "fixed_range" parameter equal to "" - - Scenario: Nova has proper settings for NoVNC - Given I use OpenStack 2013.1 - And Controller addresses are @X - Then "nova" component have "novncproxy_base_url" parameter equal to "$X" - And "nova" component must have "sql_connection" parameter - diff --git a/rubick/inspections/lettuce/sample_havana.feature b/rubick/inspections/lettuce/sample_havana.feature deleted file mode 100644 index 9664e6d..0000000 --- a/rubick/inspections/lettuce/sample_havana.feature +++ /dev/null @@ -1,22 +0,0 @@ -Feature: Configuration consistency - - Scenario: Nova has proper Keystone host - Given I use OpenStack 2013.2.1 - And Nova has "auth_strategy" equal to "keystone" - And Keystone addresses are @X - Then Nova should have keystone authtoken filter's "auth_host" in "$X" - - Scenario: Nova has proper fixed_range settings for Grizzly release - Given I use OpenStack 2013.2.1 - And Nova has "fixed_range" equal to "" - Then "nova" component have "fixed_range" parameter equal to "" - - Scenario: Nova has proper settings for NoVNC - Given I use OpenStack 2013.2.1 - And Controller addresses are @X - Then "nova" component have "novncproxy_base_url" parameter equal to "$X" - And "nova" component must have "sql_connection" parameter - - Scenario: Neutron check - Given I use OpenStack 2013.2.1 - Then "neutron" component must have "sql_connection" parameter \ No newline at end of file diff --git a/rubick/inspections/lettuce/steps.py b/rubick/inspections/lettuce/steps.py deleted file mode 100644 index b8a4a78..0000000 --- a/rubick/inspections/lettuce/steps.py +++ /dev/null @@ -1,198 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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 string -from lettuce import step, world - -from rubick.common import Issue, Version, find -import rubick.model as model - - -AUTHTOKEN_FILTER_FACTORY = ('keystoneclient.middleware.auth_token:' - 'filter_factory') - - -def get_variable(name): - if not hasattr(world, 'variables'): - return None - - return world.variables.get(name) - - -def set_variable(name, value): - if not hasattr(world, 'variables'): - world.variables = {} - - world.variables[name] = value - - -def subst(template): - if not hasattr(world, 'variables'): - return template - - tmpl = string.Template(template) - return tmpl.safe_substitute(world.variables) - - -def stop(): - assert False, "stop" - - -# Openstack general step description section -@step(r'I use OpenStack (\w+)') -def use_openstack_version(step, version): - version = Version(version) - for component in [c for c in world.openstack.components - if isinstance(c, model.OpenstackComponent)]: - if not Version(component.version) >= version: - stop() - - -@step(r'Controller addresses are @(\w+)') -def controller_addresses(self, variable): - controller = find(world.openstack.components, lambda c: c.name == 'nova') - - if controller.config['s3_host'] == '0.0.0.0': - addresses = filter( - lambda ip: not ip.startswith('127.'), - controller.host.network_addresses) - else: - addresses = [controller.config['s3_host']] - - set_variable(variable, addresses) - - -# Keystone steps section -@step(r'Keystone addresses are @(\w+)') -def keystone_addresses(self, variable): - keystone = find(world.openstack.components, lambda c: c.name == 'keystone') - - if keystone.config['bind_host'] == '0.0.0.0': - addresses = filter( - lambda ip: not ip.startswith('127.'), - keystone.host.network_addresses) - else: - addresses = [keystone.config['bind_host']] - - set_variable(variable, addresses) - - -# Nova steps section -@step(r'Nova has "(.+)" equal to "(.*)"') -def nova_has_property(step, name, value): - name = subst(name) - value = subst(value) - - for nova in [c for c in world.openstack.components - if c.name.startswith('nova')]: - if not nova.config[name] == value: - stop() - - -@step(r'Nova should have "(.+)" in "(.*)"') -def nova_property_assertion(self, name, values): - name = subst(name) - values = subst(values) - - if not values: - return - - for nova in [c for c in world.openstack.components - if c.name.startswith('nova')]: - nova_value = nova.config[name] - - if not (nova_value and nova_value in values): - nova.report_issue( - Issue(Issue.ERROR, 'Nova should have "%s" in %s' % - (name, values))) - - -@step(r"Nova should have keystone authtoken filter's \"(.+)\" in \"(.*)\"") -def nova_authtoken_property_assertion(self, name, values): - name = subst(name) - values = subst(values) - - if not values: - return - - for nova in [c for c in world.openstack.components - if c.name.startswith('nova')]: - - (authtoken_section, _) = find( - nova.paste_config.items(), - lambda name_values: name_values[0].startswith('filter:') - and name_values[1].get('paste.filter_factory') == - AUTHTOKEN_FILTER_FACTORY - ) - - if not authtoken_section: - nova.report_issue( - Issue(Issue.ERROR, 'Nova has keystone "auth" strategy ' - 'configured, but doesnt have authtoken ' - 'paste filter')) - continue - - authtoken_settings = nova.paste_config.section(authtoken_section) - - param_value = (authtoken_settings[name] or - nova.config['keystone_authtoken.%s' % name]) - - if not (param_value and param_value in values): - nova.report_issue( - Issue(Issue.ERROR, 'Nova should have "%s" in %s, ' - 'actual value is "%s"' % ( - name, values, param_value))) - - -# Common steps section -@step(r'"(.+)" component must have "(.+)" parameter') -def component_has_non_none_property(step, component_name, parameter_name): - component_name = subst(component_name) - parameter_name = subst(parameter_name) - - for component in [c for c in world.openstack.components - if c.name.startswith('%s' % component_name)]: - component_value = component.config[parameter_name] - - if component_value is None: - component.report_issue( - Issue(Issue.ERROR, - '"%s" must have parameter "%s - version %s"' % - (c.name, parameter_name, component.version))) - - -@step(r'"(.+)" component have "(.+)" parameter equal to "(.*)"') -def component_has_property_with_value(step, component_name, parameter_name, - value): - component_name = subst(component_name) - parameter_name = subst(parameter_name) - value = subst(value) - - for component in [c for c in world.openstack.components - if c.component.startswith('%s' % component_name)]: - component_value = component.config[parameter_name] - - if not component_value == value: - component.report_issue( - Issue(Issue.ERROR, - '"%s" should have parameter "%s" equals "%s"' - 'now its "%s"' % (component_name, parameter_name, - component_value, value))) - - -@step(r'Which package version do I use?') -def component_versions_list(self): - for component in world.openstack.components: - component.report_issue(Issue(Issue.INFO, "%s component has % version" % - (component.name, - component.version))) diff --git a/rubick/inspections/lettuce/version.feature b/rubick/inspections/lettuce/version.feature deleted file mode 100644 index 5fe2dce..0000000 --- a/rubick/inspections/lettuce/version.feature +++ /dev/null @@ -1,4 +0,0 @@ -Feature: OpenStack component version finding - - Scenario: All component version finding - Then Which package version do I use? \ No newline at end of file diff --git a/rubick/inspections/lettuce_runner.py b/rubick/inspections/lettuce_runner.py deleted file mode 100644 index 0d2963b..0000000 --- a/rubick/inspections/lettuce_runner.py +++ /dev/null @@ -1,52 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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.path - -import lettuce -import lettuce.fs - -from rubick.common import Inspection, Rule, Issue - - -class LettuceRunnerInspection(Inspection): - base_path = os.path.join(os.path.dirname(__file__), 'lettuce') - - @classmethod - def rules(klass): - rules = [] - - loader = lettuce.fs.FeatureLoader(klass.base_path) - for path in loader.find_feature_files(): - feature = lettuce.Feature.from_file(path) - for scenario in feature.scenarios: - rules.append(Rule(scenario.name, - "\n".join(scenario.remaining_lines))) - return rules - - def inspect(self, openstack): - runner = lettuce.Runner(base_path=self.base_path) - - lettuce.world.openstack = openstack - result = runner.run() - del lettuce.world.openstack - - for feature_result in result.feature_results: - for scenario_result in feature_result.scenario_results: - if scenario_result.passed: - continue - - for step in scenario_result.steps_undefined: - openstack.report_issue( - Issue(Issue.ERROR, 'Undefined step "%s"' % - step.sentence)) diff --git a/rubick/json.py b/rubick/json.py deleted file mode 100644 index 8090207..0000000 --- a/rubick/json.py +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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. -__all__ = ['openstack_for_json'] - - -def json_issues(issues): - return [str(issue) for issue in issues] - - -def json_component(component): - result = dict(type='component', name=component.name) - - if hasattr(component, 'version'): - result['version'] = component.version - - if len(component.all_issues) > 0: - result['issues'] = json_issues(component.all_issues) - - return result - - -def json_host(host): - result = dict(type='host', name=host.name, - addresses=host.network_addresses, - components=[json_component(c) for c in host.components]) - if len(host.issues) > 0: - result['issues'] = json_issues(host.issues) - - return result - - -def json_openstack(openstack): - result = dict(type='openstack', - hosts=[json_host(host) for host in openstack.hosts]) - if len(openstack.issues) > 0: - result['issues'] = json_issues(openstack.issues) - - return result - - -def openstack_for_json(openstack): - return json_openstack(openstack) diff --git a/rubick/main.py b/rubick/main.py deleted file mode 100644 index 398d2fa..0000000 --- a/rubick/main.py +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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 argparse -import logging -import sys - - -from rubick.inspection import MainConfigValidationInspection -from rubick.model_parser import ModelParser - - -def main(args): - parser = argparse.ArgumentParser() - parser.add_argument( - '-d', - '--debug', - help='set debug log level', - action='store_true') - parser.add_argument('path', help='Path to config snapshot') - - args = parser.parse_args(args) - - if args.debug: - logging.basicConfig(level=logging.DEBUG) - else: - logging.basicConfig(level=logging.WARN) - - model_parser = ModelParser() - - print('Analyzing configs in "%s"' % args.path) - - model = model_parser.parse(args.path) - - inspections = [MainConfigValidationInspection()] - - issues = [] - for inspection in inspections: - issues.extend(inspection.inspect(model)) - - if len(issues) == 0: - print('No issues found') - else: - print('Found issues:') - for issue in issues: - print(issue) - - -if __name__ == '__main__': - main(sys.argv[1:]) diff --git a/rubick/model.py b/rubick/model.py deleted file mode 100644 index 47e70a6..0000000 --- a/rubick/model.py +++ /dev/null @@ -1,451 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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 itertools import groupby -import logging - -from rubick.common import Mark, Issue, MarkedIssue, Version -from rubick.config_formats import IniConfigParser -from rubick.config_model import Configuration -from rubick.schema import ConfigSchemaRegistry -from rubick.utils import memoized - - -class IssueReporter(object): - - def __init__(self): - super(IssueReporter, self).__init__() - self.issues = [] - - def report_issue(self, issue): - if issue not in self.issues: - issue.subject = self - self.issues.append(issue) - - @property - def all_issues(self): - return list(self.issues) - - -class Resource(IssueReporter): - pass - - -class Openstack(Resource): - - def __init__(self): - super(Openstack, self).__init__() - self.hosts = [] - - def add_host(self, host): - if not host: - return - - self.hosts.append(host) - host.parent = self - - @property - def all_issues(self): - result = super(Openstack, self).all_issues - - for host in self.hosts: - result.extend(host.all_issues) - - return result - - @property - def components(self): - components = [] - for host in self.hosts: - components.extend(host.components) - - return components - - -class HostResource(Resource): - - def __init__(self, name): - super(HostResource, self).__init__() - self.name = name - self.components = [] - self.filesystem = {} - - def __str__(self): - return 'Host "%s"' % self.name - - def add_component(self, component): - if not component: - return - - self.components.append(component) - component.parent = self - - def add_fs_resource(self, resource): - if not resource: - return - - self.filesystem[resource.path] = resource - resource.parent = self - - @property - def openstack(self): - return self.parent - - @property - def all_issues(self): - result = super(HostResource, self).all_issues - - for component in self.components: - result.extend(component.all_issues) - - return result - - -class ProcessResource(Resource): - - def __init__(self, pid, cmdline, cwd): - super(ProcessResource, self).__init__() - self.pid = pid - self.cmdline = cmdline - self.cwd = cwd - - -class Service(Resource): - - def __init__(self): - super(Service, self).__init__() - self.issues = [] - - def report_issue(self, issue): - self.issues.append(issue) - - @property - def host(self): - return self.parent - - @property - def openstack(self): - return self.host.openstack - - @property - def all_issues(self): - result = super(Service, self).all_issues - - if hasattr(self, 'config_files') and self.config_files: - [result.extend(config_file.all_issues) - for config_file in self.config_files] - - return result - - def __str__(self): - return 'Service "%s"' % self.name - - -class OpenstackComponent(Service): - logger = logging.getLogger('rubick.model.openstack_component') - component = None - - @property - @memoized - def config(self): - schema = ConfigSchemaRegistry.get_schema(self.component, self.version) - if not schema: - self.logger.debug( - 'No schema for component "%s" main config version %s. ' - 'Using untyped parameters (everything is string)' % - (self.component, self.version)) - - return self._parse_config_resources(self.config_files, schema) - - def _parse_config_resources(self, resources, schema=None): - config = Configuration(schema) - - # Apply defaults - if schema: - for parameter in filter(lambda p: p.default, schema.parameters): - if not parameter.section or parameter.section == 'DEFAULT': - config.set_default(parameter.name, parameter.default) - else: - config.set_default( - '%s.%s' % - (parameter.section, parameter.name), parameter.default) - - for resource in reversed(resources): - self._parse_config_file( - Mark(resource.path), resource.contents, config, schema, - issue_reporter=resource) - - return config - - def _parse_config_file(self, base_mark, config_contents, - config=Configuration(), schema=None, - issue_reporter=None): - if issue_reporter: - def report_issue(issue): - issue_reporter.report_issue(issue) - else: - def report_issue(issue): - pass - - # Parse config file - config_parser = IniConfigParser() - parsed_config = config_parser.parse('', base_mark, config_contents) - for error in parsed_config.errors: - report_issue(error) - - # Validate config parameters and store them - section_name_text_f = lambda s: s.name.text - sections_by_name = groupby( - sorted( - parsed_config.sections, - key=section_name_text_f), - key=section_name_text_f) - - for section_name, sections in sections_by_name: - sections = list(sections) - - if len(sections) > 1: - report_issue( - Issue( - Issue.INFO, - 'Section "%s" appears multiple times' % - section_name)) - - seen_parameters = set() - - for section in sections: - unknown_section = False - if schema: - unknown_section = not schema.has_section(section.name.text) - - if unknown_section: - report_issue( - MarkedIssue(Issue.WARNING, 'Unknown section "%s"' % - (section_name), section.start_mark)) - continue - - for parameter in section.parameters: - parameter_schema = None - if schema: - parameter_schema = schema.get_parameter( - name=parameter.name.text, - section=section.name.text) - if not (parameter_schema or unknown_section): - report_issue( - MarkedIssue( - Issue.WARNING, - 'Unknown parameter: section "%s" name "%s"' - % (section_name, parameter.name.text), - parameter.start_mark)) - - if parameter.name.text in seen_parameters: - report_issue( - MarkedIssue( - Issue.WARNING, - 'Parameter "%s" in section "%s" redeclared' % - (parameter.name.text, section_name), - parameter.start_mark)) - else: - seen_parameters.add(parameter.name.text) - - parameter_fullname = parameter.name.text - if section_name != 'DEFAULT': - parameter_fullname = section_name + \ - '.' + parameter_fullname - - config.set(parameter_fullname, parameter.value.text) - - validation_error = config.validate(parameter_fullname) - if validation_error: - validation_error.mark = parameter\ - .value.start_mark.merge(validation_error.mark) - validation_error.message = \ - 'Property "%s" in section "%s": %s' % ( - parameter.name.text, section_name, - validation_error.message) - report_issue(validation_error) - - if (parameter_schema and - parameter_schema.deprecation_message): - report_issue( - MarkedIssue( - Issue.WARNING, - 'Deprecated parameter: section "%s" name ' - '"%s". %s' % - (section_name, parameter.name.text, - parameter_schema.deprecation_message), - parameter.start_mark)) - - return config - - -class KeystoneComponent(OpenstackComponent): - component = 'keystone' - name = 'keystone' - - -class NovaApiComponent(OpenstackComponent): - component = 'nova' - name = 'nova-api' - - @property - @memoized - def paste_config(self): - return self._parse_config_resources([self.paste_config_file]) - - @property - def all_issues(self): - result = super(NovaApiComponent, self).all_issues - - if hasattr(self, 'paste_config_file') and self.paste_config_file: - result.extend(self.paste_config_file.all_issues) - - return result - - -class NovaComputeComponent(OpenstackComponent): - component = 'nova' - name = 'nova-compute' - - -class NovaSchedulerComponent(OpenstackComponent): - component = 'nova' - name = 'nova-scheduler' - - -class CinderApiComponent(OpenstackComponent): - component = 'cinder' - name = 'cinder-api' - - -class CinderVolumeComponent(OpenstackComponent): - component = 'cinder' - name = 'cinder-volume' - - -class CinderSchedulerComponent(OpenstackComponent): - component = 'cinder' - name = 'cinder-scheduler' - - -class MysqlComponent(Service): - component = 'mysql' - name = 'mysql' - - -class RabbitMqComponent(Service): - name = 'rabbitmq' - - @property - @memoized - def config(self): - config = Configuration() - schema = ConfigSchemaRegistry.get_schema('rabbitmq', Version(1000000)) - if schema: - for parameter in schema.parameters: - if not parameter.default: - continue - - config.set_default(parameter.name, parameter.default) - else: - print("RabbitMQ schema not found") - - return config - - -class GlanceApiComponent(OpenstackComponent): - component = 'glance_api' - name = 'glance-api' - - -class GlanceRegistryComponent(OpenstackComponent): - component = 'glance_registry' - name = 'glance-registry' - - -class NeutronServerComponent(OpenstackComponent): - component = 'neutron_server' - name = 'neutron-server' - - -class NeutronOpenvswitchAgentComponent(OpenstackComponent): - component = 'neutron_openvswitch_agent' - name = 'neutron-openvswitch-agent' - - -class NeutronDhcpAgentComponent(OpenstackComponent): - component = 'neutron_dhcp_agent' - name = 'neutron-dhcp-agent' - - -class NeutronL3AgentComponent(OpenstackComponent): - component = 'neutron_l3_agent' - name = 'neutron-l3-agent' - - -class NeutronMetadataAgentComponent(OpenstackComponent): - component = 'neutron_metadata_agent' - name = 'neutron-metadata-agent' - - -class SwiftProxyServerComponent(OpenstackComponent): - component = 'swift_proxy_server' - name = 'swift-proxy-server' - - -class SwiftContainerServerComponent(OpenstackComponent): - component = 'swift_container_server' - name = 'swift-container-server' - - -class SwiftAccountServerComponent(OpenstackComponent): - component = 'swift_account_server' - name = 'swift-account-server' - - -class SwiftObjectServerComponent(OpenstackComponent): - component = 'swift_object_server' - name = 'swift-object-server' - - -class FileSystemResource(Resource): - def __init__(self, path, owner, group, permissions): - super(FileSystemResource, self).__init__() - self.path = path - self.owner = owner - self.group = group - self.permissions = permissions - - def __str__(self): - return '%s "%s"' % ( - self.__class__.__name__.split('.')[-1].replace('Resource', ''), - self.path) - - def __repr__(self): - return ( - '%s(path=%s, owner=%s, group=%s, permissions=%s)' % - (self.__class__.__name__.split('.')[-1], repr(self.path), - repr(self.owner), repr(self.group), repr(self.permissions)) - ) - - -class FileResource(FileSystemResource): - - def __init__(self, path, contents, owner, group, permissions): - super(FileResource, self).__init__( - path, owner, group, permissions) - self.contents = contents - - -class DirectoryResource(FileSystemResource): - pass diff --git a/rubick/schema.py b/rubick/schema.py deleted file mode 100644 index 8b75cc6..0000000 --- a/rubick/schema.py +++ /dev/null @@ -1,614 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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.path -import re -import yaml - -from rubick.common import Issue, MarkedIssue, Mark, Version, find, index -from rubick.exceptions import RubickException - - -class SchemaError(RubickException): - pass - - -class ConfigSchemaLoader(object): - db_path = os.path.join(os.path.dirname(__file__), 'schemas') - - def load(self, project, configname): - path = os.path.join(self.db_path, project, configname + '.yml') - if not os.path.exists(path): - return None - - with open(path) as f: - records = yaml.load(f.read()) - - return records - - -class ConfigSchemaRegistry: - @classmethod - def get_schema(self, project, version, configname=None, schema_loader=ConfigSchemaLoader()): - if not configname: - configname = '%s.conf' % project - fullname = '%s/%s' % (project, configname) - version = Version(version) - - records = schema_loader.load(project, configname) - if not records: - return None - - i = len(records) - 1 - # Find latest checkpoint prior given version - while i >= 0 and not (records[i].get('checkpoint', False) - and Version(records[i]['version']) <= version): - i -= 1 - - if i < 0: - if Version(records[0]['version']) > version: - # Reached the earliest record yet haven't found version - return None - - # Haven't found checkpoint but yearliest version is less than given - # Assuming first record is checkpoint - i = 0 - - parameters = [] - seen_parameters = set() - last_version = None - - while i < len(records) and Version(records[i]['version']) <= version: - last_version = records[i]['version'] - for param_data in records[i].get('added', []): - name = param_data['name'] - section = None - if '.' in name: - section, name = name.split('.', 1) - - param = ConfigParameterSchema( - name, param_data['type'], section=section, - type_args=param_data.get('type_args', {}), - default=param_data.get('default', None), - description=param_data.get('help', None), - required=param_data.get('required', False), - deprecation_message=param_data.get('deprecated', None)) - - if param.name in seen_parameters: - old_param_index = index( - parameters, - lambda p: p.name == param.name) - if old_param_index != -1: - parameters[old_param_index] = param - else: - parameters.append(param) - seen_parameters.add(param.name) - for param_name in records[i].get('removed', []): - param_index = index( - parameters, - lambda p: p.name == param_name) - if index != -1: - parameters.pop(param_index) - seen_parameters.discard(param_name) - i += 1 - - return ConfigSchema(fullname, last_version, 'ini', parameters) - - -def param_fullname(name, section=None): - fullname = name - if section and section != 'DEFAULT': - fullname = '%s.%s' % (section, name) - - return fullname - - -class ConfigSchema: - - def __init__(self, name, version, format, parameters): - self.name = name - self.version = Version(version) - self.format = format - self.parameters = parameters - self._parameterByName = {} - for param in self.parameters: - self._parameterByName[param.fullname] = param - - def has_section(self, section): - return ( - find(self.parameters, lambda p: p.section == section) is not None - ) - - def get_parameter(self, name, section=None): - fullname = param_fullname(name, section) - - return self._parameterByName.get(fullname, None) - - def __len__(self): - return len(self.parameters) - - def __iter__(self): - for param in self.parameters: - yield param - - def __getitem__(self, key): - return self.get_parameter(key) - - def __contains__(self, item): - return item in self._parameterByName - - def __repr__(self): - return ('' % - (self.name, self.version, self.format, self.parameters)) - - -class ConfigParameterSchema: - - def __init__(self, name, type, type_args={}, section=None, description=None, - default=None, required=False, deprecation_message=None): - self.section = section or 'DEFAULT' - self.name = name - self.type = type - self.type_args = type_args - self.fullname = param_fullname(name, section) - self.description = description - self.default = default - self.required = required - self.deprecation_message = deprecation_message - - def __repr__(self): - return ( - '' % ' '.join( - ['%s=%s' % (attr, getattr(self, attr)) - for attr in ['section', 'name', 'type', 'description', - 'default', 'required']]) - ) - - -class TypeValidatorRegistry: - __validators = {} - __default_validator = None - - @classmethod - def register_validator(self, type_name, type_validator, default=False): - self.__validators[type_name] = type_validator - if default: - self.__default_validator = type_name - - @classmethod - def get_validator(self, name): - return self.__validators.get( - name, self.__validators[self.__default_validator]) - - -class SchemaIssue(Issue): - - def __init__(self, message): - super(SchemaIssue, self).__init__(Issue.ERROR, message) - - -class InvalidValueError(MarkedIssue): - - def __init__(self, message, mark=Mark('', 0, 0)): - super(InvalidValueError, self).__init__( - Issue.ERROR, 'Invalid value: ' + message, mark) - - -class TypeValidator(object): - - def __init__(self, base_type, f): - super(TypeValidator, self).__init__() - self.base_type = base_type - self.f = f - - def validate(self, value, **kwargs): - if value is None: - return value - return getattr(self, 'f')(value, **kwargs) - - -def type_validator(name, base_type=None, default=False, **kwargs): - if not base_type: - base_type = name - - def wrap(fn): - def wrapped(s, **immediate_kwargs): - return fn(s, **dict(kwargs, **immediate_kwargs)) - o = TypeValidator(base_type, wrapped) - TypeValidatorRegistry.register_validator(name, o, default=default) - return fn - - return wrap - - -def isissue(o): - return isinstance(o, Issue) - - -@type_validator('boolean') -def validate_boolean(s): - if isinstance(s, bool): - return s - - s = s.lower() - if s == 'true': - return True - elif s == 'false': - return False - else: - return InvalidValueError('Value should be "true" or "false"') - - -@type_validator('enum') -def validate_enum(s, values=[]): - if s in values: - return None - if len(values) == 0: - message = 'There should be no value, but found %s' % repr(s) - elif len(values) == 1: - message = 'The only valid value is "%s", but found "%s"' % ( - repr(values[0]), repr(s)) - else: - message = 'Valid values are %s and %s, but found %s' % ( - ', '.join([repr(v) for v in values[:-1]]), - repr(values[-1]), repr(s)) - return InvalidValueError('%s' % message) - - -def validate_ipv4_address(s): - s = s.strip() - parts = s.split('.') - if len(parts) == 4: - if all([all([c.isdigit() for c in part]) for part in parts]): - parts = [int(part) for part in parts] - if all([part < 256 for part in parts]): - return '.'.join([str(part) for part in parts]) - - return InvalidValueError('Value should be ipv4 address') - - -def validate_ipv4_network(s): - s = s.strip() - parts = s.split('/') - if len(parts) != 2: - return ( - InvalidValueError( - 'Should have "/" character separating address and prefix ' - 'length') - ) - - address, prefix = parts - prefix = prefix.strip() - - if prefix.strip() == '': - return InvalidValueError('Prefix length is required') - - address = validate_ipv4_address(address) - if isissue(address): - return address - - if not all([c.isdigit() for c in prefix]): - return InvalidValueError('Prefix length should be an integer') - - prefix = int(prefix) - if prefix > 32: - return ( - InvalidValueError( - 'Prefix length should be less than or equal to 32') - ) - - return '%s/%d' % (address, prefix) - - -def validate_host_label(s): - if len(s) == 0: - return InvalidValueError( - 'Host label should have at least one character') - - if not s[0].isalpha(): - return InvalidValueError( - 'Host label should start with a letter, but it starts with ' - '"%s"' % s[0]) - - if len(s) == 1: - return s - - if not (s[-1].isdigit() or s[-1].isalpha()): - return InvalidValueError( - 'Host label should end with letter or digit, but it ends ' - 'with "%s"' % - s[-1], Mark('', 0, len(s) - 1)) - - if len(s) == 2: - return s - - for i, c in enumerate(s[1:-1]): - if not (c.isalpha() or c.isdigit() or c == '-'): - return InvalidValueError( - 'Host label should contain only letters, digits or hypens,' - ' but it contains "%s"' % - c, Mark('', 0, i + 1)) - - return s - - -@type_validator('host', base_type='string') -@type_validator('host_address', base_type='string') -@type_validator('old_network', base_type='string') -def validate_host_address(s): - result = validate_ipv4_address(s) - if not isissue(result): - return result - - offset = len(s) - len(s.lstrip()) - - parts = s.strip().split('.') - part_offset = offset - labels = [] - for part in parts: - host_label = validate_host_label(part) - if isissue(host_label): - return host_label.offset_by(Mark('', 0, part_offset)) - - part_offset += len(part) + 1 - labels.append(host_label) - - return '.'.join(labels) - - -@type_validator('network', base_type='string') -@type_validator('network_address', base_type='string') -def validate_network_address(s): - return validate_ipv4_network(s) - - -@type_validator('network_mask', base_type='string') -def validate_network_mask(s): - # TODO(someone): implement proper checking - result = validate_ipv4_address(s) - if isissue(result): - return result - - parts = [int(p) for p in result.split('.', 3)] - - x = index(parts, lambda p: p != 255) - if x == -1: - return result - - if parts[x] not in [0, 128, 192, 224, 240, 248, 252, 254]: - return InvalidValueError('Invalid netmask') - - x += 1 - while x < 4: - if parts[x] != 0: - return InvalidValueError('Invalid netmask') - - return result - - -@type_validator('host_and_port', base_type='string') -def validate_host_and_port(s, default_port=None): - parts = s.strip().split(':', 2) - - host_address = validate_host_address(parts[0]) - if isissue(host_address): - return host_address - - if len(parts) == 2: - port = validate_port(parts[1]) - if isissue(port): - return port - elif default_port: - port = default_port - else: - return InvalidValueError('No port specified') - - return (host_address, port) - - -@type_validator('string', base_type='string', default=True) -@type_validator('list', base_type='list') -@type_validator('multi', base_type='multi') -@type_validator('file', base_type='string') -@type_validator('directory', base_type='string') -@type_validator('host_v6', base_type='string') -def validate_string(s): - return s - - -@type_validator('regex', base_type='string') -@type_validator('regexp', base_type='string') -def validate_regex(s): - try: - re.compile(s) - except re.error as e: - return InvalidValueError(str(e)) - - return s - - -@type_validator('integer') -def validate_integer(s, min=None, max=None): - if isinstance(s, int): - return s - - leading_whitespace_len = 0 - while leading_whitespace_len < len(s) \ - and s[leading_whitespace_len].isspace(): - leading_whitespace_len += 1 - - s = s.strip() - if s == '': - return InvalidValueError('Should not be empty') - - for i, c in enumerate(s): - if not c.isdigit() and not ((c == '-') and (i == 0)): - return ( - InvalidValueError( - 'Only digits are allowed, but found char "%s"' % - c, Mark('', 1, i + 1 + leading_whitespace_len)) - ) - - v = int(s) - if min and v < min: - return ( - InvalidValueError( - 'Should be greater than or equal to %d' % - min, Mark('', 1, leading_whitespace_len)) - ) - if max and v > max: - return ( - InvalidValueError( - 'Should be less than or equal to %d' % - max, Mark('', 1, leading_whitespace_len)) - ) - - return v - - -@type_validator('file_mode') -def validate_file_mode(s): - return validate_integer(s) - - -@type_validator('float') -def validate_float(s): - if isinstance(s, float): - return s - - # TODO(someone): Implement proper validation - return float(s) - - -@type_validator('port', base_type='integer') -def validate_port(s, min=1, max=65535): - return validate_integer(s, min=min, max=max) - - -def validate_list(s, element_type): - if isinstance(s, list): - return s - - element_type_validator = TypeValidatorRegistry.get_validator(element_type) - if not element_type_validator: - return SchemaIssue('Invalid element type "%s"' % element_type) - - result = [] - s = s.strip() - - if s == '': - return result - - values = s.split(',') - while len(values) > 0: - value = values.pop(0) - while True: - validated_value = element_type_validator.validate(value.strip()) - if not isinstance(validated_value, Issue): - break - - if len(values) == 0: - # TODO(someone): provide better position reporting - return validated_value - - value += ',' + values.pop() - - result.append(validated_value) - - return result - - -@type_validator('string_list', base_type='list') -def validate_string_list(s): - return validate_list(s, element_type='string') - - -@type_validator('string_dict', base_type='multi') -def validate_dict(s, element_type='string'): - if isinstance(s, dict): - return s - - element_type_validator = TypeValidatorRegistry.get_validator(element_type) - if not element_type_validator: - return SchemaIssue('Invalid element type "%s"' % element_type) - - result = {} - s = s.strip() - - if s == '': - return result - - pairs = s.split(',') - for pair in pairs: - key_value = pair.split(':', 2) - if len(key_value) < 2: - return ( - InvalidValueError( - 'Value should be NAME:VALUE pairs separated by ","') - ) - - key, value = key_value - key = key.strip() - value = value.strip() - - if key == '': - # TODO(someone): provide better position reporting - return InvalidValueError('Key name should not be empty') - - validated_value = element_type_validator.validate(value) - if isinstance(validated_value, Issue): - # TODO(someone): provide better position reporting - return validated_value - result[key] = validated_value - return result - - -@type_validator('rabbitmq_bind', base_type='string') -def validate_rabbitmq_bind(s): - m = re.match('\d+', s) - if m: - port = validate_port(s) - if isinstance(port, Issue): - return port - - return ('0.0.0.0', port) - - m = re.match('{\s*\"(.+)\"\s*,\s*(\d+)\s*}', s) - if m: - host = validate_host_address(m.group(1)) - port = validate_port(m.group(2)) - - if isinstance(host, Issue): - return host - - if isinstance(port, Issue): - return port - - return (host, port) - - return SchemaIssue("Unrecognized bind format") - - -def validate_rabbitmq_list(s, element_type): - if isinstance(s, list): - return s - - if not (s.startswith('[') and s.endswith(']')): - return SchemaIssue('List should be surrounded by [ and ]') - - return validate_list(s[1:-1], element_type=element_type) - - -@type_validator('rabbitmq_bind_list', base_type='list') -def validate_rabbitmq_bind_list(s): - return validate_rabbitmq_list(s, element_type='rabbitmq_bind') diff --git a/rubick/schemas/__init__.py b/rubick/schemas/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/rubick/schemas/cinder/2013.1.3.yml b/rubick/schemas/cinder/2013.1.3.yml deleted file mode 100644 index eda886b..0000000 --- a/rubick/schemas/cinder/2013.1.3.yml +++ /dev/null @@ -1,1889 +0,0 @@ -project: cinder -version: '2013.1.3' -parameters: - - - name: fatal_exception_format_errors - type: boolean - default: false - help: 'make exception message format errors fatal' - - - name: policy_file - type: string - default: 'policy.json' - help: 'JSON file representing policy' - - - name: policy_default_rule - type: string - default: 'default' - help: 'Rule checked when requested rule is not found' - - - name: quota_volumes - type: integer - default: 10 - help: 'number of volumes allowed per project' - - - name: quota_snapshots - type: integer - default: 10 - help: 'number of volume snapshots allowed per project' - - - name: quota_gigabytes - type: integer - default: 1000 - help: 'number of volume gigabytes' - - - name: reservation_expire - type: integer - default: 86400 - help: 'number of seconds until a reservation expires' - - - name: until_refresh - type: integer - default: 0 - help: 'count of reservations until usage is refreshed' - - - name: max_age - type: integer - default: 0 - help: 'number of seconds between subsequent usage refreshes' - - - name: quota_driver - type: string - default: 'cinder_2013_1_3.quota.DbQuotaDriver' - help: 'default driver to use for quota checks' - - - name: use_default_quota_class - type: boolean - default: true - help: 'whether to use default quota class for default quota' - - - name: report_interval - type: integer - default: 10 - help: 'seconds between nodes reporting state to datastore' - - - name: periodic_interval - type: integer - default: 60 - help: 'seconds between running periodic tasks' - - - name: periodic_fuzzy_delay - type: integer - default: 60 - help: 'range of seconds to randomly delay when starting the periodic task scheduler to reduce stampeding.' - - - name: osapi_volume_listen - type: string - default: '0.0.0.0' - help: 'IP address for OpenStack Volume API to listen' - - - name: osapi_volume_listen_port - type: integer - default: 8776 - help: 'port for os volume api to listen' - - - name: sqlite_clean_db - type: string - default: 'clean.sqlite' - help: 'File name of clean sqlite db' - - - name: fake_tests - type: boolean - default: true - help: 'should we use everything for testing' - - - name: backlog - type: integer - default: 4096 - help: 'Number of backlog requests to configure the socket with' - - - name: tcp_keepidle - type: integer - default: 600 - help: 'Sets the value of TCP_KEEPIDLE in seconds for each server socket. Not supported on OS X.' - - - name: ssl_ca_file - type: string - default: ~ - help: 'CA certificate file to use to verify connecting clients' - - - name: ssl_cert_file - type: string - default: ~ - help: 'Certificate file to use when starting the server securely' - - - name: ssl_key_file - type: string - default: ~ - help: 'Private key file to use when starting the server securely' - - - name: osapi_max_limit - type: integer - default: 1000 - help: 'the maximum number of items returned in a single response from a collection resource' - - - name: osapi_volume_base_URL - type: string - default: ~ - help: 'Base URL that will be presented to users in links to the OpenStack Volume API' - - - name: use_forwarded_for - type: boolean - default: false - help: 'Treat X-Forwarded-For as the canonical remote address. Only enable this if you have a sanitizing proxy.' - - - name: osapi_max_request_body_size - type: integer - default: 114688 - help: 'Max size for body of a request' - - - name: backup_ceph_conf - type: string - default: '/etc/ceph/ceph.conf' - help: 'Ceph config file to use.' - - - name: backup_ceph_user - type: string - default: 'cinder' - help: 'the Ceph user to connect with' - - - name: backup_ceph_chunk_size - type: integer - default: 134217728 - help: 'the chunk size in bytes that a backup will be broken into before transfer to backup store' - - - name: backup_ceph_pool - type: string - default: 'backups' - help: 'the Ceph pool to backup to' - - - name: backup_ceph_stripe_unit - type: integer - default: 0 - help: 'RBD stripe unit to use when creating a backup image' - - - name: backup_ceph_stripe_count - type: integer - default: 0 - help: 'RBD stripe count to use when creating a backup image' - - - name: restore_discard_excess_bytes - type: boolean - default: true - help: 'If True, always discard excess bytes when restoring volumes.' - - - name: backup_swift_url - type: string - default: 'http://localhost:8080/v1/AUTH_' - help: 'The URL of the Swift endpoint' - - - name: backup_swift_auth - type: string - default: 'per_user' - help: 'Swift authentication mechanism' - - - name: backup_swift_user - type: string - default: ~ - help: 'Swift user name' - - - name: backup_swift_key - type: string - default: ~ - help: 'Swift key for authentication' - - - name: backup_swift_container - type: string - default: 'volumebackups' - help: 'The default Swift container to use' - - - name: backup_swift_object_size - type: integer - default: 52428800 - help: 'The size in bytes of Swift backup objects' - - - name: backup_swift_retry_attempts - type: integer - default: 3 - help: 'The number of retries to make for Swift operations' - - - name: backup_swift_retry_backoff - type: integer - default: 2 - help: 'The backoff time in seconds between Swift retries' - - - name: backup_compression_algorithm - type: string - default: 'zlib' - help: 'Compression algorithm' - - - name: backup_tsm_volume_prefix - type: string - default: 'backup' - help: 'Volume prefix for the backup id when backing up to TSM' - - - name: backup_tsm_password - type: string - default: 'password' - help: 'TSM password for the running username' - - - name: backup_tsm_compression - type: boolean - default: true - help: 'Enable or Disable compression for backups' - - - name: backup_driver - type: string - default: 'cinder_2013_1_3.backup.drivers.swift_proxy_server' - help: 'Driver to use for backups.' - - - name: num_volume_device_scan_tries - type: integer - default: 3 - help: 'The maximum number of times to rescan targetsto find volume' - - - name: iscsi_helper - type: string - default: 'tgtadm' - help: 'iscsi target user-land tool to use' - - - name: volumes_dir - type: string - default: '$state_path/volumes' - help: 'Volume configuration file storage directory' - - - name: iet_conf - type: string - default: '/etc/iet/ietd.conf' - help: 'IET configuration file' - - - name: lio_initiator_iqns - type: string - default: '' - help: 'Comma-separatd list of initiator IQNs allowed to connect to the iSCSI target.' - - - name: iscsi_iotype - type: string - default: 'fileio' - help: 'Sets the behavior of the iSCSI target to either perform blockio or fileio optionally, auto can be set and Cinder will autodetect type of backing device' - - - name: iser_helper - type: string - default: 'tgtadm' - help: 'iser target user-land tool to use' - - - name: nfs_mount_point_base - type: string - default: '$state_path/mnt' - help: 'Base dir containing mount points for nfs shares' - - - name: nfs_mount_options - type: string - default: ~ - help: 'Mount options passed to the nfs client. See section of the nfs man page for details' - - - name: glusterfs_mount_point_base - type: string - default: '$state_path/mnt' - help: 'Base dir containing mount points for gluster shares' - - - name: connection_type - type: string - default: ~ - help: 'Virtualization api connection type : libvirt, xenapi, or fake' - - - name: api_paste_config - type: string - default: 'api-paste.ini' - help: 'File name for the paste.deploy config for cinder-api' - - - name: pybasedir - type: string - default: '/usr/lib/python/site-packages' - help: 'Directory where the cinder python module is installed' - - - name: bindir - type: string - default: '$pybasedir/bin' - help: 'Directory where cinder binaries are installed' - - - name: state_path - type: string - default: '$pybasedir' - help: "Top-level directory for maintaining cinder's state" - - - name: my_ip - type: string - default: '10.0.0.1' - help: 'ip address of this host' - - - name: glance_host - type: string - default: '$my_ip' - help: 'default glance hostname or ip' - - - name: glance_port - type: integer - default: 9292 - help: 'default glance port' - - - name: glance_api_servers - type: list - default: '$glance_host:$glance_port' - help: 'A list of the glance api servers available to cinder' - - - name: glance_api_version - type: integer - default: 1 - help: 'Version of the glance api to use' - - - name: glance_num_retries - type: integer - default: 0 - help: 'Number retries when downloading an image from glance' - - - name: glance_api_insecure - type: boolean - default: false - help: 'Allow to perform insecure SSL' - - - name: glance_api_ssl_compression - type: boolean - default: false - help: 'Whether to attempt to negotiate SSL layer compression when using SSL' - - - name: glance_request_timeout - type: integer - default: ~ - help: 'http/https timeout value for glance operations. If no value' - - - name: scheduler_topic - type: string - default: 'cinder-scheduler' - help: 'the topic scheduler nodes listen on' - - - name: volume_topic - type: string - default: 'cinder-volume' - help: 'the topic volume nodes listen on' - - - name: backup_topic - type: string - default: 'cinder-backup' - help: 'the topic volume backup nodes listen on' - - - name: enable_v1_api - type: boolean - default: true - help: 'Deploy v1 of the Cinder API. ' - - - name: enable_v2_api - type: boolean - default: true - help: 'Deploy v2 of the Cinder API. ' - - - name: api_rate_limit - type: boolean - default: true - help: 'whether to rate limit the api' - - - name: osapi_volume_ext_list - type: list - default: '' - help: 'Specify list of extensions to load when using osapi_volume_extension option with cinder_2013_1_3.api.contrib.select_extensions' - - - name: osapi_volume_extension - type: multi - default: 'cinder_2013_1_3.api.contrib.standard_extensions' - help: 'osapi volume extension to load' - - - name: volume_manager - type: string - default: 'cinder_2013_1_3.volume.manager.VolumeManager' - help: 'full class name for the Manager for volume' - - - name: backup_manager - type: string - default: 'cinder_2013_1_3.backup.manager.BackupManager' - help: 'full class name for the Manager for volume backup' - - - name: scheduler_manager - type: string - default: 'cinder_2013_1_3.scheduler.manager.SchedulerManager' - help: 'full class name for the Manager for scheduler' - - - name: host - type: string - default: '127.0.0.1' - help: 'Host to locate redis' - - - name: storage_availability_zone - type: string - default: 'nova' - help: 'availability zone of this node' - - - name: default_availability_zone - type: string - default: ~ - help: 'default availability zone to use when creating a new volume. If this is not set then we use the value from the storage_availability_zone option as the default availability_zone for new volumes.' - - - name: memcached_servers - type: list - default: ~ - help: 'Memcached servers or None for in process cache.' - - - name: default_volume_type - type: string - default: ~ - help: 'default volume type to use' - - - name: volume_usage_audit_period - type: string - default: 'month' - help: 'time period to generate volume usages for. Time period must be hour, day, month or year' - - - name: root_helper - type: string - default: 'sudo' - help: 'Deprecated: command to use for running commands as root' - - - name: rootwrap_config - type: string - default: '/etc/cinder/rootwrap.conf' - help: 'Path to the rootwrap configuration file to use for running commands as root' - - - name: monkey_patch - type: boolean - default: false - help: 'Enable monkey patching' - - - name: monkey_patch_modules - type: list - default: '' - help: 'List of modules/decorators to monkey patch' - - - name: service_down_time - type: integer - default: 60 - help: 'maximum time since last check-in for up service' - - - name: volume_api_class - type: string - default: 'cinder_2013_1_3.volume.api.API' - help: 'The full class name of the volume API class to use' - - - name: backup_api_class - type: string - default: 'cinder_2013_1_3.backup.api.API' - help: 'The full class name of the volume backup API class' - - - name: auth_strategy - type: string - default: 'noauth' - help: 'The strategy to use for auth. Supports noauth, keystone, and deprecated.' - - - name: enabled_backends - type: list - default: ~ - help: 'A list of backend names to use. These backend names should be backed by a unique [CONFIG] group with its options' - - - name: no_snapshot_gb_quota - type: boolean - default: false - help: 'Whether snapshots count against GigaByte quota' - - - name: transfer_api_class - type: string - default: 'cinder_2013_1_3.transfer.api.API' - help: 'The full class name of the volume transfer API class' - - - name: compute_api_class - type: string - default: 'cinder_2013_1_3.compute.nova.API' - help: 'The full class name of the compute API class to use' - - - name: nova_catalog_info - type: string - default: 'compute:nova:publicURL' - help: 'Info to match when looking for nova in the service catalog. Format is : separated values of the form: ::' - - - name: nova_catalog_admin_info - type: string - default: 'compute:nova:adminURL' - help: 'Same as nova_catalog_info, but for admin endpoint.' - - - name: nova_endpoint_template - type: string - default: ~ - help: 'Override service catalog lookup with template for nova endpoint e.g. http://localhost:8774/v2/%(tenant_id)s' - - - name: nova_endpoint_admin_template - type: string - default: ~ - help: 'Same as nova_endpoint_template, but for admin endpoint.' - - - name: os_region_name - type: string - default: ~ - help: 'region name of this node' - - - name: nova_ca_certificates_file - type: string - default: ~ - help: 'Location of ca certicates file to use for nova client requests.' - - - name: nova_api_insecure - type: boolean - default: false - help: 'Allow to perform insecure SSL requests to nova' - - - name: db_backend - type: string - default: 'sqlalchemy' - help: 'The backend to use for db' - - - name: enable_new_services - type: boolean - default: true - help: 'Services to be added to the available pool on create' - - - name: volume_name_template - type: string - default: 'volume-%s' - help: 'Template string to be used to generate volume names' - - - name: snapshot_name_template - type: string - default: 'snapshot-%s' - help: 'Template string to be used to generate snapshot names' - - - name: backup_name_template - type: string - default: 'backup-%s' - help: 'Template string to be used to generate backup names' - - - name: db_driver - type: string - default: 'cinder_2013_1_3.db' - help: 'driver to use for database access' - - - name: allowed_direct_url_schemes - type: list - default: '' - help: 'A list of url schemes that can be downloaded directly via the direct_url. Currently supported schemes: [file].' - - - name: image_conversion_dir - type: string - default: '$state_path/conversion' - help: 'Directory used for temporary storage during image conversion' - - - name: keymgr_api_class - type: string - default: 'cinder_2013_1_3.keymgr.not_implemented_key_mgr.NotImplementedKeyManager' - help: 'The full class name of the key manager API class' - - - name: backend - type: string - default: 'sqlalchemy' - help: 'The backend to use for db' - - - name: use_tpool - type: boolean - default: false - help: 'Enable the experimental use of thread pooling for all DB API calls' - - - name: connection - type: string - default: 'sqlite:////cinder/openstack/common/db/$sqlite_db' - help: 'The SQLAlchemy connection string used to connect to the database' - - - name: sql_connection - type: string - default: 'sqlite:////nova/openstack/common/db/$sqlite_db' - help: 'The SQLAlchemy connection string used to connect to the database' - - - name: idle_timeout - type: integer - default: 3600 - help: 'timeout before idle sql connections are reaped' - - - name: min_pool_size - type: integer - default: 1 - help: 'Minimum number of SQL connections to keep open in a pool' - - - name: max_pool_size - type: integer - default: 5 - help: 'Maximum number of SQL connections to keep open in a pool' - - - name: max_retries - type: integer - default: 10 - help: 'maximum db connection retries during startup.' - - - name: retry_interval - type: integer - default: 10 - help: 'interval between retries of opening a sql connection' - - - name: max_overflow - type: integer - default: ~ - help: 'If set, use this value for max_overflow with sqlalchemy' - - - name: connection_debug - type: integer - default: 0 - help: 'Verbosity of SQL debugging information. 0=None, 100=Everything' - - - name: connection_trace - type: boolean - default: false - help: 'Add python stack traces to SQL as comment strings' - - - name: sqlite_db - type: string - default: 'cinder_2013_1_3.sqlite' - help: 'the filename to use with sqlite' - - - name: sqlite_synchronous - type: boolean - default: true - help: 'If true, use synchronous mode for sqlite' - - - name: backdoor_port - type: integer - default: ~ - help: 'port for eventlet backdoor to listen' - - - name: disable_process_locking - type: boolean - default: false - help: 'Whether to disable inter-process locks' - - - name: lock_path - type: string - default: ~ - help: 'Directory to use for lock files. Default to a temp directory' - - - name: debug - type: boolean - default: false - help: 'Print debugging output' - - - name: verbose - type: boolean - default: false - help: 'Print more verbose output' - - - name: use_stderr - type: boolean - default: true - help: 'Log output to standard error' - - - name: logging_context_format_string - type: string - 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' - - - name: logging_default_format_string - type: string - default: '%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s' - help: 'format string to use for log messages without context' - - - name: logging_debug_format_suffix - type: string - default: '%(funcName)s %(pathname)s:%(lineno)d' - help: 'data to append to log format when level is DEBUG' - - - name: logging_exception_prefix - type: string - default: '%(asctime)s.%(msecs)03d %(process)d TRACE %(name)s %(instance)s' - help: 'prefix each line of exception output with this format' - - - name: default_log_levels - type: list - default: 'amqplibWARN,sqlalchemyWARN,botoWARN,sudsINFO,keystoneINFO,eventlet.wsgi.serverWARN' - help: 'list of logger=LEVEL pairs' - - - name: publish_errors - type: boolean - default: false - help: 'publish error events' - - - name: fatal_deprecations - type: boolean - default: false - help: 'make deprecations fatal' - - - name: instance_format - type: string - default: '"[instance: %(uuid)s] "' - help: 'If an instance is passed with the log message, format it like this' - - - name: instance_uuid_format - type: string - default: '"[instance: %(uuid)s] "' - help: 'If an instance UUID is passed with the log message, format it like this' - - - name: log_config - type: string - default: ~ - help: 'If this option is specified, the logging configuration file specified is used and overrides any other logging options specified. Please see the Python logging module documentation for details on logging configuration files.' - - - name: log_format - type: string - default: ~ - help: 'A logging.Formatter log message format string which may use any of the available logging.LogRecord attributes. This option is deprecated. Please use logging_context_format_string and logging_default_format_string instead.' - - - name: log_date_format - type: string - default: '%Y-%m-%d %H:%M:%S' - help: 'Format string for %%(asctime)s in log records. Default: %(default)s' - - - name: log_file - type: string - default: ~ - help: '(Optional) Name of log file to output to. If no default is set, logging will go to stdout.' - - - name: log_dir - type: string - default: ~ - help: '(Optional) The base directory used for relative --log-file paths' - - - name: use_syslog - type: boolean - default: false - help: 'Use syslog for logging.' - - - name: syslog_log_facility - type: string - default: 'LOG_USER' - help: 'syslog facility to receive log lines' - - - name: default_notification_level - type: string - default: 'INFO' - help: 'Default notification level for outgoing notifications' - - - name: default_publisher_id - type: string - default: ~ - help: 'Default publisher_id for outgoing notifications' - - - name: notification_topics - type: list - default: 'notifications' - help: 'AMQP topic used for OpenStack notifications' - - - name: topics - type: list - default: 'notifications' - help: 'AMQP topic(s) used for OpenStack notifications' - - - name: run_external_periodic_tasks - type: boolean - default: true - help: 'Some periodic tasks can be run in a separate process. Should we run them here?' - - - name: rpc_backend - type: string - default: 'cinder_2013_1_3.openstack.common.rpc.impl_kombu' - help: 'The messaging module to use, defaults to kombu.' - - - name: rpc_thread_pool_size - type: integer - default: 64 - help: 'Size of RPC thread pool' - - - name: rpc_conn_pool_size - type: integer - default: 30 - help: 'Size of RPC connection pool' - - - name: rpc_response_timeout - type: integer - default: 60 - help: 'Seconds to wait for a response from call or multicall' - - - name: rpc_cast_timeout - type: integer - default: 30 - help: 'Seconds to wait before a cast expires' - - - name: allowed_rpc_exception_modules - type: list - default: 'cinder_2013_1_3.openstack.common.exception,nova.exception,cinder_2013_1_3.exception,exceptions' - help: 'Modules of exceptions that are permitted to be recreatedupon receiving exception data from an rpc call.' - - - name: fake_rabbit - type: boolean - default: false - help: 'If passed, use a fake RabbitMQ provider' - - - name: control_exchange - type: string - default: 'openstack' - help: 'AMQP exchange to connect to if using RabbitMQ or Qpid' - - - name: amqp_rpc_single_reply_queue - type: boolean - default: false - help: 'Enable a fast single reply queue if using AMQP based RPC like RabbitMQ or Qpid.' - - - name: amqp_durable_queues - type: boolean - default: false - help: 'Use durable queues in amqp.' - - - name: amqp_auto_delete - type: boolean - default: false - help: 'Auto-delete queues in amqp.' - - - name: kombu_ssl_version - type: string - default: '' - help: 'SSL version to use' - - - name: kombu_ssl_keyfile - type: string - default: '' - help: 'SSL key file' - - - name: kombu_ssl_certfile - type: string - default: '' - help: 'SSL cert file' - - - name: kombu_ssl_ca_certs - type: string - default: '' - help: 'SSL certification authority file' - - - name: rabbit_host - type: string - default: 'localhost' - help: 'The RabbitMQ broker address where a single node is used' - - - name: rabbit_port - type: integer - default: 5672 - help: 'The RabbitMQ broker port where a single node is used' - - - name: rabbit_hosts - type: list - default: '$rabbit_host:$rabbit_port' - help: 'RabbitMQ HA cluster host:port pairs' - - - name: rabbit_use_ssl - type: boolean - default: false - help: 'connect over SSL for RabbitMQ' - - - name: rabbit_userid - type: string - default: 'guest' - help: 'the RabbitMQ userid' - - - name: rabbit_password - type: string - default: 'guest' - help: 'the RabbitMQ password' - - - name: rabbit_virtual_host - type: string - default: '/' - help: 'the RabbitMQ virtual host' - - - name: rabbit_retry_interval - type: integer - default: 1 - help: 'how frequently to retry connecting with RabbitMQ' - - - name: rabbit_retry_backoff - type: integer - default: 2 - help: 'how long to backoff for between retries when connecting to RabbitMQ' - - - name: rabbit_max_retries - type: integer - default: 0 - help: 'maximum retries with trying to connect to RabbitMQ' - - - name: rabbit_ha_queues - type: boolean - default: false - help: 'use H/A queues in RabbitMQ' - - - name: qpid_hostname - type: string - default: 'localhost' - help: 'Qpid broker hostname' - - - name: qpid_port - type: integer - default: 5672 - help: 'Qpid broker port' - - - name: qpid_hosts - type: list - default: '$qpid_hostname:$qpid_port' - help: 'Qpid HA cluster host:port pairs' - - - name: qpid_username - type: string - default: '' - help: 'Username for qpid connection' - - - name: qpid_password - type: string - default: '' - help: 'Password for qpid connection' - - - name: qpid_sasl_mechanisms - type: string - default: '' - help: 'Space separated list of SASL mechanisms to use for auth' - - - name: qpid_heartbeat - type: integer - default: 60 - help: 'Seconds between connection keepalive heartbeats' - - - name: qpid_protocol - type: string - default: 'tcp' - help: "Transport to use, either 'tcp' or 'ssl'" - - - name: qpid_tcp_nodelay - type: boolean - default: true - help: 'Disable Nagle algorithm' - - - name: qpid_topology_version - type: integer - default: 1 - help: 'The qpid topology version to use. Version 1 is what was originally used by impl_qpid. Version 2 includes some backwards-incompatible changes that allow broker federation to work. Users should update to version 2 when they are able to take everything down, as it requires a clean break.' - - - name: rpc_zmq_bind_address - type: string - default: '*' - help: 'ZeroMQ bind address. Should be a wildcard' - - - name: rpc_zmq_matchmaker - type: string - default: 'cinder_2013_1_3.openstack.common.rpc.matchmaker.MatchMakerLocalhost' - help: 'MatchMaker driver' - - - name: rpc_zmq_port - type: integer - default: 9501 - help: 'ZeroMQ receiver listening port' - - - name: rpc_zmq_contexts - type: integer - default: 1 - help: 'Number of ZeroMQ contexts, defaults to 1' - - - name: rpc_zmq_topic_backlog - type: integer - default: ~ - help: 'Maximum number of ingress messages to locally buffer per topic. Default is unlimited.' - - - name: rpc_zmq_ipc_dir - type: string - default: '/var/run/openstack' - help: 'Directory for holding IPC sockets' - - - name: rpc_zmq_host - type: string - default: 'cinder' - help: "Name of this node. Must be a valid hostname, FQDN, or IP address. Must match 'host' option, if running Nova." - - - name: matchmaker_ringfile - type: string - default: '/etc/nova/matchmaker_ring.json' - help: 'Matchmaker ring file' - - - name: matchmaker_heartbeat_freq - type: integer - default: 300 - help: 'Heartbeat frequency' - - - name: matchmaker_heartbeat_ttl - type: integer - default: 600 - help: 'Heartbeat time-to-live.' - - - name: port - type: integer - default: 6379 - help: 'Use this port to connect to redis host.' - - - name: password - type: string - default: ~ - help: 'Password for Redis server.' - - - name: scheduler_host_manager - type: string - default: 'cinder_2013_1_3.scheduler.host_manager.HostManager' - help: 'The scheduler host manager class to use' - - - name: scheduler_max_attempts - type: integer - default: 3 - help: 'Maximum number of attempts to schedule an volume' - - - name: scheduler_default_filters - type: list - default: 'AvailabilityZoneFilter,CapacityFilter,CapabilitiesFilter' - help: 'Which filter class names to use for filtering hosts when not specified in the request.' - - - name: scheduler_default_weighers - type: list - default: 'CapacityWeigher' - help: 'Which weigher class names to use for weighing hosts.' - - - name: scheduler_driver - type: string - default: 'cinder_2013_1_3.scheduler.filter_scheduler.FilterScheduler' - help: 'Default scheduler driver to use' - - - name: scheduler_json_config_location - type: string - default: '' - help: 'Absolute path to scheduler configuration JSON file.' - - - name: max_gigabytes - type: integer - default: 10000 - help: 'maximum number of volume gigabytes to allow per host' - - - name: capacity_weight_multiplier - type: float - default: 1.0 - help: 'Multiplier used for weighing volume capacity. Negative numbers mean to stack vs spread.' - - - name: volume_transfer_salt_length - type: integer - default: 8 - help: 'The number of characters in the salt.' - - - name: volume_transfer_key_length - type: integer - default: 16 - help: 'The number of characters in the autogenerated auth key.' - - - name: snapshot_same_host - type: boolean - default: true - help: 'Create volume from snapshot at the host where snapshot resides' - - - name: cloned_volume_same_az - type: boolean - default: true - help: 'Ensure that the new volumes are the same AZ as snapshot or source volume' - - - name: num_shell_tries - type: integer - default: 3 - help: 'number of times to attempt to run flakey shell commands' - - - name: reserved_percentage - type: integer - default: 0 - help: 'The percentage of backend capacity is reserved' - - - name: iscsi_num_targets - type: integer - default: 100 - help: 'The maximum number of iscsi target ids per host' - - - name: iscsi_target_prefix - type: string - default: 'iqn.2010-10.org.openstack:' - help: 'prefix for iscsi volumes' - - - name: iscsi_ip_address - type: string - default: '$my_ip' - help: 'The IP address that the iSCSI daemon is listening on' - - - name: iscsi_port - type: integer - default: 3260 - help: 'The port that the iSCSI daemon is listening on' - - - name: num_iser_scan_tries - type: integer - default: 3 - help: 'The maximum number of times to rescan iSER targetto find volume' - - - name: iser_num_targets - type: integer - default: 100 - help: 'The maximum number of iser target ids per host' - - - name: iser_target_prefix - type: string - default: 'iqn.2010-10.org.iser.openstack:' - help: 'prefix for iser volumes' - - - name: iser_ip_address - type: string - default: '$my_ip' - help: 'The IP address that the iSER daemon is listening on' - - - name: iser_port - type: integer - default: 3260 - help: 'The port that the iSER daemon is listening on' - - - name: volume_backend_name - type: string - default: ~ - help: 'The backend name for a given driver implementation' - - - name: use_multipath_for_image_xfer - type: boolean - default: false - help: 'Do we attach/detach volumes in cinder using multipath for volume to image and image to volume transfers?' - - - name: volume_clear - type: string - default: 'zero' - help: 'Method used to wipe old voumes' - - - name: volume_clear_size - type: integer - default: 0 - help: 'Size in MiB to wipe at start of old volumes. 0 => all' - - - name: available_devices - type: list - default: '' - help: 'List of all available devices' - - - name: coraid_esm_address - type: string - default: '' - help: 'IP address of Coraid ESM' - - - name: coraid_user - type: string - default: 'admin' - help: 'User name to connect to Coraid ESM' - - - name: coraid_group - type: string - default: 'admin' - help: 'Name of group on Coraid ESM to which coraid_user belongs' - - - name: coraid_password - type: string - default: 'password' - help: 'Password to connect to Coraid ESM' - - - name: coraid_repository_key - type: string - default: 'coraid_repository' - help: 'Volume Type key name to store ESM Repository Name' - - - name: eqlx_group_name - type: string - default: 'group-0' - help: 'Group name to use for creating volumes' - - - name: eqlx_cli_timeout - type: integer - default: 30 - help: 'Timeout for the Group Manager cli command execution' - - - name: eqlx_cli_max_retries - type: integer - default: 5 - help: 'Maximum retry count for reconnection' - - - name: eqlx_use_chap - type: boolean - default: false - help: 'Use CHAP authentificaion for targets?' - - - name: eqlx_chap_login - type: string - default: 'admin' - help: 'Existing CHAP account name' - - - name: eqlx_chap_password - type: string - default: 'password' - help: 'Password for specified CHAP account name' - - - name: eqlx_pool - type: string - default: 'default' - help: 'Pool in which volumes will be created' - - - name: glusterfs_shares_config - type: string - default: '/etc/cinder/glusterfs_shares' - help: 'File with the list of available gluster shares' - - - name: glusterfs_disk_util - type: string - default: 'df' - help: 'Use du or df for free space calculation' - - - name: glusterfs_sparsed_volumes - type: boolean - default: true - help: 'Create volumes as sparsed files which take no space.If set to False volume is created as regular file.In such case volume creation takes a lot of time.' - - - name: glusterfs_qcow2_volumes - type: boolean - default: false - help: 'Create volumes as QCOW2 files rather than raw files.' - - - name: gpfs_mount_point_base - type: string - default: ~ - help: 'Path to the directory on GPFS mount point where volumes are stored' - - - name: gpfs_images_dir - type: string - default: ~ - help: 'Path to GPFS Glance repository as mounted on Nova nodes' - - - name: gpfs_images_share_mode - type: string - default: ~ - help: 'Set this if Glance image repo is on GPFS as well so that the image bits can be transferred efficiently between Glance and cinder_2013_1_3. Valid values are copy or copy_on_write. copy performs a full copy of the image, copy_on_write efficiently shares unmodified blocks of the image.' - - - name: gpfs_max_clone_depth - type: integer - default: 0 - help: 'A lengthy chain of copy-on-write snapshots or clones could have impact on performance. This option limits the number of indirections required to reach a specific block. 0 indicates unlimited.' - - - name: gpfs_sparse_volumes - type: boolean - default: true - help: 'Create volumes as sparse files which take no space. If set to False volume is created as regular file. In this case volume creation may take a significantly longer time.' - - - name: hds_cinder_config_file - type: string - default: '/opt/hds/hus/cinder_hus_conf.xml' - help: 'configuration file for HDS cinder plugin for HUS' - - - name: cinder_huawei_conf_file - type: string - default: '/etc/cinder/cinder_huawei_conf.xml' - help: 'config data for cinder huawei plugin' - - - name: volume_group - type: string - default: 'cinder-volumes' - help: 'Name for the VG that will contain exported volumes' - - - name: pool_size - type: string - default: ~ - help: 'Size of thin provisioning pool' - - - name: lvm_mirrors - type: integer - default: 0 - help: 'If set, create lvms with multiple mirrors. Note that this requires lvm_mirrors + 2 pvs with available space' - - - name: lvm_type - type: string - default: 'default' - help: 'Type of LVM volumes to deploy;' - - - name: netapp_vfiler - type: string - default: ~ - help: 'Vfiler to use for provisioning' - - - name: netapp_login - type: string - default: ~ - help: 'User name for the storage controller' - - - name: netapp_password - type: string - default: ~ - help: 'Password for the storage controller' - - - name: netapp_vserver - type: string - default: ~ - help: 'Cluster vserver to use for provisioning' - - - name: netapp_server_hostname - type: string - default: ~ - help: 'Host name for the storage controller' - - - name: netapp_server_port - type: integer - default: 80 - help: 'Port number for the storage controller' - - - name: thres_avl_size_perc_start - type: integer - default: 20 - help: 'Threshold available percent to start cache cleaning.' - - - name: thres_avl_size_perc_stop - type: integer - default: 60 - help: 'Threshold available percent to stop cache cleaning.' - - - name: expiry_thres_minutes - type: integer - default: 720 - help: 'Threshold minutes after which cache file can be cleaned.' - - - name: netapp_size_multiplier - type: float - default: 1.2 - help: 'Volume size multiplier to ensure while creation' - - - name: netapp_volume_list - type: string - default: ~ - help: 'Comma separated volumes to be used for provisioning' - - - name: netapp_storage_family - type: string - default: 'ontap_cluster' - help: 'Storage family type.' - - - name: netapp_storage_protocol - type: string - default: ~ - help: 'Storage protocol type.' - - - name: netapp_transport_type - type: string - default: 'http' - help: 'Transport type protocol' - - - name: nexenta_host - type: string - default: '' - help: 'IP address of Nexenta SA' - - - name: nexenta_rest_port - type: integer - default: 2000 - help: 'HTTP port to connect to Nexenta REST API server' - - - name: nexenta_rest_protocol - type: string - default: 'auto' - help: 'Use http or https for REST connection' - - - name: nexenta_user - type: string - default: 'admin' - help: 'User name to connect to Nexenta SA' - - - name: nexenta_password - type: string - default: 'nexenta' - help: 'Password to connect to Nexenta SA' - - - name: nexenta_iscsi_target_portal_port - type: integer - default: 3260 - help: 'Nexenta target portal port' - - - name: nexenta_volume - type: string - default: 'cinder' - help: 'pool on SA that will hold all volumes' - - - name: nexenta_target_prefix - type: string - default: 'iqn.1986-03.com.sun:02:cinder-' - help: 'IQN prefix for iSCSI targets' - - - name: nexenta_target_group_prefix - type: string - default: 'cinder/' - help: 'prefix for iSCSI target groups on SA' - - - name: nexenta_shares_config - type: string - default: '/etc/cinder/nfs_shares' - help: 'File with the list of available nfs shares' - - - name: nexenta_mount_point_base - type: string - default: '$state_path/mnt' - help: 'Base dir containing mount points for nfs shares' - - - name: nexenta_sparsed_volumes - type: boolean - default: true - help: 'Create volumes as sparsed files which take no space.If set to False volume is created as regular file.In such case volume creation takes a lot of time.' - - - name: nexenta_volume_compression - type: string - default: 'on' - help: 'Default compression value for new ZFS folders.' - - - name: nexenta_mount_options - type: string - default: ~ - help: 'Mount options passed to the nfs client. See section of the nfs man page for details' - - - name: nexenta_used_ratio - type: float - default: 0.95 - help: 'Percent of ACTUAL usage of the underlying volume before no new volumes can be allocated to the volume destination.' - - - name: nexenta_oversub_ratio - type: float - default: 1.0 - help: 'This will compare the allocated to available space on the volume destination. If the ratio exceeds this number, the destination will no longer be valid.' - - - name: nexenta_blocksize - type: string - default: '' - help: 'block size for volumes' - - - name: nexenta_sparse - type: boolean - default: false - help: 'flag to create sparse volumes' - - - name: nfs_shares_config - type: string - default: '/etc/cinder/nfs_shares' - help: 'File with the list of available nfs shares' - - - name: nfs_sparsed_volumes - type: boolean - default: true - help: 'Create volumes as sparsed files which take no space.If set to False volume is created as regular file.In such case volume creation takes a lot of time.' - - - name: nfs_used_ratio - type: float - default: 0.95 - help: 'Percent of ACTUAL usage of the underlying volume before no new volumes can be allocated to the volume destination.' - - - name: nfs_oversub_ratio - type: float - default: 1.0 - help: 'This will compare the allocated to available space on the volume destination. If the ratio exceeds this number, the destination will no longer be valid.' - - - name: rbd_pool - type: string - default: 'rbd' - help: 'the RADOS pool in which rbd volumes are stored' - - - name: rbd_user - type: string - default: ~ - help: 'the RADOS client name for accessing rbd volumes - only set when using cephx authentication' - - - name: rbd_ceph_conf - type: string - default: '' - help: 'path to the ceph configuration file to use' - - - name: rbd_flatten_volume_from_snapshot - type: boolean - default: false - help: 'flatten volumes created from snapshots to remove dependency' - - - name: rbd_secret_uuid - type: string - default: ~ - help: 'the libvirt uuid of the secret for the rbd_uservolumes' - - - name: volume_tmp_dir - type: string - default: ~ - help: 'where to store temporary image files if the volume driver does not write them directly to the volume' - - - name: rbd_max_clone_depth - type: integer - default: 5 - help: 'maximum number of nested clones that can be taken of a volume before enforcing a flatten prior to next clone. A value of zero disables cloning' - - - name: hp3par_api_url - type: string - default: '' - help: '3PAR WSAPI Server Url like https://<3par ip>:8080/api/v1' - - - name: hp3par_username - type: string - default: '' - help: '3PAR Super user username' - - - name: hp3par_password - type: string - default: '' - help: '3PAR Super user password' - - - name: hp3par_domain - type: string - default: ~ - help: 'This option is DEPRECATED and no longer used. The 3par domain name to use.' - - - name: hp3par_cpg - type: string - default: 'OpenStack' - help: 'The CPG to use for volume creation' - - - name: hp3par_cpg_snap - type: string - default: '' - help: 'The CPG to use for Snapshots for volumes. If empty hp3par_cpg will be used' - - - name: hp3par_snapshot_retention - type: string - default: '' - help: "The time in hours to retain a snapshot. You can't delete it before this expires." - - - name: hp3par_snapshot_expiration - type: string - default: '' - help: 'The time in hours when a snapshot expires and is deleted. This must be larger than expiration' - - - name: hp3par_debug - type: boolean - default: false - help: 'Enable HTTP debugging to 3PAR' - - - name: hp3par_iscsi_ips - type: list - default: '' - help: 'List of target iSCSI addresses to use.' - - - name: san_thin_provision - type: boolean - default: true - help: 'Use thin provisioning for SAN volumes?' - - - name: san_ip - type: string - default: '' - help: 'IP address of SAN controller' - - - name: san_login - type: string - default: 'admin' - help: 'Username for SAN controller' - - - name: san_password - type: string - default: '' - help: 'Password for SAN controller' - - - name: san_private_key - type: string - default: '' - help: 'Filename of private key to use for SSH authentication' - - - name: san_clustername - type: string - default: '' - help: 'Cluster name to use for creating volumes' - - - name: san_ssh_port - type: integer - default: 22 - help: 'SSH port to use with SAN' - - - name: san_is_local - type: boolean - default: false - help: 'Execute commands locally instead of over SSH; use if the volume service is running on the SAN device' - - - name: ssh_conn_timeout - type: integer - default: 30 - help: 'SSH connection timeout in seconds' - - - name: ssh_min_pool_conn - type: integer - default: 1 - help: 'Minimum ssh connections in the pool' - - - name: ssh_max_pool_conn - type: integer - default: 5 - help: 'Maximum ssh connections in the pool' - - - name: san_zfs_volume_base - type: string - default: 'rpool/' - help: 'The ZFS path under which to create zvols for volumes.' - - - name: scality_sofs_config - type: string - default: ~ - help: 'Path or URL to Scality SOFS configuration file' - - - name: scality_sofs_mount_point - type: string - default: '$state_path/scality' - help: 'Base dir where Scality SOFS shall be mounted' - - - name: scality_sofs_volume_dir - type: string - default: 'cinder/volumes' - help: 'Path from Scality SOFS root to volume dir' - - - name: sf_emulate_512 - type: boolean - default: true - help: 'Set 512 byte emulation on volume creation; ' - - - name: sf_allow_tenant_qos - type: boolean - default: false - help: 'Allow tenants to specify QOS on create' - - - name: sf_account_prefix - type: string - default: 'cinder' - help: 'Create SolidFire accounts with this prefix' - - - name: sf_api_port - type: integer - default: 443 - help: 'SolidFire API port. Useful if the device api is behind a proxy on a different port.' - - - name: storwize_svc_volpool_name - type: string - default: 'volpool' - help: 'Storage system storage pool for volumes' - - - name: storwize_svc_vol_rsize - type: integer - default: 2 - help: 'Storage system space-efficiency parameter for volumes' - - - name: storwize_svc_vol_warning - type: integer - default: 0 - help: 'Storage system threshold for volume capacity warnings' - - - name: storwize_svc_vol_autoexpand - type: boolean - default: true - help: 'Storage system autoexpand parameter for volumes' - - - name: storwize_svc_vol_grainsize - type: integer - default: 256 - help: 'Storage system grain size parameter for volumes' - - - name: storwize_svc_vol_compression - type: boolean - default: false - help: 'Storage system compression option for volumes' - - - name: storwize_svc_vol_easytier - type: boolean - default: true - help: 'Enable Easy Tier for volumes' - - - name: storwize_svc_vol_iogrp - type: integer - default: 0 - help: 'The I/O group in which to allocate volumes' - - - name: storwize_svc_flashcopy_timeout - type: integer - default: 120 - help: 'Maximum number of seconds to wait for FlashCopy to be prepared. Maximum value is 600 seconds' - - - name: storwize_svc_connection_protocol - type: string - default: 'iSCSI' - help: 'Connection protocol' - - - name: storwize_svc_multipath_enabled - type: boolean - default: false - help: 'Connect with multipath' - - - name: storwize_svc_multihostmap_enabled - type: boolean - default: true - help: 'Allows vdisk to multi host mapping' - - - name: vmware_host_ip - type: string - default: ~ - help: 'IP address for connecting to VMware ESX/VC server.' - - - name: vmware_host_username - type: string - default: ~ - help: 'Username for authenticating with VMware ESX/VC server.' - - - name: vmware_host_password - type: string - default: ~ - help: 'Password for authenticating with VMware ESX/VC server.' - - - name: vmware_wsdl_location - type: string - default: ~ - help: 'Optional VIM service WSDL Location e.g http:///vimService.wsdl. Optional over-ride to default location for bug work-arounds.' - - - name: vmware_api_retry_count - type: integer - default: 10 - help: 'Number of times VMware ESX/VC server API must be retried upon connection related issues.' - - - name: vmware_task_poll_interval - type: integer - default: 5 - help: 'The interval used for polling remote tasks invoked on VMware ESX/VC server.' - - - name: vmware_volume_folder - type: string - default: 'cinder-volumes' - help: 'Name for the folder in the VC datacenter that will contain cinder volumes.' - - - name: vmware_image_transfer_timeout_secs - type: integer - default: 7200 - help: 'Timeout in seconds for VMDK volume transfer between Cinder and Glance.' - - - name: windows_iscsi_lun_path - type: string - default: 'C:\\iSCSIVirtualDisks' - help: 'Path to store VHD backed volumes' - - - name: xenapi_nfs_server - type: string - default: ~ - help: 'NFS server to be used by XenAPINFSDriver' - - - name: xenapi_nfs_serverpath - type: string - default: ~ - help: 'Path of exported NFS, used by XenAPINFSDriver' - - - name: xenapi_connection_url - type: string - default: ~ - help: 'URL for XenAPI connection' - - - name: xenapi_connection_username - type: string - default: 'root' - help: 'Username for XenAPI connection' - - - name: xenapi_connection_password - type: string - default: ~ - help: 'Password for XenAPI connection' - - - name: xenapi_sr_base_path - type: string - default: '/var/run/sr-mount' - help: 'Base path to the storage repository' - - - name: xiv_ds8k_proxy - type: string - default: 'xiv_ds8k_openstack.nova_proxy.XIVDS8KNovaProxy' - help: 'Proxy driver that connects to the IBM Storage Array' - - - name: xiv_ds8k_connection_type - type: string - default: 'iscsi' - help: 'Connection type to the IBM Storage Array' - - - name: zadara_vpsa_ip - type: string - default: ~ - help: 'Management IP of Zadara VPSA' - - - name: zadara_vpsa_port - type: string - default: ~ - help: 'Zadara VPSA port number' - - - name: zadara_vpsa_use_ssl - type: boolean - default: false - help: 'Use SSL connection' - - - name: zadara_user - type: string - default: ~ - help: 'User name for the VPSA' - - - name: zadara_password - type: string - default: ~ - help: 'Password for the VPSA' - - - name: zadara_vpsa_poolname - type: string - default: ~ - help: 'Name of VPSA storage pool for volumes' - - - name: zadara_vol_thin - type: boolean - default: true - help: 'Default thin provisioning policy for volumes' - - - name: zadara_vol_encrypt - type: boolean - default: false - help: 'Default encryption policy for volumes' - - - name: zadara_default_striping_mode - type: string - default: 'simple' - help: 'Default striping mode for volumes' - - - name: zadara_default_stripesize - type: integer - default: 64 - help: 'Default stripe size for volumes' - - - name: zadara_vol_name_template - type: string - default: 'OS_%s' - help: 'Default template for VPSA volume names' - - - name: zadara_vpsa_auto_detach_on_delete - type: boolean - default: true - help: 'Automatically detach from servers on volume delete' - - - name: zadara_vpsa_allow_nonexistent_delete - type: boolean - default: true - help: "Don't halt on deletion of non-existing volumes" - - - name: volume_driver - type: string - default: 'cinder_2013_1_3.volume.drivers.lvm.LVMISCSIDriver' - help: 'Driver to use for volume creation' - - - name: migration_create_volume_timeout_secs - type: integer - default: 300 - help: 'Timeout for creating the volume to migrate to when performing volume migration' - - - name: volume_dd_blocksize - type: string - default: '1M' - help: 'The default block size used when copying/clearing volumes' - diff --git a/rubick/schemas/cinder/2013.2.0.yml b/rubick/schemas/cinder/2013.2.0.yml deleted file mode 100644 index e304a3b..0000000 --- a/rubick/schemas/cinder/2013.2.0.yml +++ /dev/null @@ -1,1949 +0,0 @@ -project: cinder -version: '2013.2.0' -parameters: - - - name: fatal_exception_format_errors - type: boolean - default: false - help: 'make exception message format errors fatal ' - - - name: policy_file - type: string - default: 'policy.json' - help: 'JSON file representing policy ' - - - name: policy_default_rule - type: string - default: 'default' - help: 'Rule checked when requested rule is not found ' - - - name: quota_volumes - type: integer - default: 10 - help: 'number of volumes allowed per project ' - - - name: quota_snapshots - type: integer - default: 10 - help: 'number of volume snapshots allowed per project ' - - - name: quota_gigabytes - type: integer - default: 1000 - help: 'number of volume gigabytes (snapshots are also included) allowed per project ' - - - name: reservation_expire - type: integer - default: 86400 - help: 'number of seconds until a reservation expires ' - - - name: until_refresh - type: integer - default: 0 - help: 'count of reservations until usage is refreshed ' - - - name: max_age - type: integer - default: 0 - help: 'number of seconds between subsequent usage refreshes ' - - - name: quota_driver - type: string - default: 'cinder.quota.DbQuotaDriver' - help: 'default driver to use for quota checks ' - - - name: use_default_quota_class - type: boolean - default: true - help: 'whether to use default quota class for default quota ' - - - name: report_interval - type: integer - default: 10 - help: 'seconds between nodes reporting state to datastore ' - - - name: periodic_interval - type: integer - default: 60 - help: 'seconds between running periodic tasks ' - - - name: periodic_fuzzy_delay - type: integer - default: 60 - help: 'range of seconds to randomly delay when starting the periodic task scheduler to reduce stampeding. (Disable by setting to 0) ' - - - name: osapi_volume_listen - type: host - default: '0.0.0.0' - help: 'IP address for OpenStack Volume API to listen ' - - - name: osapi_volume_listen_port - type: port - default: 8776 - help: 'port for os volume api to listen ' - - - name: sqlite_clean_db - type: string - default: 'clean.sqlite' - help: 'File name of clean sqlite db ' - - - name: fake_tests - type: boolean - default: true - help: 'should we use everything for testing ' - - - name: backlog - type: integer - default: 4096 - help: 'Number of backlog requests to configure the socket with ' - - - name: tcp_keepidle - type: integer - default: 600 - help: 'Sets the value of TCP_KEEPIDLE in seconds for each server socket. Not supported on OS X. ' - - - name: ssl_ca_file - type: string - default: ~ - help: 'CA certificate file to use to verify connecting clients ' - - - name: ssl_cert_file - type: string - default: ~ - help: 'Certificate file to use when starting the server securely ' - - - name: ssl_key_file - type: string - default: ~ - help: 'Private key file to use when starting the server securely ' - - - name: osapi_max_limit - type: integer - default: 1000 - help: 'the maximum number of items returned in a single response from a collection resource ' - - - name: osapi_volume_base_URL - type: string - default: ~ - help: 'Base URL that will be presented to users in links to the OpenStack Volume API ' - - - name: use_forwarded_for - type: boolean - default: false - help: 'Treat X-Forwarded-For as the canonical remote address. Only enable this if you have a sanitizing proxy. ' - - - name: osapi_max_request_body_size - type: integer - default: 114688 - help: 'Max size for body of a request ' - - - name: backup_ceph_conf - type: string - default: '/etc/ceph/ceph.conf' - help: 'Ceph config file to use. ' - - - name: backup_ceph_user - type: string - default: 'cinder' - help: 'the Ceph user to connect with ' - - - name: backup_ceph_chunk_size - type: integer - default: 134217728 - help: 'the chunk size in bytes that a backup will be broken into before transfer to backup store ' - - - name: backup_ceph_pool - type: string - default: 'backups' - help: 'the Ceph pool to backup to ' - - - name: backup_ceph_stripe_unit - type: integer - default: 0 - help: 'RBD stripe unit to use when creating a backup image ' - - - name: backup_ceph_stripe_count - type: integer - default: 0 - help: 'RBD stripe count to use when creating a backup image ' - - - name: restore_discard_excess_bytes - type: boolean - default: true - help: 'If True, always discard excess bytes when restoring volumes. ' - - - name: backup_swift_url - type: string - default: 'http://localhost:8080/v1/AUTH_' - help: 'The URL of the Swift endpoint ' - - - name: backup_swift_auth - type: string - default: 'per_user' - help: 'Swift authentication mechanism ' - - - name: backup_swift_user - type: string - default: ~ - help: 'Swift user name ' - - - name: backup_swift_key - type: string - default: ~ - help: 'Swift key for authentication ' - - - name: backup_swift_container - type: string - default: 'volumebackups' - help: 'The default Swift container to use ' - - - name: backup_swift_object_size - type: integer - default: 52428800 - help: 'The size in bytes of Swift backup objects ' - - - name: backup_swift_retry_attempts - type: integer - default: 3 - help: 'The number of retries to make for Swift operations ' - - - name: backup_swift_retry_backoff - type: integer - default: 2 - help: 'The backoff time in seconds between Swift retries ' - - - name: backup_compression_algorithm - type: string - default: 'zlib' - help: 'Compression algorithm (None to disable) ' - - - name: backup_tsm_volume_prefix - type: string - default: 'backup' - help: 'Volume prefix for the backup id when backing up to TSM ' - - - name: backup_tsm_password - type: string - default: 'password' - help: 'TSM password for the running username ' - - - name: backup_tsm_compression - type: boolean - default: true - help: 'Enable or Disable compression for backups ' - - - name: backup_driver - type: string - default: 'cinder.backup.drivers.swift_proxy_server' - help: 'Driver to use for backups. ' - - - name: connection_type - type: string - default: ~ - help: 'Virtualization api connection type : libvirt, xenapi, or fake ' - - - name: api_paste_config - type: string - default: 'api-paste.ini' - help: 'File name for the paste.deploy config for cinder-api ' - - - name: pybasedir - type: string - default: '/usr/lib/python/site-packages' - help: 'Directory where the cinder python module is installed ' - - - name: bindir - type: string - default: '$pybasedir/bin' - help: 'Directory where cinder binaries are installed ' - - - name: state_path - type: string - default: '$pybasedir' - help: "Top-level directory for maintaining cinder's state " - - - name: my_ip - type: string - default: '10.0.0.1' - help: 'ip address of this host ' - - - name: glance_host - type: string - default: '$my_ip' - help: 'default glance hostname or ip ' - - - name: glance_port - type: port - default: 9292 - help: 'default glance port ' - - - name: glance_api_servers - type: string_list - default: ['$glance_host:$glance_port'] - help: 'A list of the glance api servers available to cinder ([hostname|ip]:port) ' - - - name: glance_api_version - type: integer - default: 1 - help: 'Version of the glance api to use ' - - - name: glance_num_retries - type: integer - default: 0 - help: 'Number retries when downloading an image from glance ' - - - name: glance_api_insecure - type: boolean - default: false - help: 'Allow to perform insecure SSL (https) requests to glance ' - - - name: glance_api_ssl_compression - type: boolean - default: false - help: 'Whether to attempt to negotiate SSL layer compression when using SSL (https) requests. Set to False to disable SSL layer compression. In some cases disabling this may improve data throughput, eg when high network bandwidth is available and you are using already compressed image formats such as qcow2 . ' - - - name: glance_request_timeout - type: integer - default: ~ - help: 'http/https timeout value for glance operations. If no value (None) is supplied here, the glanceclient default value is used. ' - - - name: scheduler_topic - type: string - default: 'cinder-scheduler' - help: 'the topic scheduler nodes listen on ' - - - name: volume_topic - type: string - default: 'cinder-volume' - help: 'the topic volume nodes listen on ' - - - name: backup_topic - type: string - default: 'cinder-backup' - help: 'the topic volume backup nodes listen on ' - - - name: enable_v1_api - type: boolean - default: true - help: 'Deploy v1 of the Cinder API. ' - - - name: enable_v2_api - type: boolean - default: true - help: 'Deploy v2 of the Cinder API. ' - - - name: api_rate_limit - type: boolean - default: true - help: 'whether to rate limit the api ' - - - name: osapi_volume_ext_list - type: string_list - default: [] - help: 'Specify list of extensions to load when using osapi_volume_extension option with cinder.api.contrib.select_extensions ' - - - name: osapi_volume_extension - type: string - default: 'cinder.api.contrib.standard_extensions' - help: 'osapi volume extension to load (multi valued)' - - - name: volume_manager - type: string - default: 'cinder.volume.manager.VolumeManager' - help: 'full class name for the Manager for volume ' - - - name: backup_manager - type: string - default: 'cinder.backup.manager.BackupManager' - help: 'full class name for the Manager for volume backup ' - - - name: scheduler_manager - type: string - default: 'cinder.scheduler.manager.SchedulerManager' - help: 'full class name for the Manager for scheduler ' - - - name: host - type: string - default: '127.0.0.1' - help: 'Host to locate redis ' - - - name: storage_availability_zone - type: string - default: 'nova' - help: 'availability zone of this node ' - - - name: default_availability_zone - type: string - default: ~ - help: 'default availability zone to use when creating a new volume. If this is not set then we use the value from the storage_availability_zone option as the default availability_zone for new volumes. ' - - - name: memcached_servers - type: list - default: ~ - help: 'Memcached servers or None for in process cache. ' - - - name: default_volume_type - type: string - default: ~ - help: 'default volume type to use ' - - - name: volume_usage_audit_period - type: string - default: 'month' - help: 'time period to generate volume usages for. Time period must be hour, day, month or year ' - - - name: root_helper - type: string - default: 'sudo' - help: 'Deprecated: command to use for running commands as root ' - - - name: rootwrap_config - type: string - default: '/etc/cinder/rootwrap.conf' - help: 'Path to the rootwrap configuration file to use for running commands as root ' - - - name: monkey_patch - type: boolean - default: false - help: 'Enable monkey patching ' - - - name: monkey_patch_modules - type: string_list - default: [] - help: 'List of modules/decorators to monkey patch ' - - - name: service_down_time - type: integer - default: 60 - help: 'maximum time since last check-in for up service ' - - - name: volume_api_class - type: string - default: 'cinder.volume.api.API' - help: 'The full class name of the volume API class to use ' - - - name: backup_api_class - type: string - default: 'cinder.backup.api.API' - help: 'The full class name of the volume backup API class ' - - - name: auth_strategy - type: string - default: 'noauth' - help: 'The strategy to use for auth. Supports noauth, keystone, and deprecated. ' - - - name: enabled_backends - type: list - default: ~ - help: 'A list of backend names to use. These backend names should be backed by a unique [CONFIG] group with its options ' - - - name: no_snapshot_gb_quota - type: boolean - default: false - help: 'Whether snapshots count against GigaByte quota ' - - - name: transfer_api_class - type: string - default: 'cinder.transfer.api.API' - help: 'The full class name of the volume transfer API class ' - - - name: compute_api_class - type: string - default: 'cinder.compute.nova.API' - help: 'The full class name of the compute API class to use ' - - - name: nova_catalog_info - type: string - default: 'compute:nova:publicURL' - help: 'Info to match when looking for nova in the service catalog. Format is : separated values of the form: :: ' - - - name: nova_catalog_admin_info - type: string - default: 'compute:nova:adminURL' - help: 'Same as nova_catalog_info, but for admin endpoint. ' - - - name: nova_endpoint_template - type: string - default: ~ - help: 'Override service catalog lookup with template for nova endpoint e.g. http://localhost:8774/v2/%(tenant_id)s ' - - - name: nova_endpoint_admin_template - type: string - default: ~ - help: 'Same as nova_endpoint_template, but for admin endpoint. ' - - - name: os_region_name - type: string - default: ~ - help: 'region name of this node ' - - - name: nova_ca_certificates_file - type: string - default: ~ - help: 'Location of ca certicates file to use for nova client requests. ' - - - name: nova_api_insecure - type: boolean - default: false - help: 'Allow to perform insecure SSL requests to nova ' - - - name: db_backend - type: string - default: 'sqlalchemy' - help: 'The backend to use for db ' - - - name: enable_new_services - type: boolean - default: true - help: 'Services to be added to the available pool on create ' - - - name: volume_name_template - type: string - default: 'volume-%s' - help: 'Template string to be used to generate volume names ' - - - name: snapshot_name_template - type: string - default: 'snapshot-%s' - help: 'Template string to be used to generate snapshot names ' - - - name: backup_name_template - type: string - default: 'backup-%s' - help: 'Template string to be used to generate backup names ' - - - name: db_driver - type: string - default: 'cinder.db' - help: 'driver to use for database access ' - - - name: allowed_direct_url_schemes - type: string_list - default: [] - help: 'A list of url schemes that can be downloaded directly via the direct_url. Currently supported schemes: [file]. ' - - - name: image_conversion_dir - type: string - default: '$state_path/conversion' - help: 'Directory used for temporary storage during image conversion ' - - - name: api_class - type: string - default: 'cinder.keymgr.conf_key_mgr.ConfKeyManager' - help: 'The full class name of the key manager API class ' - - - name: fixed_key - type: string - default: ~ - help: 'Fixed key returned by key manager, specified in hex ' - - - name: backend - type: string - default: 'sqlalchemy' - help: 'The backend to use for db ' - - - name: use_tpool - type: boolean - default: false - help: 'Enable the experimental use of thread pooling for all DB API calls ' - - - name: connection - type: string - default: 'sqlite:////cinder/openstack/common/db/$sqlite_db' - help: 'The SQLAlchemy connection string used to connect to the database ' - - - name: idle_timeout - type: integer - default: 3600 - help: 'timeout before idle sql connections are reaped ' - - - name: min_pool_size - type: integer - default: 1 - help: 'Minimum number of SQL connections to keep open in a pool ' - - - name: max_pool_size - type: integer - default: 5 - help: 'Maximum number of SQL connections to keep open in a pool ' - - - name: max_retries - type: integer - default: 10 - help: 'maximum db connection retries during startup. (setting -1 implies an infinite retry count) ' - - - name: retry_interval - type: integer - default: 10 - help: 'interval between retries of opening a sql connection ' - - - name: max_overflow - type: integer - default: ~ - help: 'If set, use this value for max_overflow with sqlalchemy ' - - - name: connection_debug - type: integer - default: 0 - help: 'Verbosity of SQL debugging information. 0=None, 100=Everything ' - - - name: connection_trace - type: boolean - default: false - help: 'Add python stack traces to SQL as comment strings ' - - - name: sqlite_db - type: string - default: 'cinder.sqlite' - help: 'the filename to use with sqlite ' - - - name: sqlite_synchronous - type: boolean - default: true - help: 'If true, use synchronous mode for sqlite ' - - - name: backdoor_port - type: integer - default: ~ - help: 'port for eventlet backdoor to listen ' - - - name: disable_process_locking - type: boolean - default: false - help: 'Whether to disable inter-process locks ' - - - name: lock_path - type: string - default: ~ - help: 'Directory to use for lock files. Default to a temp directory ' - - - name: debug - type: boolean - default: false - help: 'Print debugging output (set logging level to DEBUG instead of default WARNING level). ' - - - name: verbose - type: boolean - default: false - help: 'Print more verbose output (set logging level to INFO instead of default WARNING level). ' - - - name: use_stderr - type: boolean - default: true - help: 'Log output to standard error ' - - - name: logging_context_format_string - type: string - 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 ' - - - name: logging_default_format_string - type: string - default: '%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s' - help: 'format string to use for log messages without context ' - - - name: logging_debug_format_suffix - type: string - default: '%(funcName)s %(pathname)s:%(lineno)d' - help: 'data to append to log format when level is DEBUG ' - - - name: logging_exception_prefix - type: string - default: '%(asctime)s.%(msecs)03d %(process)d TRACE %(name)s %(instance)s' - help: 'prefix each line of exception output with this format ' - - - name: default_log_levels - type: string_list - default: ['amqplib=WARN', 'sqlalchemy=WARN', 'boto=WARN', 'suds=INFO', 'keystone=INFO', 'eventlet.wsgi.server=WARN'] - help: 'list of logger=LEVEL pairs ' - - - name: publish_errors - type: boolean - default: false - help: 'publish error events ' - - - name: fatal_deprecations - type: boolean - default: false - help: 'make deprecations fatal ' - - - name: instance_format - type: string - default: '"[instance: %(uuid)s] "' - help: 'If an instance is passed with the log message, format it like this ' - - - name: instance_uuid_format - type: string - default: '"[instance: %(uuid)s] "' - help: 'If an instance UUID is passed with the log message, format it like this ' - - - name: log_config - type: string - default: ~ - help: 'If this option is specified, the logging configuration file specified is used and overrides any other logging options specified. Please see the Python logging module documentation for details on logging configuration files. ' - - - name: log_format - type: string - default: ~ - help: 'A logging.Formatter log message format string which may use any of the available logging.LogRecord attributes. This option is deprecated. Please use logging_context_format_string and logging_default_format_string instead. ' - - - name: log_date_format - type: string - default: '%Y-%m-%d %H:%M:%S' - help: 'Format string for %%(asctime)s in log records. Default: %(default)s ' - - - name: log_file - type: string - default: ~ - help: '(Optional) Name of log file to output to. If no default is set, logging will go to stdout. ' - - - name: log_dir - type: string - default: ~ - help: '(Optional) The base directory used for relative --log-file paths ' - - - name: use_syslog - type: boolean - default: false - help: 'Use syslog for logging. ' - - - name: syslog_log_facility - type: string - default: 'LOG_USER' - help: 'syslog facility to receive log lines ' - - - name: notification_driver - type: string - default: '' - help: 'Driver or drivers to handle sending notifications (multi valued)' - - - name: default_notification_level - type: string - default: 'INFO' - help: 'Default notification level for outgoing notifications ' - - - name: default_publisher_id - type: string - default: ~ - help: 'Default publisher_id for outgoing notifications ' - - - name: notification_topics - type: string_list - default: ['notifications'] - help: 'AMQP topic used for OpenStack notifications ' - - - name: topics - type: string_list - default: ['notifications'] - help: 'AMQP topic(s) used for OpenStack notifications ' - - - name: run_external_periodic_tasks - type: boolean - default: true - help: 'Some periodic tasks can be run in a separate process. Should we run them here? ' - - - name: rpc_backend - type: string - default: 'cinder.openstack.common.rpc.impl_kombu' - help: 'The messaging module to use, defaults to kombu. ' - - - name: rpc_thread_pool_size - type: integer - default: 64 - help: 'Size of RPC thread pool ' - - - name: rpc_conn_pool_size - type: integer - default: 30 - help: 'Size of RPC connection pool ' - - - name: rpc_response_timeout - type: integer - default: 60 - help: 'Seconds to wait for a response from call or multicall ' - - - name: rpc_cast_timeout - type: integer - default: 30 - help: 'Seconds to wait before a cast expires (TTL). Only supported by impl_zmq. ' - - - name: allowed_rpc_exception_modules - type: string_list - default: ['nova.exception', 'cinder.exception', 'exceptions'] - help: 'Modules of exceptions that are permitted to be recreatedupon receiving exception data from an rpc call. ' - - - name: fake_rabbit - type: boolean - default: false - help: 'If passed, use a fake RabbitMQ provider ' - - - name: control_exchange - type: string - default: 'openstack' - help: 'AMQP exchange to connect to if using RabbitMQ or Qpid ' - - - name: amqp_rpc_single_reply_queue - type: boolean - default: false - help: 'Enable a fast single reply queue if using AMQP based RPC like RabbitMQ or Qpid. ' - - - name: amqp_durable_queues - type: boolean - default: false - help: 'Use durable queues in amqp. ' - - - name: amqp_auto_delete - type: boolean - default: false - help: 'Auto-delete queues in amqp. ' - - - name: kombu_ssl_version - type: string - default: '' - help: 'SSL version to use (valid only if SSL enabled) ' - - - name: kombu_ssl_keyfile - type: string - default: '' - help: 'SSL key file (valid only if SSL enabled) ' - - - name: kombu_ssl_certfile - type: string - default: '' - help: 'SSL cert file (valid only if SSL enabled) ' - - - name: kombu_ssl_ca_certs - type: string - default: '' - help: 'SSL certification authority file (valid only if SSL enabled) ' - - - name: rabbit_host - type: host - default: 'localhost' - help: 'The RabbitMQ broker address where a single node is used ' - - - name: rabbit_port - type: port - default: 5672 - help: 'The RabbitMQ broker port where a single node is used ' - - - name: rabbit_hosts - type: string_list - default: ['$rabbit_host:$rabbit_port'] - help: 'RabbitMQ HA cluster host:port pairs ' - - - name: rabbit_use_ssl - type: boolean - default: false - help: 'connect over SSL for RabbitMQ ' - - - name: rabbit_userid - type: string - default: 'guest' - help: 'the RabbitMQ userid ' - - - name: rabbit_password - type: string - default: 'guest' - help: 'the RabbitMQ password ' - - - name: rabbit_virtual_host - type: string - default: '/' - help: 'the RabbitMQ virtual host ' - - - name: rabbit_retry_interval - type: integer - default: 1 - help: 'how frequently to retry connecting with RabbitMQ ' - - - name: rabbit_retry_backoff - type: integer - default: 2 - help: 'how long to backoff for between retries when connecting to RabbitMQ ' - - - name: rabbit_max_retries - type: integer - default: 0 - help: 'maximum retries with trying to connect to RabbitMQ (the default of 0 implies an infinite retry count) ' - - - name: rabbit_ha_queues - type: boolean - default: false - help: 'use H/A queues in RabbitMQ (x-ha-policy: all).You need to wipe RabbitMQ database when changing this option. ' - - - name: qpid_hostname - type: string - default: 'localhost' - help: 'Qpid broker hostname ' - - - name: qpid_port - type: port - default: 5672 - help: 'Qpid broker port ' - - - name: qpid_hosts - type: string_list - default: ['$qpid_hostname:$qpid_port'] - help: 'Qpid HA cluster host:port pairs ' - - - name: qpid_username - type: string - default: '' - help: 'Username for qpid connection ' - - - name: qpid_password - type: string - default: '' - help: 'Password for qpid connection ' - - - name: qpid_sasl_mechanisms - type: string - default: '' - help: 'Space separated list of SASL mechanisms to use for auth ' - - - name: qpid_heartbeat - type: integer - default: 60 - help: 'Seconds between connection keepalive heartbeats ' - - - name: qpid_protocol - type: string - default: 'tcp' - help: "Transport to use, either 'tcp' or 'ssl' " - - - name: qpid_tcp_nodelay - type: boolean - default: true - help: 'Disable Nagle algorithm ' - - - name: qpid_topology_version - type: integer - default: 1 - help: 'The qpid topology version to use. Version 1 is what was originally used by impl_qpid. Version 2 includes some backwards-incompatible changes that allow broker federation to work. Users should update to version 2 when they are able to take everything down, as it requires a clean break. ' - - - name: rpc_zmq_bind_address - type: string - default: '*' - help: "ZeroMQ bind address. Should be a wildcard (*), an ethernet interface, or IP. The 'host' option should point or resolve to this address. " - - - name: rpc_zmq_matchmaker - type: string - default: 'cinder.openstack.common.rpc.matchmaker.MatchMakerLocalhost' - help: 'MatchMaker driver ' - - - name: rpc_zmq_port - type: port - default: 9501 - help: 'ZeroMQ receiver listening port ' - - - name: rpc_zmq_contexts - type: integer - default: 1 - help: 'Number of ZeroMQ contexts, defaults to 1 ' - - - name: rpc_zmq_topic_backlog - type: integer - default: ~ - help: 'Maximum number of ingress messages to locally buffer per topic. Default is unlimited. ' - - - name: rpc_zmq_ipc_dir - type: string - default: '/var/run/openstack' - help: 'Directory for holding IPC sockets ' - - - name: rpc_zmq_host - type: string - default: 'cinder' - help: "Name of this node. Must be a valid hostname, FQDN, or IP address. Must match 'host' option, if running Nova. " - - - name: matchmaker_ringfile - type: string - default: '/etc/nova/matchmaker_ring.json' - help: 'Matchmaker ring file (JSON) ' - - - name: matchmaker_heartbeat_freq - type: integer - default: 300 - help: 'Heartbeat frequency ' - - - name: matchmaker_heartbeat_ttl - type: integer - default: 600 - help: 'Heartbeat time-to-live. ' - - - name: port - type: integer - default: 6379 - help: 'Use this port to connect to redis host. ' - - - name: password - type: string - default: ~ - help: 'Password for Redis server. (optional) ' - - - name: scheduler_host_manager - type: string - default: 'cinder.scheduler.host_manager.HostManager' - help: 'The scheduler host manager class to use ' - - - name: scheduler_max_attempts - type: integer - default: 3 - help: 'Maximum number of attempts to schedule an volume ' - - - name: scheduler_default_filters - type: string_list - default: ['AvailabilityZoneFilter', 'CapacityFilter', 'CapabilitiesFilter'] - help: 'Which filter class names to use for filtering hosts when not specified in the request. ' - - - name: scheduler_default_weighers - type: string_list - default: ['CapacityWeigher'] - help: 'Which weigher class names to use for weighing hosts. ' - - - name: scheduler_driver - type: string - default: 'cinder.scheduler.filter_scheduler.FilterScheduler' - help: 'Default scheduler driver to use ' - - - name: scheduler_json_config_location - type: string - default: '' - help: 'Absolute path to scheduler configuration JSON file. ' - - - name: max_gigabytes - type: integer - default: 10000 - help: 'maximum number of volume gigabytes to allow per host ' - - - name: capacity_weight_multiplier - type: float - default: 1.0 - help: 'Multiplier used for weighing volume capacity. Negative numbers mean to stack vs spread. ' - - - name: volume_transfer_salt_length - type: integer - default: 8 - help: 'The number of characters in the salt. ' - - - name: volume_transfer_key_length - type: integer - default: 16 - help: 'The number of characters in the autogenerated auth key. ' - - - name: snapshot_same_host - type: boolean - default: true - help: 'Create volume from snapshot at the host where snapshot resides ' - - - name: cloned_volume_same_az - type: boolean - default: true - help: 'Ensure that the new volumes are the same AZ as snapshot or source volume ' - - - name: num_shell_tries - type: integer - default: 3 - help: 'number of times to attempt to run flakey shell commands ' - - - name: reserved_percentage - type: integer - default: 0 - help: 'The percentage of backend capacity is reserved ' - - - name: iscsi_num_targets - type: integer - default: 100 - help: 'The maximum number of iscsi target ids per host ' - - - name: iscsi_target_prefix - type: string - default: 'iqn.2010-10.org.openstack:' - help: 'prefix for iscsi volumes ' - - - name: iscsi_ip_address - type: string - default: '$my_ip' - help: 'The IP address that the iSCSI daemon is listening on ' - - - name: iscsi_port - type: port - default: 3260 - help: 'The port that the iSCSI daemon is listening on ' - - - name: num_volume_device_scan_tries - type: integer - default: 3 - help: 'The maximum number of times to rescan targets to find volume ' - - - name: num_iser_scan_tries - type: integer - default: 3 - help: 'The maximum number of times to rescan iSER targetto find volume ' - - - name: iser_num_targets - type: integer - default: 100 - help: 'The maximum number of iser target ids per host ' - - - name: iser_target_prefix - type: string - default: 'iqn.2010-10.org.iser.openstack:' - help: 'prefix for iser volumes ' - - - name: iser_ip_address - type: string - default: '$my_ip' - help: 'The IP address that the iSER daemon is listening on ' - - - name: iser_port - type: port - default: 3260 - help: 'The port that the iSER daemon is listening on ' - - - name: iser_helper - type: string - default: 'tgtadm' - help: 'iser target user-land tool to use ' - - - name: volume_backend_name - type: string - default: ~ - help: 'The backend name for a given driver implementation ' - - - name: use_multipath_for_image_xfer - type: boolean - default: false - help: 'Do we attach/detach volumes in cinder using multipath for volume to image and image to volume transfers? ' - - - name: volume_clear - type: string - default: 'zero' - help: 'Method used to wipe old voumes (valid options are: none, zero, shred) ' - - - name: volume_clear_size - type: integer - default: 0 - help: 'Size in MiB to wipe at start of old volumes. 0 => all ' - - - name: iscsi_helper - type: string - default: 'tgtadm' - help: 'iscsi target user-land tool to use ' - - - name: volumes_dir - type: string - default: '$state_path/volumes' - help: 'Volume configuration file storage directory ' - - - name: iet_conf - type: string - default: '/etc/iet/ietd.conf' - help: 'IET configuration file ' - - - name: lio_initiator_iqns - type: string - default: '' - help: 'Comma-separated list of initiator IQNs allowed to connect to the iSCSI target. (From Nova compute nodes.) ' - - - name: iscsi_iotype - type: string - default: 'fileio' - help: 'Sets the behavior of the iSCSI target to either perform blockio or fileio optionally, auto can be set and Cinder will autodetect type of backing device ' - - - name: available_devices - type: string_list - default: [] - help: 'List of all available devices ' - - - name: coraid_esm_address - type: string - default: '' - help: 'IP address of Coraid ESM ' - - - name: coraid_user - type: string - default: 'admin' - help: 'User name to connect to Coraid ESM ' - - - name: coraid_group - type: string - default: 'admin' - help: 'Name of group on Coraid ESM to which coraid_user belongs (must have admin privilege) ' - - - name: coraid_password - type: string - default: 'password' - help: 'Password to connect to Coraid ESM ' - - - name: coraid_repository_key - type: string - default: 'coraid_repository' - help: 'Volume Type key name to store ESM Repository Name ' - - - name: eqlx_group_name - type: string - default: 'group-0' - help: 'Group name to use for creating volumes ' - - - name: eqlx_cli_timeout - type: integer - default: 30 - help: 'Timeout for the Group Manager cli command execution ' - - - name: eqlx_cli_max_retries - type: integer - default: 5 - help: 'Maximum retry count for reconnection ' - - - name: eqlx_use_chap - type: boolean - default: false - help: 'Use CHAP authentificaion for targets? ' - - - name: eqlx_chap_login - type: string - default: 'admin' - help: 'Existing CHAP account name ' - - - name: eqlx_chap_password - type: string - default: 'password' - help: 'Password for specified CHAP account name ' - - - name: eqlx_pool - type: string - default: 'default' - help: 'Pool in which volumes will be created ' - - - name: glusterfs_shares_config - type: string - default: '/etc/cinder/glusterfs_shares' - help: 'File with the list of available gluster shares ' - - - name: glusterfs_disk_util - type: string - default: 'df' - help: 'Use du or df for free space calculation ' - - - name: glusterfs_sparsed_volumes - type: boolean - default: true - help: 'Create volumes as sparsed files which take no space.If set to False volume is created as regular file.In such case volume creation takes a lot of time. ' - - - name: glusterfs_qcow2_volumes - type: boolean - default: false - help: 'Create volumes as QCOW2 files rather than raw files. ' - - - name: glusterfs_mount_point_base - type: string - default: '$state_path/mnt' - help: 'Base dir containing mount points for gluster shares. ' - - - name: gpfs_mount_point_base - type: string - default: ~ - help: 'Specifies the path of the GPFS directory where Block Storage volume and snapshot files are stored. ' - - - name: gpfs_images_dir - type: string - default: ~ - help: 'Specifies the path of the Image service repository in GPFS. Leave undefined if not storing images in GPFS. ' - - - name: gpfs_images_share_mode - type: string - default: ~ - help: "Specifies the type of image copy to be used. Set this when the Image service repository also uses GPFS so that image files can be transferred efficiently from the Image service to the Block Storage service. There are two valid values: 'copy' specifies that a full copy of the image is made; 'copy_on_write' specifies that copy-on-write optimization strategy is used and unmodified blocks of the image file are shared efficiently. " - - - name: gpfs_max_clone_depth - type: integer - default: 0 - help: 'Specifies an upper limit on the number of indirections required to reach a specific block due to snapshots or clones. A lengthy chain of copy-on-write snapshots or clones can have a negative impact on performance, but improves space utilization. 0 indicates unlimited clone depth. ' - - - name: gpfs_sparse_volumes - type: boolean - default: true - help: 'Specifies that volumes are created as sparse files which initially consume no space. If set to False, the volume is created as a fully allocated file, in which case, creation may take a significantly longer time. ' - - - name: hds_cinder_config_file - type: string - default: '/opt/hds/hus/cinder_hus_conf.xml' - help: 'configuration file for HDS cinder plugin for HUS ' - - - name: cinder_huawei_conf_file - type: string - default: '/etc/cinder/cinder_huawei_conf.xml' - help: 'config data for cinder huawei plugin ' - - - name: volume_group - type: string - default: 'cinder-volumes' - help: 'Name for the VG that will contain exported volumes ' - - - name: pool_size - type: string - default: ~ - help: 'Size of thin provisioning pool (None uses entire cinder VG) ' - - - name: lvm_mirrors - type: integer - default: 0 - help: 'If set, create lvms with multiple mirrors. Note that this requires lvm_mirrors + 2 pvs with available space ' - - - name: lvm_type - type: string - default: 'default' - help: 'Type of LVM volumes to deploy; (default or thin) ' - - - name: netapp_vfiler - type: string - default: ~ - help: 'Vfiler to use for provisioning ' - - - name: netapp_login - type: string - default: ~ - help: 'User name for the storage controller ' - - - name: netapp_password - type: string - default: ~ - help: 'Password for the storage controller ' - - - name: netapp_vserver - type: string - default: ~ - help: 'Cluster vserver to use for provisioning ' - - - name: netapp_server_hostname - type: string - default: ~ - help: 'Host name for the storage controller ' - - - name: netapp_server_port - type: port - default: 80 - help: 'Port number for the storage controller ' - - - name: thres_avl_size_perc_start - type: integer - default: 20 - help: 'Threshold available percent to start cache cleaning. ' - - - name: thres_avl_size_perc_stop - type: integer - default: 60 - help: 'Threshold available percent to stop cache cleaning. ' - - - name: expiry_thres_minutes - type: integer - default: 720 - help: 'Threshold minutes after which cache file can be cleaned. ' - - - name: netapp_size_multiplier - type: float - default: 1.2 - help: 'Volume size multiplier to ensure while creation ' - - - name: netapp_volume_list - type: string - default: ~ - help: 'Comma separated volumes to be used for provisioning ' - - - name: netapp_storage_family - type: string - default: 'ontap_cluster' - help: 'Storage family type. ' - - - name: netapp_storage_protocol - type: string - default: ~ - help: 'Storage protocol type. ' - - - name: netapp_transport_type - type: string - default: 'http' - help: 'Transport type protocol ' - - - name: nexenta_host - type: string - default: '' - help: 'IP address of Nexenta SA ' - - - name: nexenta_rest_port - type: port - default: 2000 - help: 'HTTP port to connect to Nexenta REST API server ' - - - name: nexenta_rest_protocol - type: string - default: 'auto' - help: 'Use http or https for REST connection (default auto) ' - - - name: nexenta_user - type: string - default: 'admin' - help: 'User name to connect to Nexenta SA ' - - - name: nexenta_password - type: string - default: 'nexenta' - help: 'Password to connect to Nexenta SA ' - - - name: nexenta_iscsi_target_portal_port - type: port - default: 3260 - help: 'Nexenta target portal port ' - - - name: nexenta_volume - type: string - default: 'cinder' - help: 'pool on SA that will hold all volumes ' - - - name: nexenta_target_prefix - type: string - default: 'iqn.1986-03.com.sun:02:cinder-' - help: 'IQN prefix for iSCSI targets ' - - - name: nexenta_target_group_prefix - type: string - default: 'cinder/' - help: 'prefix for iSCSI target groups on SA ' - - - name: nexenta_shares_config - type: string - default: '/etc/cinder/nfs_shares' - help: 'File with the list of available nfs shares ' - - - name: nexenta_mount_point_base - type: string - default: '$state_path/mnt' - help: 'Base dir containing mount points for nfs shares ' - - - name: nexenta_sparsed_volumes - type: boolean - default: true - help: 'Create volumes as sparsed files which take no space.If set to False volume is created as regular file.In such case volume creation takes a lot of time. ' - - - name: nexenta_volume_compression - type: string - default: 'on' - help: 'Default compression value for new ZFS folders. ' - - - name: nexenta_mount_options - type: string - default: ~ - help: 'Mount options passed to the nfs client. See section of the nfs man page for details ' - - - name: nexenta_used_ratio - type: float - default: 0.95 - help: 'Percent of ACTUAL usage of the underlying volume before no new volumes can be allocated to the volume destination. ' - - - name: nexenta_oversub_ratio - type: float - default: 1.0 - help: 'This will compare the allocated to available space on the volume destination. If the ratio exceeds this number, the destination will no longer be valid. ' - - - name: nexenta_nms_cache_volroot - type: boolean - default: true - help: 'If set True cache NexentaStor appliance volroot option value. ' - - - name: nexenta_blocksize - type: string - default: '' - help: 'block size for volumes (blank=default,8KB) ' - - - name: nexenta_sparse - type: boolean - default: false - help: 'flag to create sparse volumes ' - - - name: nfs_shares_config - type: string - default: '/etc/cinder/nfs_shares' - help: 'File with the list of available nfs shares ' - - - name: nfs_sparsed_volumes - type: boolean - default: true - help: 'Create volumes as sparsed files which take no space.If set to False volume is created as regular file.In such case volume creation takes a lot of time. ' - - - name: nfs_used_ratio - type: float - default: 0.95 - help: 'Percent of ACTUAL usage of the underlying volume before no new volumes can be allocated to the volume destination. ' - - - name: nfs_oversub_ratio - type: float - default: 1.0 - help: 'This will compare the allocated to available space on the volume destination. If the ratio exceeds this number, the destination will no longer be valid. ' - - - name: nfs_mount_point_base - type: string - default: '$state_path/mnt' - help: 'Base dir containing mount points for nfs shares. ' - - - name: nfs_mount_options - type: string - default: ~ - help: 'Mount options passed to the nfs client. See section of the nfs man page for details. ' - - - name: rbd_pool - type: string - default: 'rbd' - help: 'the RADOS pool in which rbd volumes are stored ' - - - name: rbd_user - type: string - default: ~ - help: 'the RADOS client name for accessing rbd volumes - only set when using cephx authentication ' - - - name: rbd_ceph_conf - type: string - default: '' - help: 'path to the ceph configuration file to use ' - - - name: rbd_flatten_volume_from_snapshot - type: boolean - default: false - help: 'flatten volumes created from snapshots to remove dependency ' - - - name: rbd_secret_uuid - type: string - default: ~ - help: 'the libvirt uuid of the secret for the rbd_uservolumes ' - - - name: volume_tmp_dir - type: string - default: ~ - help: 'where to store temporary image files if the volume driver does not write them directly to the volume ' - - - name: rbd_max_clone_depth - type: integer - default: 5 - help: 'maximum number of nested clones that can be taken of a volume before enforcing a flatten prior to next clone. A value of zero disables cloning ' - - - name: hp3par_api_url - type: string - default: '' - help: '3PAR WSAPI Server Url like https://<3par ip>:8080/api/v1 ' - - - name: hp3par_username - type: string - default: '' - help: '3PAR Super user username ' - - - name: hp3par_password - type: string - default: '' - help: '3PAR Super user password ' - - - name: hp3par_domain - type: string - default: ~ - help: 'This option is DEPRECATED and no longer used. The 3par domain name to use. ' - - - name: hp3par_cpg - type: string - default: 'OpenStack' - help: 'The CPG to use for volume creation ' - - - name: hp3par_cpg_snap - type: string - default: '' - help: 'The CPG to use for Snapshots for volumes. If empty hp3par_cpg will be used ' - - - name: hp3par_snapshot_retention - type: string - default: '' - help: "The time in hours to retain a snapshot. You can't delete it before this expires. " - - - name: hp3par_snapshot_expiration - type: string - default: '' - help: 'The time in hours when a snapshot expires and is deleted. This must be larger than expiration ' - - - name: hp3par_debug - type: boolean - default: false - help: 'Enable HTTP debugging to 3PAR ' - - - name: hp3par_iscsi_ips - type: string_list - default: [] - help: 'List of target iSCSI addresses to use. ' - - - name: san_thin_provision - type: boolean - default: true - help: 'Use thin provisioning for SAN volumes? ' - - - name: san_ip - type: string - default: '' - help: 'IP address of SAN controller ' - - - name: san_login - type: string - default: 'admin' - help: 'Username for SAN controller ' - - - name: san_password - type: string - default: '' - help: 'Password for SAN controller ' - - - name: san_private_key - type: string - default: '' - help: 'Filename of private key to use for SSH authentication ' - - - name: san_clustername - type: string - default: '' - help: 'Cluster name to use for creating volumes ' - - - name: san_ssh_port - type: port - default: 22 - help: 'SSH port to use with SAN ' - - - name: san_is_local - type: boolean - default: false - help: 'Execute commands locally instead of over SSH; use if the volume service is running on the SAN device ' - - - name: ssh_conn_timeout - type: integer - default: 30 - help: 'SSH connection timeout in seconds ' - - - name: ssh_min_pool_conn - type: integer - default: 1 - help: 'Minimum ssh connections in the pool ' - - - name: ssh_max_pool_conn - type: integer - default: 5 - help: 'Maximum ssh connections in the pool ' - - - name: san_zfs_volume_base - type: string - default: 'rpool/' - help: 'The ZFS path under which to create zvols for volumes. ' - - - name: scality_sofs_config - type: string - default: ~ - help: 'Path or URL to Scality SOFS configuration file ' - - - name: scality_sofs_mount_point - type: string - default: '$state_path/scality' - help: 'Base dir where Scality SOFS shall be mounted ' - - - name: scality_sofs_volume_dir - type: string - default: 'cinder/volumes' - help: 'Path from Scality SOFS root to volume dir ' - - - name: sf_emulate_512 - type: boolean - default: true - help: 'Set 512 byte emulation on volume creation; ' - - - name: sf_allow_tenant_qos - type: boolean - default: false - help: 'Allow tenants to specify QOS on create ' - - - name: sf_account_prefix - type: string - default: 'cinder' - help: 'Create SolidFire accounts with this prefix ' - - - name: sf_api_port - type: port - default: 443 - help: 'SolidFire API port. Useful if the device api is behind a proxy on a different port. ' - - - name: storwize_svc_volpool_name - type: string - default: 'volpool' - help: 'Storage system storage pool for volumes ' - - - name: storwize_svc_vol_rsize - type: integer - default: 2 - help: 'Storage system space-efficiency parameter for volumes (percentage) ' - - - name: storwize_svc_vol_warning - type: integer - default: 0 - help: 'Storage system threshold for volume capacity warnings (percentage) ' - - - name: storwize_svc_vol_autoexpand - type: boolean - default: true - help: 'Storage system autoexpand parameter for volumes (True/False) ' - - - name: storwize_svc_vol_grainsize - type: integer - default: 256 - help: 'Storage system grain size parameter for volumes (32/64/128/256) ' - - - name: storwize_svc_vol_compression - type: boolean - default: false - help: 'Storage system compression option for volumes ' - - - name: storwize_svc_vol_easytier - type: boolean - default: true - help: 'Enable Easy Tier for volumes ' - - - name: storwize_svc_vol_iogrp - type: integer - default: 0 - help: 'The I/O group in which to allocate volumes ' - - - name: storwize_svc_flashcopy_timeout - type: integer - default: 120 - help: 'Maximum number of seconds to wait for FlashCopy to be prepared. Maximum value is 600 seconds (10 minutes) ' - - - name: storwize_svc_connection_protocol - type: string - default: 'iSCSI' - help: 'Connection protocol (iSCSI/FC) ' - - - name: storwize_svc_iscsi_chap_enabled - type: boolean - default: true - help: 'Configure CHAP authentication for iSCSI connections (Default: Enabled) ' - - - name: storwize_svc_multipath_enabled - type: boolean - default: false - help: 'Connect with multipath (FC only; iSCSI multipath is controlled by Nova) ' - - - name: storwize_svc_multihostmap_enabled - type: boolean - default: true - help: 'Allows vdisk to multi host mapping ' - - - name: vmware_host_ip - type: string - default: ~ - help: 'IP address for connecting to VMware ESX/VC server. ' - - - name: vmware_host_username - type: string - default: ~ - help: 'Username for authenticating with VMware ESX/VC server. ' - - - name: vmware_host_password - type: string - default: ~ - help: 'Password for authenticating with VMware ESX/VC server. ' - - - name: vmware_wsdl_location - type: string - default: ~ - help: 'Optional VIM service WSDL Location e.g http:///vimService.wsdl. Optional over-ride to default location for bug work-arounds. ' - - - name: vmware_api_retry_count - type: integer - default: 10 - help: 'Number of times VMware ESX/VC server API must be retried upon connection related issues. ' - - - name: vmware_task_poll_interval - type: integer - default: 5 - help: 'The interval used for polling remote tasks invoked on VMware ESX/VC server. ' - - - name: vmware_volume_folder - type: string - default: 'cinder-volumes' - help: 'Name for the folder in the VC datacenter that will contain cinder volumes. ' - - - name: vmware_image_transfer_timeout_secs - type: integer - default: 7200 - help: 'Timeout in seconds for VMDK volume transfer between Cinder and Glance. ' - - - name: vmware_max_objects_retrieval - type: integer - default: 100 - help: 'Max number of objects to be retrieved per batch. Query results will be obtained in batches from the server and not in one shot. Server may still limit the count to something less than the configured value. ' - - - name: windows_iscsi_lun_path - type: string - default: 'C:\\iSCSIVirtualDisks' - help: 'Path to store VHD backed volumes ' - - - name: xenapi_nfs_server - type: string - default: ~ - help: 'NFS server to be used by XenAPINFSDriver ' - - - name: xenapi_nfs_serverpath - type: string - default: ~ - help: 'Path of exported NFS, used by XenAPINFSDriver ' - - - name: xenapi_connection_url - type: string - default: ~ - help: 'URL for XenAPI connection ' - - - name: xenapi_connection_username - type: string - default: 'root' - help: 'Username for XenAPI connection ' - - - name: xenapi_connection_password - type: string - default: ~ - help: 'Password for XenAPI connection ' - - - name: xenapi_sr_base_path - type: string - default: '/var/run/sr-mount' - help: 'Base path to the storage repository ' - - - name: xiv_ds8k_proxy - type: string - default: 'xiv_ds8k_openstack.nova_proxy.XIVDS8KNovaProxy' - help: 'Proxy driver that connects to the IBM Storage Array ' - - - name: xiv_ds8k_connection_type - type: string - default: 'iscsi' - help: 'Connection type to the IBM Storage Array (fibre_channel|iscsi) ' - - - name: zadara_vpsa_ip - type: string - default: ~ - help: 'Management IP of Zadara VPSA ' - - - name: zadara_vpsa_port - type: string - default: ~ - help: 'Zadara VPSA port number ' - - - name: zadara_vpsa_use_ssl - type: boolean - default: false - help: 'Use SSL connection ' - - - name: zadara_user - type: string - default: ~ - help: 'User name for the VPSA ' - - - name: zadara_password - type: string - default: ~ - help: 'Password for the VPSA ' - - - name: zadara_vpsa_poolname - type: string - default: ~ - help: 'Name of VPSA storage pool for volumes ' - - - name: zadara_vol_thin - type: boolean - default: true - help: 'Default thin provisioning policy for volumes ' - - - name: zadara_vol_encrypt - type: boolean - default: false - help: 'Default encryption policy for volumes ' - - - name: zadara_default_striping_mode - type: string - default: 'simple' - help: 'Default striping mode for volumes ' - - - name: zadara_default_stripesize - type: string - default: '64' - help: 'Default stripe size for volumes ' - - - name: zadara_vol_name_template - type: string - default: 'OS_%s' - help: 'Default template for VPSA volume names ' - - - name: zadara_vpsa_auto_detach_on_delete - type: boolean - default: true - help: 'Automatically detach from servers on volume delete ' - - - name: zadara_vpsa_allow_nonexistent_delete - type: boolean - default: true - help: "Don't halt on deletion of non-existing volumes " - - - name: volume_driver - type: string - default: 'cinder.volume.drivers.lvm.LVMISCSIDriver' - help: 'Driver to use for volume creation ' - - - name: migration_create_volume_timeout_secs - type: integer - default: 300 - help: 'Timeout for creating the volume to migrate to when performing volume migration (seconds) ' - - - name: volume_service_inithost_offload - type: boolean - default: false - help: 'Offload pending volume delete during volume service startup ' - - - name: volume_dd_blocksize - type: string - default: '1M' - help: 'The default block size used when copying/clearing volumes ' - - - name: keystone_authtoken.auth_host - type: host - default: '127.0.0.1' - help: 'Host providing the admin Identity API endpoint' - - - name: keystone_authtoken.auth_port - type: port - default: 35357 - help: 'Port of the admin Identity API endpoint' - - - name: keystone_authtoken.auth_protocol - type: string - default: 'http' - help: 'Protocol of the admin Identity API endpoint' - - - name: keystone_authtoken.admin_tenant_name - type: string - default: '%SERVICE_TENANT_NAME%' - help: 'Keystone service account tenant name to validate user tokens' - - - name: keystone_authtoken.admin_user - type: string - default: '%SERVICE_USER%' - help: 'Keystone account username' - - - name: keystone_authtoken.admin_password - type: string - default: '%SERVICE_PASSWORD%' - help: 'Keystone account password' - - - name: keystone_authtoken.signing_dir - type: string - default: '/var/lib/cinder/keystone-signing' - help: 'Directory used to cache files related to PKI tokens signing_dir is configurable, but the default behavior of the authtoken middleware should be sufficient. It will create a temporary directory in the home directory for the user the cinder process is running as.' - diff --git a/rubick/schemas/cinder/cinder.conf.yml b/rubick/schemas/cinder/cinder.conf.yml deleted file mode 100644 index f816a49..0000000 --- a/rubick/schemas/cinder/cinder.conf.yml +++ /dev/null @@ -1,1901 +0,0 @@ -- version: '2013.1.3' - checkpoint: true - added: - - - name: fatal_exception_format_errors - type: boolean - default: false - help: 'make exception message format errors fatal' - - - name: policy_file - type: file - default: 'policy.json' - help: 'JSON file representing policy' - - - name: policy_default_rule - type: string - default: 'default' - help: 'Rule checked when requested rule is not found' - - - name: quota_volumes - type: integer - default: 10 - help: 'number of volumes allowed per project' - - - name: quota_snapshots - type: integer - default: 10 - help: 'number of volume snapshots allowed per project' - - - name: quota_gigabytes - type: integer - default: 1000 - help: 'number of volume gigabytes' - - - name: reservation_expire - type: integer - default: 86400 - help: 'number of seconds until a reservation expires' - - - name: until_refresh - type: integer - default: 0 - help: 'count of reservations until usage is refreshed' - - - name: max_age - type: integer - default: 0 - help: 'number of seconds between subsequent usage refreshes' - - - name: quota_driver - type: string - default: 'cinder.quota.DbQuotaDriver' - help: 'default driver to use for quota checks' - - - name: use_default_quota_class - type: boolean - default: true - help: 'whether to use default quota class for default quota' - - - name: report_interval - type: integer - default: 10 - help: 'seconds between nodes reporting state to datastore' - - - name: periodic_interval - type: integer - default: 60 - help: 'seconds between running periodic tasks' - - - name: periodic_fuzzy_delay - type: integer - default: 60 - help: 'range of seconds to randomly delay when starting the periodic task scheduler to reduce stampeding.' - - - name: osapi_volume_listen - type: host - default: '0.0.0.0' - help: 'IP address for OpenStack Volume API to listen' - - - name: osapi_volume_listen_port - type: port - default: 8776 - help: 'port for os volume api to listen' - - - name: sqlite_clean_db - type: file - default: 'clean.sqlite' - help: 'File name of clean sqlite db' - - - name: fake_tests - type: boolean - default: true - help: 'should we use everything for testing' - - - name: backlog - type: integer - default: 4096 - help: 'Number of backlog requests to configure the socket with' - - - name: tcp_keepidle - type: integer - default: 600 - help: 'Sets the value of TCP_KEEPIDLE in seconds for each server socket. Not supported on OS X.' - - - name: ssl_ca_file - type: file - default: ~ - help: 'CA certificate file to use to verify connecting clients' - - - name: ssl_cert_file - type: file - default: ~ - help: 'Certificate file to use when starting the server securely' - - - name: ssl_key_file - type: file - default: ~ - help: 'Private key file to use when starting the server securely' - - - name: osapi_max_limit - type: integer - default: 1000 - help: 'the maximum number of items returned in a single response from a collection resource' - - - name: osapi_volume_base_URL - type: string - default: ~ - help: 'Base URL that will be presented to users in links to the OpenStack Volume API' - - - name: use_forwarded_for - type: boolean - default: false - help: 'Treat X-Forwarded-For as the canonical remote address. Only enable this if you have a sanitizing proxy.' - - - name: osapi_max_request_body_size - type: integer - default: 114688 - help: 'Max size for body of a request' - - - name: backup_ceph_conf - type: file - default: '/etc/ceph/ceph.conf' - help: 'Ceph config file to use.' - - - name: backup_ceph_user - type: string - default: 'cinder' - help: 'the Ceph user to connect with' - - - name: backup_ceph_chunk_size - type: integer - default: 134217728 - help: 'the chunk size in bytes that a backup will be broken into before transfer to backup store' - - - name: backup_ceph_pool - type: string - default: 'backups' - help: 'the Ceph pool to backup to' - - - name: backup_ceph_stripe_unit - type: integer - default: 0 - help: 'RBD stripe unit to use when creating a backup image' - - - name: backup_ceph_stripe_count - type: integer - default: 0 - help: 'RBD stripe count to use when creating a backup image' - - - name: restore_discard_excess_bytes - type: boolean - default: true - help: 'If True, always discard excess bytes when restoring volumes.' - - - name: backup_swift_url - type: string - default: 'http://localhost:8080/v1/AUTH_' - help: 'The URL of the Swift endpoint' - - - name: backup_swift_auth - type: string - default: 'per_user' - help: 'Swift authentication mechanism' - - - name: backup_swift_user - type: string - default: ~ - help: 'Swift user name' - - - name: backup_swift_key - type: string - default: ~ - help: 'Swift key for authentication' - - - name: backup_swift_container - type: string - default: 'volumebackups' - help: 'The default Swift container to use' - - - name: backup_swift_object_size - type: integer - default: 52428800 - help: 'The size in bytes of Swift backup objects' - - - name: backup_swift_retry_attempts - type: integer - default: 3 - help: 'The number of retries to make for Swift operations' - - - name: backup_swift_retry_backoff - type: integer - default: 2 - help: 'The backoff time in seconds between Swift retries' - - - name: backup_compression_algorithm - type: string - default: 'zlib' - help: 'Compression algorithm' - - - name: backup_tsm_volume_prefix - type: string - default: 'backup' - help: 'Volume prefix for the backup id when backing up to TSM' - - - name: backup_tsm_password - type: string - default: 'password' - help: 'TSM password for the running username' - - - name: backup_tsm_compression - type: boolean - default: true - help: 'Enable or Disable compression for backups' - - - name: backup_driver - type: string - default: 'cinder.backup.drivers.swift_proxy_server' - help: 'Driver to use for backups.' - - - name: num_volume_device_scan_tries - type: integer - default: 3 - help: 'The maximum number of times to rescan targetsto find volume' - - - name: iscsi_helper - type: executable - default: 'tgtadm' - help: 'iscsi target user-land tool to use' - - - name: volumes_dir - type: directory - default: '$state_path/volumes' - help: 'Volume configuration file storage directory' - - - name: iet_conf - type: file - default: '/etc/iet/ietd.conf' - help: 'IET configuration file' - - - name: lio_initiator_iqns - type: string - default: '' - help: 'Comma-separatd list of initiator IQNs allowed to connect to the iSCSI target.' - - - name: iscsi_iotype - type: string - default: 'fileio' - help: 'Sets the behavior of the iSCSI target to either perform blockio or fileio optionally, auto can be set and Cinder will autodetect type of backing device' - - - name: iser_helper - type: executable - default: 'tgtadm' - help: 'iser target user-land tool to use' - - - name: nfs_mount_point_base - type: directory - default: '$state_path/mnt' - help: 'Base dir containing mount points for nfs shares' - - - name: nfs_mount_options - type: string - default: ~ - help: 'Mount options passed to the nfs client. See section of the nfs man page for details' - - - name: glusterfs_mount_point_base - type: directory - default: '$state_path/mnt' - help: 'Base dir containing mount points for gluster shares' - - - name: connection_type - type: string - default: ~ - help: 'Virtualization api connection type : libvirt, xenapi, or fake' - - - name: api_paste_config - type: file - default: 'api-paste.ini' - help: 'File name for the paste.deploy config for cinder-api' - - - name: pybasedir - type: directory - default: '/usr/lib/python/site-packages' - help: 'Directory where the cinder python module is installed' - - - name: bindir - type: directory - default: '$pybasedir/bin' - help: 'Directory where cinder binaries are installed' - - - name: state_path - type: directory - default: '$pybasedir' - help: "Top-level directory for maintaining cinder's state" - - - name: my_ip - type: host - default: '10.0.0.1' - help: 'ip address of this host' - - - name: glance_host - type: host - default: '$my_ip' - help: 'default glance hostname or ip' - - - name: glance_port - type: port - default: 9292 - help: 'default glance port' - - - name: glance_api_servers - type: list - default: ['$glance_host:$glance_port'] - help: 'A list of the glance api servers available to cinder' - - - name: glance_api_version - type: integer - default: 1 - help: 'Version of the glance api to use' - - - name: glance_num_retries - type: integer - default: 0 - help: 'Number retries when downloading an image from glance' - - - name: glance_api_insecure - type: boolean - default: false - help: 'Allow to perform insecure SSL' - - - name: glance_api_ssl_compression - type: boolean - default: false - help: 'Whether to attempt to negotiate SSL layer compression when using SSL' - - - name: glance_request_timeout - type: integer - default: ~ - help: 'http/https timeout value for glance operations. If no value' - - - name: scheduler_topic - type: string - default: 'cinder-scheduler' - help: 'the topic scheduler nodes listen on' - - - name: volume_topic - type: string - default: 'cinder-volume' - help: 'the topic volume nodes listen on' - - - name: backup_topic - type: string - default: 'cinder-backup' - help: 'the topic volume backup nodes listen on' - - - name: enable_v1_api - type: boolean - default: true - help: 'Deploy v1 of the Cinder API. ' - - - name: enable_v2_api - type: boolean - default: true - help: 'Deploy v2 of the Cinder API. ' - - - name: api_rate_limit - type: boolean - default: true - help: 'whether to rate limit the api' - - - name: osapi_volume_ext_list - type: list - default: [] - help: 'Specify list of extensions to load when using osapi_volume_extension option with cinder_2013_1_3.api.contrib.select_extensions' - - - name: osapi_volume_extension - type: multi - default: 'cinder.api.contrib.standard_extensions' - help: 'osapi volume extension to load' - - - name: volume_manager - type: string - default: 'cinder.volume.manager.VolumeManager' - help: 'full class name for the Manager for volume' - - - name: backup_manager - type: string - default: 'cinder.backup.manager.BackupManager' - help: 'full class name for the Manager for volume backup' - - - name: scheduler_manager - type: string - default: 'cinder.scheduler.manager.SchedulerManager' - help: 'full class name for the Manager for scheduler' - - - name: host - type: host - default: '127.0.0.1' - help: 'Host to locate redis' - - - name: storage_availability_zone - type: string - default: 'nova' - help: 'availability zone of this node' - - - name: default_availability_zone - type: string - default: ~ - help: 'default availability zone to use when creating a new volume. If this is not set then we use the value from the storage_availability_zone option as the default availability_zone for new volumes.' - - - name: memcached_servers - type: list - default: ~ - help: 'Memcached servers or None for in process cache.' - - - name: default_volume_type - type: string - default: ~ - help: 'default volume type to use' - - - name: volume_usage_audit_period - type: string - default: 'month' - help: 'time period to generate volume usages for. Time period must be hour, day, month or year' - - - name: root_helper - type: executable - default: 'sudo' - help: 'Deprecated: command to use for running commands as root' - - - name: rootwrap_config - type: file - default: '/etc/cinder/rootwrap.conf' - help: 'Path to the rootwrap configuration file to use for running commands as root' - - - name: monkey_patch - type: boolean - default: false - help: 'Enable monkey patching' - - - name: monkey_patch_modules - type: list - default: [] - help: 'List of modules/decorators to monkey patch' - - - name: service_down_time - type: integer - default: 60 - help: 'maximum time since last check-in for up service' - - - name: volume_api_class - type: string - default: 'cinder.volume.api.API' - help: 'The full class name of the volume API class to use' - - - name: backup_api_class - type: string - default: 'cinder.backup.api.API' - help: 'The full class name of the volume backup API class' - - - name: auth_strategy - type: enum - type_args: {'values': ['noauth', 'keystone']} - default: 'noauth' - help: 'The strategy to use for auth. Supports noauth, keystone, and deprecated.' - - - name: enabled_backends - type: list - default: ~ - help: 'A list of backend names to use. These backend names should be backed by a unique [CONFIG] group with its options' - - - name: no_snapshot_gb_quota - type: boolean - default: false - help: 'Whether snapshots count against GigaByte quota' - - - name: transfer_api_class - type: string - default: 'cinder.transfer.api.API' - help: 'The full class name of the volume transfer API class' - - - name: compute_api_class - type: string - default: 'cinder.compute.nova.API' - help: 'The full class name of the compute API class to use' - - - name: nova_catalog_info - type: string - default: 'compute:nova:publicURL' - help: 'Info to match when looking for nova in the service catalog. Format is : separated values of the form: ::' - - - name: nova_catalog_admin_info - type: string - default: 'compute:nova:adminURL' - help: 'Same as nova_catalog_info, but for admin endpoint.' - - - name: nova_endpoint_template - type: string - default: ~ - help: 'Override service catalog lookup with template for nova endpoint e.g. http://localhost:8774/v2/%(tenant_id)s' - - - name: nova_endpoint_admin_template - type: string - default: ~ - help: 'Same as nova_endpoint_template, but for admin endpoint.' - - - name: os_region_name - type: string - default: ~ - help: 'region name of this node' - - - name: nova_ca_certificates_file - type: file - default: ~ - help: 'Location of ca certicates file to use for nova client requests.' - - - name: nova_api_insecure - type: boolean - default: false - help: 'Allow to perform insecure SSL requests to nova' - - - name: db_backend - type: string - default: 'sqlalchemy' - help: 'The backend to use for db' - - - name: enable_new_services - type: boolean - default: true - help: 'Services to be added to the available pool on create' - - - name: volume_name_template - type: string - default: 'volume-%s' - help: 'Template string to be used to generate volume names' - - - name: snapshot_name_template - type: string - default: 'snapshot-%s' - help: 'Template string to be used to generate snapshot names' - - - name: backup_name_template - type: string - default: 'backup-%s' - help: 'Template string to be used to generate backup names' - - - name: db_driver - type: string - default: 'cinder.db' - help: 'driver to use for database access' - - - name: allowed_direct_url_schemes - type: list - default: [] - help: 'A list of url schemes that can be downloaded directly via the direct_url. Currently supported schemes: [file].' - - - name: image_conversion_dir - type: directory - default: '$state_path/conversion' - help: 'Directory used for temporary storage during image conversion' - - - name: keymgr_api_class - type: string - default: 'cinder.keymgr.not_implemented_key_mgr.NotImplementedKeyManager' - help: 'The full class name of the key manager API class' - - - name: backend - type: string - default: 'sqlalchemy' - help: 'The backend to use for db' - - - name: use_tpool - type: boolean - default: false - help: 'Enable the experimental use of thread pooling for all DB API calls' - - - name: connection - type: string - default: 'sqlite:////cinder/openstack/common/db/$sqlite_db' - help: 'The SQLAlchemy connection string used to connect to the database' - - - name: sql_connection - type: string - default: 'sqlite:////nova/openstack/common/db/$sqlite_db' - help: 'The SQLAlchemy connection string used to connect to the database' - - - name: idle_timeout - type: integer - default: 3600 - help: 'timeout before idle sql connections are reaped' - - - name: min_pool_size - type: integer - default: 1 - help: 'Minimum number of SQL connections to keep open in a pool' - - - name: max_pool_size - type: integer - default: 5 - help: 'Maximum number of SQL connections to keep open in a pool' - - - name: max_retries - type: integer - default: 10 - help: 'maximum db connection retries during startup.' - - - name: retry_interval - type: integer - default: 10 - help: 'interval between retries of opening a sql connection' - - - name: max_overflow - type: integer - default: ~ - help: 'If set, use this value for max_overflow with sqlalchemy' - - - name: connection_debug - type: integer - default: 0 - help: 'Verbosity of SQL debugging information. 0=None, 100=Everything' - - - name: connection_trace - type: boolean - default: false - help: 'Add python stack traces to SQL as comment strings' - - - name: sqlite_db - type: string - default: 'cinder.sqlite' - help: 'the filename to use with sqlite' - - - name: sqlite_synchronous - type: boolean - default: true - help: 'If true, use synchronous mode for sqlite' - - - name: backdoor_port - type: port - default: ~ - help: 'port for eventlet backdoor to listen' - - - name: disable_process_locking - type: boolean - default: false - help: 'Whether to disable inter-process locks' - - - name: lock_path - type: directory - default: ~ - help: 'Directory to use for lock files. Default to a temp directory' - - - name: debug - type: boolean - default: false - help: 'Print debugging output' - - - name: verbose - type: boolean - default: false - help: 'Print more verbose output' - - - name: use_stderr - type: boolean - default: true - help: 'Log output to standard error' - - - name: logging_context_format_string - type: string - 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' - - - name: logging_default_format_string - type: string - default: '%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s' - help: 'format string to use for log messages without context' - - - name: logging_debug_format_suffix - type: string - default: '%(funcName)s %(pathname)s:%(lineno)d' - help: 'data to append to log format when level is DEBUG' - - - name: logging_exception_prefix - type: string - default: '%(asctime)s.%(msecs)03d %(process)d TRACE %(name)s %(instance)s' - help: 'prefix each line of exception output with this format' - - - name: default_log_levels - type: list - default: ['amqplib=WARN', 'sqlalchemy=WARN', 'boto=WARN', 'suds=INFO', 'keystone=INFO', 'eventlet.wsgi.server=WARN'] - help: 'list of logger=LEVEL pairs' - - - name: publish_errors - type: boolean - default: false - help: 'publish error events' - - - name: fatal_deprecations - type: boolean - default: false - help: 'make deprecations fatal' - - - name: instance_format - type: string - default: '"[instance: %(uuid)s] "' - help: 'If an instance is passed with the log message, format it like this' - - - name: instance_uuid_format - type: string - default: '"[instance: %(uuid)s] "' - help: 'If an instance UUID is passed with the log message, format it like this' - - - name: log_config - type: file - default: ~ - help: 'If this option is specified, the logging configuration file specified is used and overrides any other logging options specified. Please see the Python logging module documentation for details on logging configuration files.' - - - name: log_format - type: string - default: ~ - help: 'A logging.Formatter log message format string which may use any of the available logging.LogRecord attributes. This option is deprecated. Please use logging_context_format_string and logging_default_format_string instead.' - - - name: log_date_format - type: string - default: '%Y-%m-%d %H:%M:%S' - help: 'Format string for %%(asctime)s in log records. Default: %(default)s' - - - name: log_file - type: file - default: ~ - help: '(Optional) Name of log file to output to. If no default is set, logging will go to stdout.' - - - name: log_dir - type: directory - default: ~ - help: '(Optional) The base directory used for relative --log-file paths' - - - name: use_syslog - type: boolean - default: false - help: 'Use syslog for logging.' - - - name: syslog_log_facility - type: string - default: 'LOG_USER' - help: 'syslog facility to receive log lines' - - - name: default_notification_level - type: enum - type_args: {'values': ['DEBUG', 'INFO', 'WARN', 'CRITICAL']} - default: 'INFO' - help: 'Default notification level for outgoing notifications' - - - name: default_publisher_id - type: string - default: ~ - help: 'Default publisher_id for outgoing notifications' - - - name: notification_topics - type: list - default: ['notifications'] - help: 'AMQP topic used for OpenStack notifications' - - - name: topics - type: list - default: ['notifications'] - help: 'AMQP topic(s) used for OpenStack notifications' - - - name: run_external_periodic_tasks - type: boolean - default: true - help: 'Some periodic tasks can be run in a separate process. Should we run them here?' - - - name: rpc_backend - type: string - default: 'cinder.openstack.common.rpc.impl_kombu' - help: 'The messaging module to use, defaults to kombu.' - - - name: rpc_thread_pool_size - type: integer - default: 64 - help: 'Size of RPC thread pool' - - - name: rpc_conn_pool_size - type: integer - default: 30 - help: 'Size of RPC connection pool' - - - name: rpc_response_timeout - type: integer - default: 60 - help: 'Seconds to wait for a response from call or multicall' - - - name: rpc_cast_timeout - type: integer - default: 30 - help: 'Seconds to wait before a cast expires' - - - name: allowed_rpc_exception_modules - type: list - default: ['cinder.openstack.common.exception', 'nova.exception', 'cinder.exception', 'exceptions'] - help: 'Modules of exceptions that are permitted to be recreated upon receiving exception data from an rpc call.' - - - name: fake_rabbit - type: boolean - default: false - help: 'If passed, use a fake RabbitMQ provider' - - - name: control_exchange - type: string - default: 'openstack' - help: 'AMQP exchange to connect to if using RabbitMQ or Qpid' - - - name: amqp_rpc_single_reply_queue - type: boolean - default: false - help: 'Enable a fast single reply queue if using AMQP based RPC like RabbitMQ or Qpid.' - - - name: amqp_durable_queues - type: boolean - default: false - help: 'Use durable queues in amqp.' - - - name: amqp_auto_delete - type: boolean - default: false - help: 'Auto-delete queues in amqp.' - - - name: kombu_ssl_version - type: string - default: '' - help: 'SSL version to use' - - - name: kombu_ssl_keyfile - type: file - default: '' - help: 'SSL key file' - - - name: kombu_ssl_certfile - type: file - default: '' - help: 'SSL cert file' - - - name: kombu_ssl_ca_certs - type: file - default: '' - help: 'SSL certification authority file' - - - name: rabbit_host - type: host - default: 'localhost' - help: 'The RabbitMQ broker address where a single node is used' - - - name: rabbit_port - type: port - default: 5672 - help: 'The RabbitMQ broker port where a single node is used' - - - name: rabbit_hosts - type: list - default: ['$rabbit_host:$rabbit_port'] - help: 'RabbitMQ HA cluster host:port pairs' - - - name: rabbit_use_ssl - type: boolean - default: false - help: 'connect over SSL for RabbitMQ' - - - name: rabbit_userid - type: string - default: 'guest' - help: 'the RabbitMQ userid' - - - name: rabbit_password - type: string - default: 'guest' - help: 'the RabbitMQ password' - - - name: rabbit_virtual_host - type: string - default: '/' - help: 'the RabbitMQ virtual host' - - - name: rabbit_retry_interval - type: integer - default: 1 - help: 'how frequently to retry connecting with RabbitMQ' - - - name: rabbit_retry_backoff - type: integer - default: 2 - help: 'how long to backoff for between retries when connecting to RabbitMQ' - - - name: rabbit_max_retries - type: integer - default: 0 - help: 'maximum retries with trying to connect to RabbitMQ' - - - name: rabbit_ha_queues - type: boolean - default: false - help: 'use H/A queues in RabbitMQ' - - - name: qpid_hostname - type: host - default: 'localhost' - help: 'Qpid broker hostname' - - - name: qpid_port - type: port - default: 5672 - help: 'Qpid broker port' - - - name: qpid_hosts - type: list - default: ['$qpid_hostname:$qpid_port'] - help: 'Qpid HA cluster host:port pairs' - - - name: qpid_username - type: string - default: '' - help: 'Username for qpid connection' - - - name: qpid_password - type: string - default: '' - help: 'Password for qpid connection' - - - name: qpid_sasl_mechanisms - type: string - default: '' - help: 'Space separated list of SASL mechanisms to use for auth' - - - name: qpid_heartbeat - type: integer - default: 60 - help: 'Seconds between connection keepalive heartbeats' - - - name: qpid_protocol - type: enum - type_args: {'values': ['tcp', 'ssl']} - default: 'tcp' - help: "Transport to use, either 'tcp' or 'ssl'" - - - name: qpid_tcp_nodelay - type: boolean - default: true - help: 'Disable Nagle algorithm' - - - name: qpid_topology_version - type: integer - default: 1 - help: 'The qpid topology version to use. Version 1 is what was originally used by impl_qpid. Version 2 includes some backwards-incompatible changes that allow broker federation to work. Users should update to version 2 when they are able to take everything down, as it requires a clean break.' - - - name: rpc_zmq_bind_address - type: string - default: '*' - help: 'ZeroMQ bind address. Should be a wildcard' - comment: 'New param' - - - name: rpc_zmq_matchmaker - type: string - default: 'cinder.openstack.common.rpc.matchmaker.MatchMakerLocalhost' - help: 'MatchMaker driver' - - - name: rpc_zmq_port - type: port - default: 9501 - help: 'ZeroMQ receiver listening port' - - - name: rpc_zmq_contexts - type: integer - default: 1 - help: 'Number of ZeroMQ contexts, defaults to 1' - - - name: rpc_zmq_topic_backlog - type: integer - default: ~ - help: 'Maximum number of ingress messages to locally buffer per topic. Default is unlimited.' - - - name: rpc_zmq_ipc_dir - type: directory - default: '/var/run/openstack' - help: 'Directory for holding IPC sockets' - - - name: rpc_zmq_host - type: string - default: 'cinder' - help: "Name of this node. Must be a valid hostname, FQDN, or IP address. Must match 'host' option, if running Nova." - - - name: matchmaker_ringfile - type: file - default: '/etc/nova/matchmaker_ring.json' - help: 'Matchmaker ring file' - - - name: matchmaker_heartbeat_freq - type: integer - default: 300 - help: 'Heartbeat frequency' - comment: 'New param' - - - name: matchmaker_heartbeat_ttl - type: integer - default: 600 - help: 'Heartbeat time-to-live.' - - - name: port - type: port - default: 6379 - help: 'Use this port to connect to redis host.' - comment: 'New param' - - - name: password - type: string - default: ~ - help: 'Password for Redis server.' - - - name: scheduler_host_manager - type: string - default: 'cinder.scheduler.host_manager.HostManager' - help: 'The scheduler host manager class to use' - - - name: scheduler_max_attempts - type: integer - default: 3 - help: 'Maximum number of attempts to schedule an volume' - - - name: scheduler_default_filters - type: list - default: ['AvailabilityZoneFilter', 'CapacityFilter', 'CapabilitiesFilter'] - help: 'Which filter class names to use for filtering hosts when not specified in the request.' - - - name: scheduler_default_weighers - type: list - default: ['CapacityWeigher'] - help: 'Which weigher class names to use for weighing hosts.' - - - name: scheduler_driver - type: string - default: 'cinder.scheduler.filter_scheduler.FilterScheduler' - help: 'Default scheduler driver to use' - - - name: scheduler_json_config_location - type: file - default: '' - help: 'Absolute path to scheduler configuration JSON file.' - - - name: max_gigabytes - type: integer - default: 10000 - help: 'maximum number of volume gigabytes to allow per host' - - - name: capacity_weight_multiplier - type: float - default: 1.0 - help: 'Multiplier used for weighing volume capacity. Negative numbers mean to stack vs spread.' - - - name: volume_transfer_salt_length - type: integer - default: 8 - help: 'The number of characters in the salt.' - - - name: volume_transfer_key_length - type: integer - default: 16 - help: 'The number of characters in the autogenerated auth key.' - - - name: snapshot_same_host - type: boolean - default: true - help: 'Create volume from snapshot at the host where snapshot resides' - - - name: cloned_volume_same_az - type: boolean - default: true - help: 'Ensure that the new volumes are the same AZ as snapshot or source volume' - - - name: num_shell_tries - type: integer - default: 3 - help: 'number of times to attempt to run flakey shell commands' - - - name: reserved_percentage - type: integer - default: 0 - help: 'The percentage of backend capacity is reserved' - - - name: iscsi_num_targets - type: integer - default: 100 - help: 'The maximum number of iscsi target ids per host' - - - name: iscsi_target_prefix - type: string - default: 'iqn.2010-10.org.openstack:' - help: 'prefix for iscsi volumes' - - - name: iscsi_ip_address - type: host - default: '$my_ip' - help: 'The IP address that the iSCSI daemon is listening on' - - - name: iscsi_port - type: port - default: 3260 - help: 'The port that the iSCSI daemon is listening on' - - - name: num_iser_scan_tries - type: integer - default: 3 - help: 'The maximum number of times to rescan iSER targetto find volume' - - - name: iser_num_targets - type: integer - default: 100 - help: 'The maximum number of iser target ids per host' - - - name: iser_target_prefix - type: string - default: 'iqn.2010-10.org.iser.openstack:' - help: 'prefix for iser volumes' - - - name: iser_ip_address - type: host - default: '$my_ip' - help: 'The IP address that the iSER daemon is listening on' - - - name: iser_port - type: port - default: 3260 - help: 'The port that the iSER daemon is listening on' - - - name: volume_backend_name - type: string - default: ~ - help: 'The backend name for a given driver implementation' - - - name: use_multipath_for_image_xfer - type: boolean - default: false - help: 'Do we attach/detach volumes in cinder using multipath for volume to image and image to volume transfers?' - - - name: volume_clear - type: string - default: 'zero' - help: 'Method used to wipe old voumes' - - - name: volume_clear_size - type: integer - default: 0 - help: 'Size in MiB to wipe at start of old volumes. 0 => all' - - - name: available_devices - type: list - default: [] - help: 'List of all available devices' - - - name: coraid_esm_address - type: host - default: '' - help: 'IP address of Coraid ESM' - - - name: coraid_user - type: string - default: 'admin' - help: 'User name to connect to Coraid ESM' - - - name: coraid_group - type: string - default: 'admin' - help: 'Name of group on Coraid ESM to which coraid_user belongs' - - - name: coraid_password - type: string - default: 'password' - help: 'Password to connect to Coraid ESM' - - - name: coraid_repository_key - type: string - default: 'coraid_repository' - help: 'Volume Type key name to store ESM Repository Name' - - - name: eqlx_group_name - type: string - default: 'group-0' - help: 'Group name to use for creating volumes' - - - name: eqlx_cli_timeout - type: integer - default: 30 - help: 'Timeout for the Group Manager cli command execution' - - - name: eqlx_cli_max_retries - type: integer - default: 5 - help: 'Maximum retry count for reconnection' - - - name: eqlx_use_chap - type: boolean - default: false - help: 'Use CHAP authentificaion for targets?' - - - name: eqlx_chap_login - type: string - default: 'admin' - help: 'Existing CHAP account name' - - - name: eqlx_chap_password - type: string - default: 'password' - help: 'Password for specified CHAP account name' - - - name: eqlx_pool - type: string - default: 'default' - help: 'Pool in which volumes will be created' - - - name: glusterfs_shares_config - type: file - default: '/etc/cinder/glusterfs_shares' - help: 'File with the list of available gluster shares' - - - name: glusterfs_disk_util - type: string - default: 'df' - help: 'Use du or df for free space calculation' - - - name: glusterfs_sparsed_volumes - type: boolean - default: true - help: 'Create volumes as sparsed files which take no space.If set to False volume is created as regular file.In such case volume creation takes a lot of time.' - - - name: glusterfs_qcow2_volumes - type: boolean - default: false - help: 'Create volumes as QCOW2 files rather than raw files.' - - - name: gpfs_mount_point_base - type: directory - default: ~ - help: 'Path to the directory on GPFS mount point where volumes are stored' - - - name: gpfs_images_dir - type: directory - default: ~ - help: 'Path to GPFS Glance repository as mounted on Nova nodes' - - - name: gpfs_images_share_mode - type: string - default: ~ - help: 'Set this if Glance image repo is on GPFS as well so that the image bits can be transferred efficiently between Glance and cinder. Valid values are copy or copy_on_write. copy performs a full copy of the image, copy_on_write efficiently shares unmodified blocks of the image.' - - - name: gpfs_max_clone_depth - type: integer - default: 0 - help: 'A lengthy chain of copy-on-write snapshots or clones could have impact on performance. This option limits the number of indirections required to reach a specific block. 0 indicates unlimited.' - - - name: gpfs_sparse_volumes - type: boolean - default: true - help: 'Create volumes as sparse files which take no space. If set to False volume is created as regular file. In this case volume creation may take a significantly longer time.' - comment: 'New param' - - - name: hds_cinder_config_file - type: file - default: '/opt/hds/hus/cinder_hus_conf.xml' - help: 'configuration file for HDS cinder plugin for HUS' - - - name: cinder_huawei_conf_file - type: file - default: '/etc/cinder/cinder_huawei_conf.xml' - help: 'config data for cinder huawei plugin' - - - name: volume_group - type: string - default: 'cinder-volumes' - help: 'Name for the VG that will contain exported volumes' - - - name: pool_size - type: string - default: ~ - help: 'Size of thin provisioning pool' - - - name: lvm_mirrors - type: integer - default: 0 - help: 'If set, create lvms with multiple mirrors. Note that this requires lvm_mirrors + 2 pvs with available space' - - - name: lvm_type - type: string - default: 'default' - help: 'Type of LVM volumes to deploy;' - - - name: netapp_vfiler - type: string - default: ~ - help: 'Vfiler to use for provisioning' - - - name: netapp_login - type: string - default: ~ - help: 'User name for the storage controller' - - - name: netapp_password - type: string - default: ~ - help: 'Password for the storage controller' - - - name: netapp_vserver - type: string - default: ~ - help: 'Cluster vserver to use for provisioning' - - - name: netapp_server_hostname - type: string - default: ~ - help: 'Host name for the storage controller' - - - name: netapp_server_port - type: port - default: 80 - help: 'Port number for the storage controller' - - - name: thres_avl_size_perc_start - type: integer - default: 20 - help: 'Threshold available percent to start cache cleaning.' - - - name: thres_avl_size_perc_stop - type: integer - default: 60 - help: 'Threshold available percent to stop cache cleaning.' - - - name: expiry_thres_minutes - type: integer - default: 720 - help: 'Threshold minutes after which cache file can be cleaned.' - - - name: netapp_size_multiplier - type: float - default: 1.2 - help: 'Volume size multiplier to ensure while creation' - - - name: netapp_volume_list - type: string - default: ~ - help: 'Comma separated volumes to be used for provisioning' - - - name: netapp_storage_family - type: string - default: 'ontap_cluster' - help: 'Storage family type.' - - - name: netapp_storage_protocol - type: string - default: ~ - help: 'Storage protocol type.' - - - name: netapp_transport_type - type: string - default: 'http' - help: 'Transport type protocol' - - - name: nexenta_host - type: host - default: '' - help: 'IP address of Nexenta SA' - - - name: nexenta_rest_port - type: port - default: 2000 - help: 'HTTP port to connect to Nexenta REST API server' - - - name: nexenta_rest_protocol - type: enum - type_args: {'values': ['auto', 'http', 'https']} - default: 'auto' - help: 'Use http or https for REST connection' - - - name: nexenta_user - type: string - default: 'admin' - help: 'User name to connect to Nexenta SA' - - - name: nexenta_password - type: string - default: 'nexenta' - help: 'Password to connect to Nexenta SA' - - - name: nexenta_iscsi_target_portal_port - type: integer - default: 3260 - help: 'Nexenta target portal port' - - - name: nexenta_volume - type: string - default: 'cinder' - help: 'pool on SA that will hold all volumes' - - - name: nexenta_target_prefix - type: string - default: 'iqn.1986-03.com.sun:02:cinder-' - help: 'IQN prefix for iSCSI targets' - - - name: nexenta_target_group_prefix - type: string - default: 'cinder/' - help: 'prefix for iSCSI target groups on SA' - - - name: nexenta_shares_config - type: file - default: '/etc/cinder/nfs_shares' - help: 'File with the list of available nfs shares' - - - name: nexenta_mount_point_base - type: directory - default: '$state_path/mnt' - help: 'Base dir containing mount points for nfs shares' - - - name: nexenta_sparsed_volumes - type: boolean - default: true - help: 'Create volumes as sparsed files which take no space.If set to False volume is created as regular file.In such case volume creation takes a lot of time.' - - - name: nexenta_volume_compression - type: string - default: 'on' - help: 'Default compression value for new ZFS folders.' - - - name: nexenta_mount_options - type: string - default: ~ - help: 'Mount options passed to the nfs client. See section of the nfs man page for details' - - - name: nexenta_used_ratio - type: float - default: 0.95 - help: 'Percent of ACTUAL usage of the underlying volume before no new volumes can be allocated to the volume destination.' - - - name: nexenta_oversub_ratio - type: float - default: 1.0 - help: 'This will compare the allocated to available space on the volume destination. If the ratio exceeds this number, the destination will no longer be valid.' - - - name: nexenta_blocksize - type: string - default: '' - help: 'block size for volumes' - - - name: nexenta_sparse - type: boolean - default: false - help: 'flag to create sparse volumes' - - - name: nfs_shares_config - type: file - default: '/etc/cinder/nfs_shares' - help: 'File with the list of available nfs shares' - - - name: nfs_sparsed_volumes - type: boolean - default: true - help: 'Create volumes as sparsed files which take no space.If set to False volume is created as regular file.In such case volume creation takes a lot of time.' - comment: 'New param' - - - name: nfs_used_ratio - type: float - default: 0.95 - help: 'Percent of ACTUAL usage of the underlying volume before no new volumes can be allocated to the volume destination.' - - - name: nfs_oversub_ratio - type: float - default: 1.0 - help: 'This will compare the allocated to available space on the volume destination. If the ratio exceeds this number, the destination will no longer be valid.' - - - name: rbd_pool - type: string - default: 'rbd' - help: 'the RADOS pool in which rbd volumes are stored' - - - name: rbd_user - type: string - default: ~ - help: 'the RADOS client name for accessing rbd volumes - only set when using cephx authentication' - - - name: rbd_ceph_conf - type: file - default: '' - help: 'path to the ceph configuration file to use' - - - name: rbd_flatten_volume_from_snapshot - type: boolean - default: false - help: 'flatten volumes created from snapshots to remove dependency' - - - name: rbd_secret_uuid - type: string - default: ~ - help: 'the libvirt uuid of the secret for the rbd_uservolumes' - - - name: volume_tmp_dir - type: directory - default: ~ - help: 'where to store temporary image files if the volume driver does not write them directly to the volume' - - - name: rbd_max_clone_depth - type: integer - default: 5 - help: 'maximum number of nested clones that can be taken of a volume before enforcing a flatten prior to next clone. A value of zero disables cloning' - - - name: hp3par_api_url - type: string - default: '' - help: '3PAR WSAPI Server Url like https://<3par ip>:8080/api/v1' - - - name: hp3par_username - type: string - default: '' - help: '3PAR Super user username' - - - name: hp3par_password - type: string - default: '' - help: '3PAR Super user password' - - - name: hp3par_domain - type: string - default: ~ - help: 'This option is DEPRECATED and no longer used. The 3par domain name to use.' - - - name: hp3par_cpg - type: string - default: 'OpenStack' - help: 'The CPG to use for volume creation' - - - name: hp3par_cpg_snap - type: string - default: '' - help: 'The CPG to use for Snapshots for volumes. If empty hp3par_cpg will be used' - - - name: hp3par_snapshot_retention - type: string - default: '' - help: "The time in hours to retain a snapshot. You can't delete it before this expires." - - - name: hp3par_snapshot_expiration - type: string - default: '' - help: 'The time in hours when a snapshot expires and is deleted. This must be larger than expiration' - - - name: hp3par_debug - type: boolean - default: false - help: 'Enable HTTP debugging to 3PAR' - - - name: hp3par_iscsi_ips - type: list - default: [] - help: 'List of target iSCSI addresses to use.' - - - name: san_thin_provision - type: boolean - default: true - help: 'Use thin provisioning for SAN volumes?' - - - name: san_ip - type: host - default: '' - help: 'IP address of SAN controller' - - - name: san_login - type: string - default: 'admin' - help: 'Username for SAN controller' - - - name: san_password - type: string - default: '' - help: 'Password for SAN controller' - - - name: san_private_key - type: file - default: '' - help: 'Filename of private key to use for SSH authentication' - - - name: san_clustername - type: string - default: '' - help: 'Cluster name to use for creating volumes' - - - name: san_ssh_port - type: port - default: 22 - help: 'SSH port to use with SAN' - - - name: san_is_local - type: boolean - default: false - help: 'Execute commands locally instead of over SSH; use if the volume service is running on the SAN device' - comment: 'New param' - - - name: ssh_conn_timeout - type: integer - default: 30 - help: 'SSH connection timeout in seconds' - - - name: ssh_min_pool_conn - type: integer - default: 1 - help: 'Minimum ssh connections in the pool' - - - name: ssh_max_pool_conn - type: integer - default: 5 - help: 'Maximum ssh connections in the pool' - - - name: san_zfs_volume_base - type: string - default: 'rpool/' - help: 'The ZFS path under which to create zvols for volumes.' - - - name: scality_sofs_config - type: string - default: ~ - help: 'Path or URL to Scality SOFS configuration file' - comment: 'New param' - - - name: scality_sofs_mount_point - type: directory - default: '$state_path/scality' - help: 'Base dir where Scality SOFS shall be mounted' - - - name: scality_sofs_volume_dir - type: directory - default: 'cinder/volumes' - help: 'Path from Scality SOFS root to volume dir' - - - name: sf_emulate_512 - type: boolean - default: true - help: 'Set 512 byte emulation on volume creation; ' - - - name: sf_allow_tenant_qos - type: boolean - default: false - help: 'Allow tenants to specify QOS on create' - - - name: sf_account_prefix - type: string - default: 'cinder' - help: 'Create SolidFire accounts with this prefix' - - - name: sf_api_port - type: port - default: 443 - help: 'SolidFire API port. Useful if the device api is behind a proxy on a different port.' - - - name: storwize_svc_volpool_name - type: string - default: 'volpool' - help: 'Storage system storage pool for volumes' - - - name: storwize_svc_vol_rsize - type: integer - default: 2 - help: 'Storage system space-efficiency parameter for volumes' - - - name: storwize_svc_vol_warning - type: integer - default: 0 - help: 'Storage system threshold for volume capacity warnings' - - - name: storwize_svc_vol_autoexpand - type: boolean - default: true - help: 'Storage system autoexpand parameter for volumes' - - - name: storwize_svc_vol_grainsize - type: integer - default: 256 - help: 'Storage system grain size parameter for volumes' - - - name: storwize_svc_vol_compression - type: boolean - default: false - help: 'Storage system compression option for volumes' - - - name: storwize_svc_vol_easytier - type: boolean - default: true - help: 'Enable Easy Tier for volumes' - - - name: storwize_svc_vol_iogrp - type: integer - default: 0 - help: 'The I/O group in which to allocate volumes' - - - name: storwize_svc_flashcopy_timeout - type: integer - default: 120 - help: 'Maximum number of seconds to wait for FlashCopy to be prepared. Maximum value is 600 seconds' - - - name: storwize_svc_connection_protocol - type: string - default: 'iSCSI' - help: 'Connection protocol' - - - name: storwize_svc_multipath_enabled - type: boolean - default: false - help: 'Connect with multipath' - comment: 'New param' - - - name: storwize_svc_multihostmap_enabled - type: boolean - default: true - help: 'Allows vdisk to multi host mapping' - - - name: vmware_host_ip - type: host - default: ~ - help: 'IP address for connecting to VMware ESX/VC server.' - - - name: vmware_host_username - type: string - default: ~ - help: 'Username for authenticating with VMware ESX/VC server.' - - - name: vmware_host_password - type: string - default: ~ - help: 'Password for authenticating with VMware ESX/VC server.' - - - name: vmware_wsdl_location - type: string - default: ~ - help: 'Optional VIM service WSDL Location e.g http:///vimService.wsdl. Optional over-ride to default location for bug work-arounds.' - - - name: vmware_api_retry_count - type: integer - default: 10 - help: 'Number of times VMware ESX/VC server API must be retried upon connection related issues.' - - - name: vmware_task_poll_interval - type: integer - default: 5 - help: 'The interval used for polling remote tasks invoked on VMware ESX/VC server.' - - - name: vmware_volume_folder - type: string - default: 'cinder-volumes' - help: 'Name for the folder in the VC datacenter that will contain cinder volumes.' - - - name: vmware_image_transfer_timeout_secs - type: integer - default: 7200 - help: 'Timeout in seconds for VMDK volume transfer between Cinder and Glance.' - - - name: windows_iscsi_lun_path - type: string - default: 'C:\\iSCSIVirtualDisks' - help: 'Path to store VHD backed volumes' - - - name: xenapi_nfs_server - type: string - default: ~ - help: 'NFS server to be used by XenAPINFSDriver' - - - name: xenapi_nfs_serverpath - type: string - default: ~ - help: 'Path of exported NFS, used by XenAPINFSDriver' - - - name: xenapi_connection_url - type: string - default: ~ - help: 'URL for XenAPI connection' - - - name: xenapi_connection_username - type: string - default: 'root' - help: 'Username for XenAPI connection' - - - name: xenapi_connection_password - type: string - default: ~ - help: 'Password for XenAPI connection' - - - name: xenapi_sr_base_path - type: directory - default: '/var/run/sr-mount' - help: 'Base path to the storage repository' - - - name: xiv_ds8k_proxy - type: string - default: 'xiv_ds8k_openstack.nova_proxy.XIVDS8KNovaProxy' - help: 'Proxy driver that connects to the IBM Storage Array' - - - name: xiv_ds8k_connection_type - type: string - default: 'iscsi' - help: 'Connection type to the IBM Storage Array' - - - name: zadara_vpsa_ip - type: host - default: ~ - help: 'Management IP of Zadara VPSA' - - - name: zadara_vpsa_port - type: port - default: ~ - help: 'Zadara VPSA port number' - - - name: zadara_vpsa_use_ssl - type: boolean - default: false - help: 'Use SSL connection' - - - name: zadara_user - type: string - default: ~ - help: 'User name for the VPSA' - - - name: zadara_password - type: string - default: ~ - help: 'Password for the VPSA' - - - name: zadara_vpsa_poolname - type: string - default: ~ - help: 'Name of VPSA storage pool for volumes' - - - name: zadara_vol_thin - type: boolean - default: true - help: 'Default thin provisioning policy for volumes' - - - name: zadara_vol_encrypt - type: boolean - default: false - help: 'Default encryption policy for volumes' - - - name: zadara_default_striping_mode - type: string - default: 'simple' - help: 'Default striping mode for volumes' - - - name: zadara_default_stripesize - type: integer - default: 64 - help: 'Default stripe size for volumes' - - - name: zadara_vol_name_template - type: string - default: 'OS_%s' - help: 'Default template for VPSA volume names' - - - name: zadara_vpsa_auto_detach_on_delete - type: boolean - default: true - help: 'Automatically detach from servers on volume delete' - - - name: zadara_vpsa_allow_nonexistent_delete - type: boolean - default: true - help: "Don't halt on deletion of non-existing volumes" - - - name: volume_driver - type: string - default: 'cinder.volume.drivers.lvm.LVMISCSIDriver' - help: 'Driver to use for volume creation' - - - name: migration_create_volume_timeout_secs - type: integer - default: 300 - help: 'Timeout for creating the volume to migrate to when performing volume migration' - - - name: volume_dd_blocksize - type: string - default: '1M' - help: 'The default block size used when copying/clearing volumes' - diff --git a/rubick/schemas/collector.py b/rubick/schemas/collector.py deleted file mode 100644 index 449b412..0000000 --- a/rubick/schemas/collector.py +++ /dev/null @@ -1,482 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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 argparse -from copy import copy -from lib2to3.pgen2 import driver -from lib2to3.pgen2 import token -from lib2to3.pygram import python_grammar, python_symbols as py -from lib2to3.pytree import Node, Leaf -import os -import re -import sys -import traceback - -from oslo.config import cfg - -from rubick.schemas.yaml_utils import yaml_string, yaml_value - - -def identity(x): - return x - -__builtins__._ = identity - - -class SchemaBuilderSchemaWriter(object): - def __init__(self, file, project, version): - super(SchemaBuilderSchemaWriter, self).__init__() - self.file = file - self.project = project - self.version = version - self._started = False - self._conf_variable = '%s_%s' % (self.project, - self.version.replace('.', '_')) - - def _ensure_header(self): - if not self._started: - self._output_header() - self._started = True - - def _output_header(self): - self.file.write("""from rubick.schema import ConfigSchemaRegistry - -{0} = ConfigSchemaRegistry.register_schema(project='{0}') - -with {0}.version('{1}') as {2}:""".format(self.project, self.version, - self._conf_variable)) - - def section(self, name): - self._ensure_header() - self.file.write("\n\n %s.section('%s')" % ( - self._conf_variable, name)) - - def param(self, name, type, default_value=None, description=None): - self._ensure_header() - self.file.write("\n\n %s.param('%s', type='%s', default=%s" % ( - self._conf_variable, name, type, repr(default_value))) - if description: - self.file.write(", description=\"%s\"" % ( - description.replace('"', '\''))) - self.file.write(")") - - def comment(self, text): - self.file.write("\n\n # %s" % text) - - -class YamlSchemaWriter(object): - def __init__(self, file, project, version): - super(YamlSchemaWriter, self).__init__() - self.file = file - self.project = project - self.version = version - self._output_header() - - def _output_header(self): - self.file.write("project: %s\n" % self.project) - self.file.write("version: %s\n" % self.version) - self.file.write("parameters:\n") - - def section(self, name): - self._current_section = name - - def param(self, name, type, default_value=None, description=None): - fullname = name - if self._current_section and self._current_section != 'DEFAULT': - fullname = '%s.%s' % (self._current_section, name) - - self.file.write(" - name: %s\n" - % yaml_string(fullname, allowSimple=True)) - self.file.write(" type: %s\n" % yaml_string(type, allowSimple=True)) - self.file.write(" default: %s\n" % yaml_value(default_value)) - if description: - self.file.write(" help: %s\n" % yaml_string(description)) - - self.file.write("\n") - - def comment(self, text): - self.file.write("\n# %s\n" % text) - - -def parse_args(argv): - parser = argparse.ArgumentParser() - parser.add_argument('project', - help='Name of the project (e.g. "nova")') - parser.add_argument('version', - help='Version of the project (e.g. "2013.1.3")') - parser.add_argument('config_or_module', - help='Config file sample or Python module to process') - args = parser.parse_args(argv[1:]) - return args - - -def sanitize_type_and_value(param_name, param_type, param_value): - if param_value == '': - param_value = None - elif param_type == 'boolean': - if param_value.lower() == 'false': - param_value = False - elif param_value.lower() == 'true': - param_value = True - elif param_type == 'integer': - param_value = int(param_value) - if param_name.endswith('_port'): - param_type = 'port' - elif param_type == 'float': - param_value = float(param_value) - elif param_type == 'list': - param_type = 'string_list' - if param_value == '': - param_value = [] - else: - param_value = param_value.split(',') - elif (param_type == 'string' and - param_name.endswith('_host') and - param_value in ['0.0.0.0', 'localhost', '127.0.0.1']): - param_type = 'host' - elif param_type == 'string' and param_name.endswith('_listen'): - param_type = 'host' - - return (param_type, param_value) - - -def generate_schema_from_sample_config(project, version, config_file, writer): - with open(config_file, 'r') as f: - config_lines = f.readlines() - - description_lines = [] - for line in config_lines: - if line.startswith('['): - section_name = line.strip('[]\n') - writer.section(section_name) - description_lines = [] - continue - - if line.strip() in ['', '#']: - description_lines = [] - continue - - if line.startswith('# '): - description_lines.append(line[2:].strip()) - continue - - description = ' '.join(description_lines) - match = re.search('^(.*)\((.*?) value\)$', description) - if match: - description = match.group(1) - param_type = match.group(2).strip() - if param_type == 'floating point': - param_type = 'float' - else: - param_type = 'string' - - line = line.strip('#\n') - param_name, param_value = [ - s.strip() for s in re.split('[:=]', line, 1)] - - (param_type, param_value) = \ - sanitize_type_and_value(param_name, param_type, param_value) - - writer.param(param_name, param_type, param_value, description) - - -OPT_TYPE_MAPPING = { - 'StrOpt': 'string', - 'BoolOpt': 'boolean', - 'IntOpt': 'integer', - 'FloatOpt': 'float', - 'ListOpt': 'list', - 'MultiStrOpt': 'multi' -} - - -OPTION_REGEX = re.compile(r"(%s)" % "|".join(OPT_TYPE_MAPPING.keys())) - - -def convert(gr, raw_node): - type, value, context, children = raw_node - # if has children or correspond to nonterminal - if children or type in gr.number2symbol: - return Node(type, children, context=context) - else: - return Leaf(type, value, context=context) - - -def walk_tree(root): - while True: - yield root - - # Optimize traversing single-child nodes - if len(root.children) == 1: - root = root.children[0] - continue - - break - - for child in copy(root.children): - for node in walk_tree(child): - yield node - - -def extract_config_from_file(path): - with open(path) as f: - contents = f.read() - - d = driver.Driver(python_grammar, convert=convert) - tree = d.parse_string(contents) - - def mark_stmt(node): - n = node - while n: - if n.type == py.stmt: - n.marked = True - break - n = n.parent - - fullnames = {} - # Process imports and renames - for node in walk_tree(tree): - if node.type == py.import_from: - mod = str(node.children[1]).strip() - for node2 in walk_tree(node.children[3]): - if node2.type == py.import_as_name: - n = str(node2).strip() - f = '.'.join([mod, n]) - fullnames[n] = f - elif node.type == py.expr_stmt: - if len(node.children) > 1 and node.children[1].type == token.EQUAL: - lhs = str(node.children[0]).strip() - rhs = str(node.children[2]).strip() - if re.match('\S+(\.\S+)*', rhs): - parts = rhs.split('.') - if parts[0] in fullnames: - rhs = '.'.join([fullnames[parts[0]]] + parts[1:]) - fullnames[lhs] = rhs - - if any([rhs.startswith(s) for s in ['oslo.', 'oslo.config.', 'oslo.config.cfg.']]): - mark_stmt(node) - - # Process all callsites CONF.register* - for node in walk_tree(tree): - if node.type == py.power and node.children[0].children[0].type == token.NAME: - s = str(node.children[0]).strip() - if s in fullnames: - s = fullnames[s] - - cs = node.children - i = 1 - while i < len(cs) and cs[i].type == py.trailer: - c = cs[i] - if c.children[0].type != token.DOT: - break - - s += '.' + c.children[1].value - i += 1 - - if i < len(cs) and cs[i].type == py.trailer and cs[i].children[0].type == token.LPAR: - # call site - if s.startswith('oslo.config.cfg.CONF.'): - rest = s[len('oslo.config.cfg.CONF.'):] - if rest.startswith('register_'): - mark_stmt(node) - - if s.startswith('oslo.config.cfg.'): - rest = s[len('oslo.config.cfg.'):] - if rest.endswith('Opt'): - mark_stmt(node) - - # Traverse code and find all var references - seen_vars = set() - referenced_vars_queue = [] - - def find_definition(tree, name): - for node in walk_tree(tree): - if node.type == py.classdef and node.children[1].value == name: - return node - elif node.type == py.funcdef and node.children[1].value == name: - return node - elif node.type == py.import_name: - imported_name = str(node.children[1]).strip() - if imported_name == name: - return node - elif node.type == py.import_from: - for n in walk_tree(node): - if n.type == py.import_as_name: - i = 0 - if len(n.children) == 3: - i = 2 - - if n.children[i].value == name: - return node - elif node.type == py.expr_stmt: - if len(node.children) > 1 and node.children[1].type == token.EQUAL: - for n in walk_tree(node): - if n.type == py.power: - assignment_name = str(n.children[0]).strip() - if assignment_name == name: - return node - - return None - - def collect_refs(root): - for n2 in walk_tree(root): - if n2.type == py.power and n2.children[0].children[0].type == token.NAME: - name = n2.children[0].children[0].value - x = 1 - while (x < len(n2.children) and - n2.children[x].type == py.trailer and - n2.children[x].children[0].type == token.DOT): - name += str(n2.children[x]).strip() - x += 1 - - if '.' not in name: - isKWArgName = False - n = n2 - while n.parent: - if n.parent.type == py.argument: - arg = n.parent - if len(arg.children) > 1 and arg.children[1].type == token.EQUAL and n == arg.children[0]: - isKWArgName = True - n = n.parent - - if isKWArgName: - continue - - if name in dir(__builtins__): - continue - - if name not in seen_vars: - seen_vars.add(name) - referenced_vars_queue.append(name) - - for node in tree.children: - if node.type == py.stmt and (hasattr(node, 'marked') and node.marked): - collect_refs(node) - - for name in referenced_vars_queue: - node = find_definition(tree, name) - if node: - mark_stmt(node) - collect_refs(node) - else: - while '.' in name: - name = '.'.join(name.split('.')[:-1]) - node = find_definition(tree, name) - if node: - mark_stmt(node) - collect_refs(node) - - # Remove all unmarked top-level statements - for node in walk_tree(tree): - if node.type == py.stmt and node.parent.type == py.file_input: - if not (hasattr(node, 'marked') and node.marked): - node.remove() - - code = str(tree) - - try: - exec code in {'__file__': path} - except Exception: - sys.stderr.write("Error processing file %s\n" % path) - traceback.print_exc() - sys.stderr.write(code) - - -def generate_schema_from_code(project, version, module_path, writer): - old_sys_path = copy(sys.path) - - filepaths = [] - module_directory = '' - - if os.path.isdir(module_path): - module_directory = module_path - while module_directory != '': - # TODO(mkulkin): handle .pyc and .pyo - if not os.path.isfile( - os.path.join(module_directory, '__init__.py')): - break - - module_directory = os.path.dirname(module_directory) - - if module_directory not in sys.path: - sys.path.insert(0, module_directory) - - for (dirpath, _, filenames) in os.walk(module_path): - for filename in filenames: - if not filename.endswith('.py'): - continue - - filepath = os.path.join(dirpath, filename) - with open(filepath) as f: - content = f.read() - if not re.search('Opt\(', content): - continue - - filepaths.append(filepath) - else: - filepaths.append(module_path) - - for filepath in filepaths: - extract_config_from_file(filepath) - - print_group_opts(writer, 'DEFAULT', cfg.CONF._opts.values()) - for group_name in cfg.CONF._groups: - print_group_opts(writer, group_name, cfg.CONF._groups[group_name]._opts.values()) - - sys.path = old_sys_path - - -def print_group_opts(writer, group, opts): - writer.section(group) - for opt in opts: - print_opt(writer, opt['opt']) - - -def print_opt(writer, opt): - opt_name, opt_default, opt_help = opt.dest, opt.default, opt.help - - if not opt_help: - sys.stderr.write('WARNING: "%s" is missing help string.\n' % opt_name) - opt_help = "" - - opt_type = None - try: - opt_type = OPT_TYPE_MAPPING.get( - OPTION_REGEX.search(str(type(opt))).group(0)) - except (ValueError, AttributeError) as err: - sys.stderr.write("%s\n" % str(err)) - opt_type = 'string' - - writer.param(opt_name, opt_type, opt_default, opt_help) - - -def main(argv): - args = parse_args(argv) - params = vars(args) - - project = params.pop('project') - version = params.pop('version') - path = params.pop('config_or_module') - - writer = YamlSchemaWriter(sys.stdout, project, version) - - if os.path.isdir(path) or path.endswith('.py'): - generate_schema_from_code(project, version, path, - writer=writer) - else: - generate_schema_from_sample_config(project, version, path, - writer=writer) - - -if __name__ == '__main__': - main(sys.argv) diff --git a/rubick/schemas/generator.py b/rubick/schemas/generator.py deleted file mode 100644 index 63b6c62..0000000 --- a/rubick/schemas/generator.py +++ /dev/null @@ -1,307 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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 argparse -from collections import OrderedDict -import glob -import logging -import os.path - -import yaml - -from rubick.common import index, Version, Issue -from rubick.schema import TypeValidatorRegistry as TypeRegistry -from rubick.schemas.yaml_utils import yaml_string, yaml_value - - -DIFF_THRESHOLD = 0.5 - - -logger = logging.getLogger('rubick.schemas.generator') - - -def yaml_dump_schema_records(records): - lines = [] - - for record in records: - if len(record['added']) == 0 and len(record['removed']) == 0: - continue - - lines.append('- version: %s' % yaml_string(str(record['version']))) - if 'checkpoint' in record: - lines.append(' checkpoint: %s' % yaml_value(record['checkpoint'])) - if 'added' in record and len(record['added']) > 0: - lines.append(' added:') - for param in record['added']: - lines.append('') - - lines.append(' - name: %s' % yaml_string(param['name'], - allowSimple=True)) - lines.append(' type: %s' % yaml_string(param['type'], - allowSimple=True)) - if 'default' in param: - lines.append(' default: %s' - % yaml_value(param['default'])) - if 'help' in param: - lines.append(' help: %s' - % yaml_string(param['help'])) - - extra_data = [k for k in param.keys() - if k not in ['name', 'type', 'default', 'help']] - for attr in extra_data: - lines.append(' %s: %s' - % (attr, yaml_value(param[attr]))) - - if 'removed' in record and len(record['removed']) > 0: - lines.append(' removed:') - for removed in record['removed']: - lines.append(' - %s' % yaml_string(removed, allowSimple=True)) - - lines.append('') - lines.append('# ====================================================') - lines.append('') - - return "\n".join(lines) - - -def generate_project_schema(project): - logger.info('Processing project %s' % project) - project_path = os.path.join(os.path.dirname(__file__), project) - - files = glob.glob(os.path.join(project_path, '*.yml')) - if files == []: - logger.info("Found no YAML files in project %s. Skipping it" % project) - return - - x = index(files, lambda f: f.endswith('.conf.yml')) - if x != -1: - database_file = files[x] - del files[x] - else: - database_file = os.path.join(project_path, project + '.conf.yml') - - schema_records = [] - if os.path.exists(database_file): - logger.debug("Processing database file %s" % database_file) - with open(database_file) as f: - schema_records.extend(yaml.load(f.read())) - - schema_versions = [] - for version_file in files: - logger.debug("Processing version file %s" % version_file) - with open(version_file) as f: - schema_versions.append(yaml.load(f.read())) - - schema_versions = sorted(schema_versions, - key=lambda s: Version(s['version'])) - - parameters = OrderedDict() - for schema in schema_versions: - added = [] - - seen = set() - - logger.debug('Processing schema version %s' % schema['version']) - - for param in schema['parameters']: - # TODO(mkulkin): reduce the level of nesting - prev_param = parameters.get(param['name'], None) - - if not prev_param: - logger.debug('Parameter %s does not exist yet,' - ' adding it as new' - % param['name']) - added.append(param) - else: - seen.add(param['name']) - - if param['type'] != prev_param['type']: - validator = TypeRegistry.get_validator(prev_param['type']) - if param['type'] == validator.base_type: - param['type'] = prev_param['type'] - - if param.get('default', None) is not None: - type_args = param.get('type_args', {}) - value = validator.validate(param['default'], **type_args) - if not isinstance(value, Issue): - param['default'] = value - else: - logger.error("In project '%s' version %s" - " default value for parameter" - " '%s' is not valid value of" - " type %s: %s" - % (project, schema['version'], - param['name'], param['type'], - repr(param['default']))) - else: - logger.debug('Parameter %s type has' - ' changed from %s to %s' % - (param['name'], prev_param['type'], - param['type'])) - param['comment'] = 'Type has changed' - added.append(param) - continue - - if param.get('default', None) != \ - prev_param.get('default', None): - logger.debug('Parameter %s default value' - ' has changed from %s to %s' % - (param['name'], prev_param['default'], - param['default'])) - param['comment'] = 'Default value has changed' - added.append(param) - continue - - if param.get('help', None) != prev_param.get('help', None): - param['comment'] = 'Help string has changed' - added.append(param) - - removed = [name for name in parameters.keys() if name not in seen] - if len(removed) > 0: - logger.debug('Following parameters from previous' - ' schema version are not present in' - ' current version, marking as removed: %s' - % ','.join(removed)) - - # Decide either to use full schema update or incremental - changes_count = sum(map(len, [added, removed])) - - logger.debug('Found %d change(s) from previous version schema' - % changes_count) - - if changes_count > int(len(parameters) * DIFF_THRESHOLD): - logger.debug('Using full schema update') - - new_parameters = parameters.copy() - for param in added: - new_parameters[param['name']] = param - for name in removed: - del new_parameters[name] - - new_schema_record = dict(version=schema['version'], - added=new_parameters.values(), - removed=[], - checkpoint=True) - else: - logger.debug('Using incremental schema update') - - new_schema_record = dict(version=schema['version'], - added=added, removed=removed) - - # Place schema record either replacing existing one or appending as new - old_schema_record_idx = index(schema_records, lambda r: - str(r['version']) == - str(new_schema_record['version'])) - - if old_schema_record_idx != -1: - old_schema_record = schema_records[old_schema_record_idx] - # Collect information from existing records - old_schema_parameters = {} - for param in old_schema_record.get('added', []): - old_schema_parameters[param['name']] = param - - for param in added: - old_param = old_schema_parameters.get(param['name'], None) - if not old_param: - param.setdefault('comment', 'New param') - continue - - extra_data = [(k, v) for k, v in old_param.items() - if k not in ['name', 'type', 'default', 'help']] - param.update(extra_data) - - validator = TypeRegistry.get_validator(old_param['type']) - if param['type'] not in [old_param['type'], - validator.base_type]: - param['comment'] = 'Type has changed' - # Type has changed, enforcing old type to prevent - # accidental data loss - param['type'] = old_param['type'] - if 'default' in old_param: - param['default'] = old_param['default'] - - if param.get('default', None) is not None: - type_args = old_param.get('type_args', {}) - value = validator.validate(old_param['default'], **type_args) - if not isinstance(value, Issue): - param['default'] = value - else: - logger.error("In project '%s' version %s default value" - " for parameter '%s' is not valid value" - " of type %s: %s" % - (project, schema['version'], - param['name'], param['type'], - repr(param['default']))) - - if param.get('default', None) != old_param.get('default', - None): - param['comment'] = 'Default value has changed' - continue - - logger.debug('Replacing schema record %s' - % repr(new_schema_record)) - schema_records[old_schema_record_idx] = new_schema_record - else: - for param in added: - param.setdefault('comment', 'New param') - - logger.debug('Appending schema record %s' - % repr(new_schema_record)) - schema_records.append(new_schema_record) - - # Update parameter info - for param in new_schema_record.get('added', []): - parameters[param['name']] = param - - for name in new_schema_record.get('removed', []): - del parameters[name] - - schema_records = sorted(schema_records, - key=lambda r: Version(r['version'])) - - with open(database_file, 'w') as f: - f.write(yaml_dump_schema_records(schema_records)) - - -def parse_args(argv): - parser = argparse.ArgumentParser() - parser.add_argument('-l', '--loglevel', default='INFO', - help='Loglevel to use') - parser.add_argument('projects', nargs='*', - help='Name of the projects (e.g. "nova")') - args = parser.parse_args(argv[1:]) - return args - - -def main(argv): - args = parse_args(argv) - params = vars(args) - - logging.basicConfig(level=params['loglevel']) - if 'project' in params: - projects = [params['project']] - else: - projects = [] - for project_path in glob.glob(os.path.join(os.path.dirname(__file__), - '*')): - if not os.path.isdir(project_path): - continue - projects.append(os.path.basename(project_path)) - - for project in projects: - generate_project_schema(project) - - -if __name__ == '__main__': - import sys - main(sys.argv) diff --git a/rubick/schemas/glance_api/2013.2.1.yml b/rubick/schemas/glance_api/2013.2.1.yml deleted file mode 100644 index fc47bd1..0000000 --- a/rubick/schemas/glance_api/2013.2.1.yml +++ /dev/null @@ -1,556 +0,0 @@ -project: glance_api -version: '2013.2.1' -parameters: - - - name: verbose - type: string - default: 'False' - help: 'Show more verbose log output (sets INFO log level output)' - - - name: debug - type: string - default: 'False' - help: 'Show debugging output in logs (sets DEBUG log level output)' - - - name: default_store - type: string - default: 'file' - help: "Which backend scheme should Glance use by default is not specified in a request to add a new image to Glance? Known schemes are determined by the known_stores option below. Default: 'file'" - - - name: known_stores - type: string - default: 'glance.store.filesystem.Store,' - help: 'List of which store classes and store class locations are currently known to glance at startup.' - - - name: image_size_cap - type: string - default: '1099511627776' - help: 'Maximum image size (in bytes) that may be uploaded through the Glance API server. Defaults to 1 TB. WARNING: this value should only be increased after careful consideration and must be set to a value under 8 EB (9223372036854775808).' - - - name: bind_host - type: host - default: '0.0.0.0' - help: 'Address to bind the API server' - - - name: bind_port - type: string - default: '9292' - help: 'Port the bind the API server to' - - - name: log_file - type: string - default: '/var/log/glance/api.log' - help: 'Log to this file. Make sure you do not set the same log file for both the API and registry servers!' - - - name: backlog - type: string - default: '4096' - help: 'Backlog requests when creating socket' - - - name: tcp_keepidle - type: string - default: '600' - help: 'TCP_KEEPIDLE value in seconds when creating socket. Not supported on OS X.' - - - name: sql_connection - type: string - default: 'sqlite:///glance.sqlite' - help: 'SQLAlchemy connection string for the reference implementation registry server. Any valid SQLAlchemy connection string is fine. See: http://www.sqlalchemy.org/docs/05/reference/sqlalchemy/connections.html#sqlalchemy.create_engine' - - - name: sql_idle_timeout - type: string - default: '3600' - help: "MySQL uses a default `wait_timeout` of 8 hours, after which it will drop idle connections. This can result in 'MySQL Gone Away' exceptions. If you notice this, you can lower this value to ensure that SQLAlchemy reconnects before MySQL can drop the connection." - - - name: workers - type: string - default: '1' - help: 'Number of Glance API worker processes to start. On machines with more than one CPU increasing this value may improve performance (especially if using SSL with compression turned on). It is typically recommended to set this value to the number of CPUs present on your machine.' - - - name: admin_role - type: string - default: 'admin' - help: 'Role used to identify an authenticated user as administrator' - - - name: allow_anonymous_access - type: string - default: 'False' - help: 'Allow unauthenticated users to access the API with read-only privileges. This only applies when using ContextMiddleware.' - - - name: enable_v1_api - type: string - default: 'True' - help: 'Allow access to version 1 of glance api' - - - name: enable_v2_api - type: string - default: 'True' - help: 'Allow access to version 2 of glance api' - - - name: show_image_direct_url - type: string - default: 'False' - help: "Return the URL that references where the data is stored on the backend storage system. For example, if using the file system store a URL of 'file:///path/to/image' will be returned to the user in the 'direct_url' meta-data field. The default value is false." - - - name: send_identity_headers - type: string - default: 'False' - help: 'Send headers containing user and tenant information when making requests to the v1 glance registry. This allows the registry to function as if a user is authenticated without the need to authenticate a user itself using the auth_token middleware. The default value is false.' - - - name: container_formats - type: string - default: 'ami,ari,aki,bare,ovf' - help: "Supported values for the 'container_format' image attribute" - - - name: disk_formats - type: string - default: 'ami,ari,aki,vhd,vmdk,raw,qcow2,vdi,iso' - help: "Supported values for the 'disk_format' image attribute" - - - name: lock_path - type: string - default: None - help: 'Directory to use for lock files. Default to a temp directory (string value). This setting needs to be the same for both glance-scrubber and glance-api.' - - - name: property_protection_file - type: string - default: '' - help: "Property Protections config file This file contains the rules for property protections and the roles associated with it. If this config value is not specified, by default, property protections won't be enforced. If a value is specified and the file is not found, then an HTTPInternalServerError will be thrown." - - - name: user_storage_quota - type: string - default: '0' - help: 'Set a system wide quota for every user. This value is the total number of bytes that a user can use across all storage systems. A value of 0 means unlimited.' - - - name: use_syslog - type: string - default: 'False' - help: 'Send logs to syslog (/dev/log) instead of to file specified by `log_file`' - - - name: syslog_log_facility - type: string - default: 'LOG_LOCAL0' - help: 'Facility to use. If unset defaults to LOG_USER.' - - - name: cert_file - type: string - default: '/path/to/certfile' - help: 'Certificate file to use when starting API server securely' - - - name: key_file - type: string - default: '/path/to/keyfile' - help: 'Private key file to use when starting API server securely' - - - name: ca_file - type: string - default: '/path/to/cafile' - help: 'CA certificate file to use to verify connecting clients' - - - name: metadata_encryption_key - type: string - default: '<16, 24 or 32 char registry metadata key>' - help: "AES key for encrypting store 'location' metadata, including -- if used -- Swift or S3 credentials Should be set to a random string of length 16, 24 or 32 bytes" - - - name: registry_host - type: host - default: '0.0.0.0' - help: 'Address to find the registry server' - - - name: registry_port - type: string - default: '9191' - help: 'Port the registry server is listening on' - - - name: registry_client_protocol - type: string - default: 'http' - help: 'What protocol to use when connecting to the registry server? Set to https for secure HTTP communication' - - - name: registry_client_key_file - type: string - default: '/path/to/key/file' - help: 'The path to the key file to use in SSL connections to the registry server, if any. Alternately, you may set the GLANCE_CLIENT_KEY_FILE environ variable to a filepath of the key file' - - - name: registry_client_cert_file - type: string - default: '/path/to/cert/file' - help: 'The path to the cert file to use in SSL connections to the registry server, if any. Alternately, you may set the GLANCE_CLIENT_CERT_FILE environ variable to a filepath of the cert file' - - - name: registry_client_ca_file - type: string - default: '/path/to/ca/file' - help: 'The path to the certifying authority cert file to use in SSL connections to the registry server, if any. Alternately, you may set the GLANCE_CLIENT_CA_FILE environ variable to a filepath of the CA cert file' - - - name: registry_client_insecure - type: string - default: 'False' - help: "When using SSL in connections to the registry server, do not require validation via a certifying authority. This is the registry's equivalent of specifying --insecure on the command line using glanceclient for the API Default: False" - - - name: registry_client_timeout - type: string - default: '600' - help: "The period of time, in seconds, that the API server will wait for a registry request to complete. A value of '0' implies no timeout. Default: 600" - - - name: db_auto_create - type: string - default: 'False' - help: 'Whether to automatically create the database tables. Default: False' - - - name: sqlalchemy_debug - type: string - default: 'True' - help: 'Enable DEBUG log messages from sqlalchemy which prints every database query and response. Default: False' - - - name: notifier_strategy - type: string - default: 'noop' - help: 'Notifications can be sent when images are create, updated or deleted. There are three methods of sending notifications, logging (via the log_file directive), rabbit (via a rabbitmq queue), qpid (via a Qpid message queue), or noop (no notifications sent, the default)' - - - name: rabbit_host - type: host - default: 'localhost' - help: 'Configuration options if sending notifications via rabbitmq (these are the defaults)' - - - name: rabbit_port - type: string - default: '5672' - help: 'Configuration options if sending notifications via rabbitmq (these are the defaults)' - - - name: rabbit_use_ssl - type: string - default: 'false' - help: 'Configuration options if sending notifications via rabbitmq (these are the defaults)' - - - name: rabbit_userid - type: string - default: 'guest' - help: 'Configuration options if sending notifications via rabbitmq (these are the defaults)' - - - name: rabbit_password - type: string - default: 'guest' - help: 'Configuration options if sending notifications via rabbitmq (these are the defaults)' - - - name: rabbit_virtual_host - type: string - default: '/' - help: 'Configuration options if sending notifications via rabbitmq (these are the defaults)' - - - name: rabbit_notification_exchange - type: string - default: 'glance' - help: 'Configuration options if sending notifications via rabbitmq (these are the defaults)' - - - name: rabbit_notification_topic - type: string - default: 'notifications' - help: 'Configuration options if sending notifications via rabbitmq (these are the defaults)' - - - name: rabbit_durable_queues - type: string - default: 'False' - help: 'Configuration options if sending notifications via rabbitmq (these are the defaults)' - - - name: qpid_notification_exchange - type: string - default: 'glance' - help: 'Configuration options if sending notifications via Qpid (these are the defaults)' - - - name: qpid_notification_topic - type: string - default: 'notifications' - help: 'Configuration options if sending notifications via Qpid (these are the defaults)' - - - name: qpid_host - type: host - default: 'localhost' - help: 'Configuration options if sending notifications via Qpid (these are the defaults)' - - - name: qpid_port - type: string - default: '5672' - help: 'Configuration options if sending notifications via Qpid (these are the defaults)' - - - name: qpid_username - type: string - default: '' - help: 'Configuration options if sending notifications via Qpid (these are the defaults)' - - - name: qpid_password - type: string - default: '' - help: 'Configuration options if sending notifications via Qpid (these are the defaults)' - - - name: qpid_sasl_mechanisms - type: string - default: '' - help: 'Configuration options if sending notifications via Qpid (these are the defaults)' - - - name: qpid_reconnect_timeout - type: string - default: '0' - help: 'Configuration options if sending notifications via Qpid (these are the defaults)' - - - name: qpid_reconnect_limit - type: string - default: '0' - help: 'Configuration options if sending notifications via Qpid (these are the defaults)' - - - name: qpid_reconnect_interval_min - type: string - default: '0' - help: 'Configuration options if sending notifications via Qpid (these are the defaults)' - - - name: qpid_reconnect_interval_max - type: string - default: '0' - help: 'Configuration options if sending notifications via Qpid (these are the defaults)' - - - name: qpid_reconnect_interval - type: string - default: '0' - help: 'Configuration options if sending notifications via Qpid (these are the defaults)' - - - name: qpid_heartbeat - type: string - default: '5' - help: 'Configuration options if sending notifications via Qpid (these are the defaults)' - - - name: qpid_protocol - type: string - default: 'tcp' - help: "Configuration options if sending notifications via Qpid (these are the defaults) Set to 'ssl' to enable SSL" - - - name: qpid_tcp_nodelay - type: string - default: 'True' - help: "Configuration options if sending notifications via Qpid (these are the defaults) Set to 'ssl' to enable SSL" - - - name: filesystem_store_datadir - type: string - default: '/var/lib/glance/images/' - help: 'Directory that the Filesystem backend store writes image data to' - - - name: filesystem_store_metadata_file - type: string - default: 'None' - help: 'A path to a JSON file that contains metadata describing the storage system. When show_multiple_locations is True the information in this file will be returned with any location that is contained in this store.' - - - name: swift_store_auth_version - type: string - default: '2' - help: "Version of the authentication service to use Valid versions are '2' for keystone and '1' for swauth and rackspace" - - - name: swift_store_auth_address - type: string - default: '127.0.0.1:5000/v2.0/' - help: "Address where the Swift authentication service lives Valid schemes are 'http://' and 'https://' If no scheme specified, default to 'https://' For swauth, use something like '127.0.0.1:8080/v1.0/'" - - - name: swift_store_user - type: string - default: 'jdoe:jdoe' - help: "User to authenticate against the Swift authentication service If you use Swift authentication service, set it to 'account':'user' where 'account' is a Swift storage account and 'user' is a user in that account" - - - name: swift_store_key - type: string - default: 'a86850deb2742ec3cb41518e26aa2d89' - help: 'Auth key for the user authenticating against the Swift authentication service' - - - name: swift_store_container - type: string - default: 'glance' - help: 'Container within the account that the account should use for storing images in Swift' - - - name: swift_store_create_container_on_put - type: string - default: 'False' - help: 'Do we create the container if it does not exist?' - - - name: swift_store_large_object_size - type: string - default: '5120' - help: 'What size, in MB, should Glance start chunking image files and do a large object manifest in Swift? By default, this is the maximum object size in Swift, which is 5GB' - - - name: swift_store_large_object_chunk_size - type: string - default: '200' - help: 'When doing a large object manifest, what size, in MB, should Glance write chunks to Swift? This amount of data is written to a temporary disk buffer during the process of chunking the image file, and the default is 200MB' - - - name: swift_enable_snet - type: string - default: 'False' - help: "To use ServiceNET for authentication, prefix hostname of `swift_store_auth_address` with 'snet-'. Ex. https://example.com/v1.0/ -> https://snet-example.com/v1.0/" - - - name: swift_store_multi_tenant - type: string - default: 'False' - help: 'If set to True enables multi-tenant storage mode which causes Glance images to be stored in tenant specific Swift accounts.' - - - name: swift_store_admin_tenants - type: string - default: '' - help: 'A list of swift_proxy_server ACL strings that will be applied as both read and write ACLs to the containers created by Glance in multi-tenant mode. This grants the specified tenants/users read and write access to all newly created image objects. The standard swift_proxy_server ACL string formats are allowed, including: : : *: Multiple ACLs can be combined using a comma separated list, for example: swift_store_admin_tenants = service:glance,*:admin' - - - name: swift_store_region - type: string - default: '' - help: 'The region of the swift_proxy_server endpoint to be used for single tenant. This setting is only necessary if the tenant has multiple swift_proxy_server endpoints.' - - - name: swift_store_ssl_compression - type: string - default: 'True' - help: "If set to False, disables SSL layer compression of https swift_proxy_server requests. Setting to 'False' may improve performance for images which are already in a compressed format, eg qcow2. If set to True, enables SSL layer compression (provided it is supported by the target swift_proxy_server proxy)." - - - name: s3_store_host - type: string - default: '127.0.0.1:8080/v1.0/' - help: "Address where the S3 authentication service lives Valid schemes are 'http://' and 'https://' If no scheme specified, default to 'http://'" - - - name: s3_store_access_key - type: string - default: '<20-char AWS access key>' - help: 'User to authenticate against the S3 authentication service' - - - name: s3_store_secret_key - type: string - default: '<40-char AWS secret key>' - help: 'Auth key for the user authenticating against the S3 authentication service' - - - name: s3_store_bucket - type: string - default: 'glance' - help: "Container within the account that the account should use for storing images in S3. Note that S3 has a flat namespace, so you need a unique bucket name for your glance images. An easy way to do this is append your AWS access key to 'glance'. S3 buckets in AWS *must* be lowercased, so remember to lowercase your AWS access key if you use it in your bucket name below!" - - - name: s3_store_create_bucket_on_put - type: string - default: 'False' - help: 'Do we create the bucket if it does not exist?' - - - name: s3_store_object_buffer_dir - type: string - default: '/path/to/dir' - help: "When sending images to S3, the data will first be written to a temporary buffer on disk. By default the platform's temporary directory will be used. If required, an alternative directory can be specified here." - - - name: s3_store_bucket_url_format - type: string - default: 'subdomain' - help: "When forming a bucket url, boto will either set the bucket name as the subdomain or as the first token of the path. Amazon's S3 service will accept it as the subdomain, but Swift's S3 middleware requires it be in the path. Set this to 'path' or 'subdomain' - defaults to 'subdomain'." - - - name: rbd_store_ceph_conf - type: string - default: '/etc/ceph/ceph.conf' - help: 'Ceph configuration file path If using cephx authentication, this file should include a reference to the right keyring in a client. section' - - - name: rbd_store_user - type: string - default: 'glance' - help: 'RADOS user to authenticate as (only applicable if using cephx)' - - - name: rbd_store_pool - type: string - default: 'images' - help: 'RADOS pool in which images are stored' - - - name: rbd_store_chunk_size - type: string - default: '8' - help: 'Images will be chunked into objects of this size (in megabytes). For best performance, this should be a power of two' - - - name: sheepdog_store_address - type: string - default: 'localhost' - - - name: sheepdog_store_port - type: string - default: '7000' - - - name: sheepdog_store_chunk_size - type: string - default: '64' - help: 'Images will be chunked into objects of this size (in megabytes). For best performance, this should be a power of two' - - - name: cinder_catalog_info - type: string - default: 'volume:cinder:publicURL' - help: 'Info to match when looking for cinder in the service catalog Format is : separated values of the form: :: ' - - - name: cinder_endpoint_template - type: string - default: None - help: 'Override service catalog lookup with template for cinder endpoint e.g. http://localhost:8776/v1/%(project_id)s ' - - - name: os_region_name - type: string - default: None - help: 'Region name of this node ' - - - name: cinder_ca_certificates_file - type: string - default: None - help: 'Location of ca certicates file to use for cinder client requests ' - - - name: cinder_http_retries - type: integer - default: 3 - help: 'Number of cinderclient retries on failed http calls ' - - - name: cinder_api_insecure - type: boolean - default: False - help: 'Allow to perform insecure SSL requests to cinder ' - - - name: delayed_delete - type: string - default: 'False' - help: 'Turn on/off delayed delete' - - - name: scrub_time - type: string - default: '43200' - help: 'Delayed delete time in seconds' - - - name: scrubber_datadir - type: string - default: '/var/lib/glance/scrubber' - help: 'Directory that the scrubber will use to remind itself of what to delete Make sure this is also set in glance-scrubber.conf' - - - name: image_cache_dir - type: string - default: '/var/lib/glance/image-cache/' - help: 'Base directory that the Image Cache uses' - - - name: keystone_authtoken.auth_host - type: host - default: '127.0.0.1' - - - name: keystone_authtoken.auth_port - type: string - default: '35357' - - - name: keystone_authtoken.auth_protocol - type: string - default: 'http' - - - name: keystone_authtoken.admin_tenant_name - type: string - default: '%SERVICE_TENANT_NAME%' - - - name: keystone_authtoken.admin_user - type: string - default: '%SERVICE_USER%' - - - name: keystone_authtoken.admin_password - type: string - default: '%SERVICE_PASSWORD%' - - - name: paste_deploy.config_file - type: string - default: 'glance-api-paste.ini' - help: 'Name of the paste configuration file that defines the available pipelines' - - - name: paste_deploy.flavor - type: string - default: '' - help: "Partial name of a pipeline in your paste configuration file with the service name removed. For example, if your paste section name is [pipeline:glance-api-keystone], you would configure the flavor below as 'keystone'." - diff --git a/rubick/schemas/glance_api/glance_api.conf.yml b/rubick/schemas/glance_api/glance_api.conf.yml deleted file mode 100644 index ffbb40b..0000000 --- a/rubick/schemas/glance_api/glance_api.conf.yml +++ /dev/null @@ -1,560 +0,0 @@ -- version: '2013.2.1' - checkpoint: true - added: - - - name: verbose - type: boolean - default: false - help: 'Show more verbose log output (sets INFO log level output)' - - - name: debug - type: boolean - default: false - help: 'Show debugging output in logs (sets DEBUG log level output)' - - - name: default_store - type: string - default: 'file' - help: "Which backend scheme should Glance use by default is not specified in a request to add a new image to Glance? Known schemes are determined by the known_stores option below. Default: 'file'" - - - name: known_stores - type: string_list - default: ['glance.store.filesystem.Store'] - help: 'List of which store classes and store class locations are currently known to glance at startup.' - - - name: image_size_cap - type: integer - default: 1099511627776 - help: 'Maximum image size (in bytes) that may be uploaded through the Glance API server. Defaults to 1 TB. WARNING: this value should only be increased after careful consideration and must be set to a value under 8 EB (9223372036854775808).' - - - name: bind_host - type: host - default: '0.0.0.0' - help: 'Address to bind the API server' - - - name: bind_port - type: port - default: 9292 - help: 'Port the bind the API server to' - - - name: log_file - type: file - default: '/var/log/glance/api.log' - help: 'Log to this file. Make sure you do not set the same log file for both the API and registry servers!' - - - name: backlog - type: integer - default: 4096 - help: 'Backlog requests when creating socket' - - - name: tcp_keepidle - type: integer - default: 600 - help: 'TCP_KEEPIDLE value in seconds when creating socket. Not supported on OS X.' - - - name: sql_connection - type: string - default: 'sqlite:///glance.sqlite' - help: 'SQLAlchemy connection string for the reference implementation registry server. Any valid SQLAlchemy connection string is fine. See: http://www.sqlalchemy.org/docs/05/reference/sqlalchemy/connections.html#sqlalchemy.create_engine' - - - name: sql_idle_timeout - type: integer - default: 3600 - help: "MySQL uses a default `wait_timeout` of 8 hours, after which it will drop idle connections. This can result in 'MySQL Gone Away' exceptions. If you notice this, you can lower this value to ensure that SQLAlchemy reconnects before MySQL can drop the connection." - - - name: workers - type: integer - default: 1 - help: 'Number of Glance API worker processes to start. On machines with more than one CPU increasing this value may improve performance (especially if using SSL with compression turned on). It is typically recommended to set this value to the number of CPUs present on your machine.' - - - name: admin_role - type: string - default: 'admin' - help: 'Role used to identify an authenticated user as administrator' - - - name: allow_anonymous_access - type: boolean - default: false - help: 'Allow unauthenticated users to access the API with read-only privileges. This only applies when using ContextMiddleware.' - - - name: enable_v1_api - type: boolean - default: true - help: 'Allow access to version 1 of glance api' - - - name: enable_v2_api - type: boolean - default: true - help: 'Allow access to version 2 of glance api' - - - name: show_image_direct_url - type: boolean - default: false - help: "Return the URL that references where the data is stored on the backend storage system. For example, if using the file system store a URL of 'file:///path/to/image' will be returned to the user in the 'direct_url' meta-data field. The default value is false." - - - name: send_identity_headers - type: boolean - default: false - help: 'Send headers containing user and tenant information when making requests to the v1 glance registry. This allows the registry to function as if a user is authenticated without the need to authenticate a user itself using the auth_token middleware. The default value is false.' - - - name: container_formats - type: string_list - default: ['ami', 'ari', 'aki', 'bare', 'ovf'] - help: "Supported values for the 'container_format' image attribute" - - - name: disk_formats - type: string_list - default: ['ami', 'ari', 'aki', 'vhd', 'vmdk', 'raw', 'qcow2', 'vdi', 'iso'] - help: "Supported values for the 'disk_format' image attribute" - - - name: lock_path - type: directory - default: ~ - help: 'Directory to use for lock files. Default to a temp directory (string value). This setting needs to be the same for both glance-scrubber and glance-api.' - comment: 'New param' - - - name: property_protection_file - type: file - default: ~ - help: "Property Protections config file This file contains the rules for property protections and the roles associated with it. If this config value is not specified, by default, property protections won't be enforced. If a value is specified and the file is not found, then an HTTPInternalServerError will be thrown." - - - name: user_storage_quota - type: integer - default: 0 - help: 'Set a system wide quota for every user. This value is the total number of bytes that a user can use across all storage systems. A value of 0 means unlimited.' - - - name: use_syslog - type: boolean - default: false - help: 'Send logs to syslog (/dev/log) instead of to file specified by `log_file`' - - - name: syslog_log_facility - type: string - default: 'LOG_LOCAL0' - help: 'Facility to use. If unset defaults to LOG_USER.' - - - name: cert_file - type: file - default: '/path/to/certfile' - help: 'Certificate file to use when starting API server securely' - - - name: key_file - type: file - default: '/path/to/keyfile' - help: 'Private key file to use when starting API server securely' - - - name: ca_file - type: file - default: '/path/to/cafile' - help: 'CA certificate file to use to verify connecting clients' - - - name: metadata_encryption_key - type: string - default: '<16, 24 or 32 char registry metadata key>' - help: "AES key for encrypting store 'location' metadata, including -- if used -- Swift or S3 credentials Should be set to a random string of length 16, 24 or 32 bytes" - - - name: registry_host - type: host - default: '0.0.0.0' - help: 'Address to find the registry server' - - - name: registry_port - type: port - default: 9191 - help: 'Port the registry server is listening on' - - - name: registry_client_protocol - type: string - default: 'http' - help: 'What protocol to use when connecting to the registry server? Set to https for secure HTTP communication' - - - name: registry_client_key_file - type: file - default: '/path/to/key/file' - help: 'The path to the key file to use in SSL connections to the registry server, if any. Alternately, you may set the GLANCE_CLIENT_KEY_FILE environ variable to a filepath of the key file' - - - name: registry_client_cert_file - type: file - default: '/path/to/cert/file' - help: 'The path to the cert file to use in SSL connections to the registry server, if any. Alternately, you may set the GLANCE_CLIENT_CERT_FILE environ variable to a filepath of the cert file' - - - name: registry_client_ca_file - type: file - default: '/path/to/ca/file' - help: 'The path to the certifying authority cert file to use in SSL connections to the registry server, if any. Alternately, you may set the GLANCE_CLIENT_CA_FILE environ variable to a filepath of the CA cert file' - - - name: registry_client_insecure - type: boolean - default: false - help: "When using SSL in connections to the registry server, do not require validation via a certifying authority. This is the registry's equivalent of specifying --insecure on the command line using glanceclient for the API Default: False" - - - name: registry_client_timeout - type: integer - default: 600 - help: "The period of time, in seconds, that the API server will wait for a registry request to complete. A value of '0' implies no timeout. Default: 600" - - - name: db_auto_create - type: boolean - default: false - help: 'Whether to automatically create the database tables. Default: False' - - - name: sqlalchemy_debug - type: boolean - default: true - help: 'Enable DEBUG log messages from sqlalchemy which prints every database query and response. Default: False' - - - name: notifier_strategy - type: string - default: 'noop' - help: 'Notifications can be sent when images are create, updated or deleted. There are three methods of sending notifications, logging (via the log_file directive), rabbit (via a rabbitmq queue), qpid (via a Qpid message queue), or noop (no notifications sent, the default)' - - - name: rabbit_host - type: host - default: 'localhost' - help: 'Configuration options if sending notifications via rabbitmq (these are the defaults)' - - - name: rabbit_port - type: port - default: 5672 - help: 'Configuration options if sending notifications via rabbitmq (these are the defaults)' - - - name: rabbit_use_ssl - type: boolean - default: false - help: 'Configuration options if sending notifications via rabbitmq (these are the defaults)' - - - name: rabbit_userid - type: string - default: 'guest' - help: 'Configuration options if sending notifications via rabbitmq (these are the defaults)' - - - name: rabbit_password - type: string - default: 'guest' - help: 'Configuration options if sending notifications via rabbitmq (these are the defaults)' - - - name: rabbit_virtual_host - type: string - default: '/' - help: 'Configuration options if sending notifications via rabbitmq (these are the defaults)' - - - name: rabbit_notification_exchange - type: string - default: 'glance' - help: 'Configuration options if sending notifications via rabbitmq (these are the defaults)' - - - name: rabbit_notification_topic - type: string - default: 'notifications' - help: 'Configuration options if sending notifications via rabbitmq (these are the defaults)' - - - name: rabbit_durable_queues - type: boolean - default: false - help: 'Configuration options if sending notifications via rabbitmq (these are the defaults)' - - - name: qpid_notification_exchange - type: string - default: 'glance' - help: 'Configuration options if sending notifications via Qpid (these are the defaults)' - - - name: qpid_notification_topic - type: string - default: 'notifications' - help: 'Configuration options if sending notifications via Qpid (these are the defaults)' - - - name: qpid_host - type: host - default: 'localhost' - help: 'Configuration options if sending notifications via Qpid (these are the defaults)' - - - name: qpid_port - type: port - default: 5672 - help: 'Configuration options if sending notifications via Qpid (these are the defaults)' - - - name: qpid_username - type: string - default: '' - help: 'Configuration options if sending notifications via Qpid (these are the defaults)' - - - name: qpid_password - type: string - default: '' - help: 'Configuration options if sending notifications via Qpid (these are the defaults)' - - - name: qpid_sasl_mechanisms - type: string - default: '' - help: 'Configuration options if sending notifications via Qpid (these are the defaults)' - - - name: qpid_reconnect_timeout - type: integer - default: 0 - help: 'Configuration options if sending notifications via Qpid (these are the defaults)' - - - name: qpid_reconnect_limit - type: integer - default: 0 - help: 'Configuration options if sending notifications via Qpid (these are the defaults)' - - - name: qpid_reconnect_interval_min - type: integer - default: 0 - help: 'Configuration options if sending notifications via Qpid (these are the defaults)' - - - name: qpid_reconnect_interval_max - type: integer - default: 0 - help: 'Configuration options if sending notifications via Qpid (these are the defaults)' - - - name: qpid_reconnect_interval - type: integer - default: 0 - help: 'Configuration options if sending notifications via Qpid (these are the defaults)' - - - name: qpid_heartbeat - type: integer - default: 5 - help: 'Configuration options if sending notifications via Qpid (these are the defaults)' - - - name: qpid_protocol - type: string - default: 'tcp' - help: "Configuration options if sending notifications via Qpid (these are the defaults) Set to 'ssl' to enable SSL" - - - name: qpid_tcp_nodelay - type: boolean - default: true - help: "Configuration options if sending notifications via Qpid (these are the defaults) Set to 'ssl' to enable SSL" - - - name: filesystem_store_datadir - type: directory - default: '/var/lib/glance/images/' - help: 'Directory that the Filesystem backend store writes image data to' - - - name: filesystem_store_metadata_file - type: file - default: ~ - help: 'A path to a JSON file that contains metadata describing the storage system. When show_multiple_locations is True the information in this file will be returned with any location that is contained in this store.' - comment: 'New param' - - - name: swift_store_auth_version - type: string - default: '2' - help: "Version of the authentication service to use Valid versions are '2' for keystone and '1' for swauth and rackspace" - - - name: swift_store_auth_address - type: string - default: '127.0.0.1:5000/v2.0/' - help: "Address where the Swift authentication service lives Valid schemes are 'http://' and 'https://' If no scheme specified, default to 'https://' For swauth, use something like '127.0.0.1:8080/v1.0/'" - - - name: swift_store_user - type: string - default: 'jdoe:jdoe' - help: "User to authenticate against the Swift authentication service If you use Swift authentication service, set it to 'account':'user' where 'account' is a Swift storage account and 'user' is a user in that account" - - - name: swift_store_key - type: string - default: 'a86850deb2742ec3cb41518e26aa2d89' - help: 'Auth key for the user authenticating against the Swift authentication service' - - - name: swift_store_container - type: string - default: 'glance' - help: 'Container within the account that the account should use for storing images in Swift' - - - name: swift_store_create_container_on_put - type: boolean - default: false - help: 'Do we create the container if it does not exist?' - - - name: swift_store_large_object_size - type: integer - default: 5120 - help: 'What size, in MB, should Glance start chunking image files and do a large object manifest in Swift? By default, this is the maximum object size in Swift, which is 5GB' - - - name: swift_store_large_object_chunk_size - type: integer - default: 200 - help: 'When doing a large object manifest, what size, in MB, should Glance write chunks to Swift? This amount of data is written to a temporary disk buffer during the process of chunking the image file, and the default is 200MB' - - - name: swift_enable_snet - type: boolean - default: false - help: "To use ServiceNET for authentication, prefix hostname of `swift_store_auth_address` with 'snet-'. Ex. https://example.com/v1.0/ -> https://snet-example.com/v1.0/" - - - name: swift_store_multi_tenant - type: boolean - default: false - help: 'If set to True enables multi-tenant storage mode which causes Glance images to be stored in tenant specific Swift accounts.' - - - name: swift_store_admin_tenants - type: string_list - default: [] - help: 'A list of swift_proxy_server ACL strings that will be applied as both read and write ACLs to the containers created by Glance in multi-tenant mode. This grants the specified tenants/users read and write access to all newly created image objects. The standard swift_proxy_server ACL string formats are allowed, including: : : *: Multiple ACLs can be combined using a comma separated list, for example: swift_store_admin_tenants = service:glance,*:admin' - - - name: swift_store_region - type: string - default: '' - help: 'The region of the swift_proxy_server endpoint to be used for single tenant. This setting is only necessary if the tenant has multiple swift_proxy_server endpoints.' - - - name: swift_store_ssl_compression - type: boolean - default: true - help: "If set to False, disables SSL layer compression of https swift_proxy_server requests. Setting to 'False' may improve performance for images which are already in a compressed format, eg qcow2. If set to True, enables SSL layer compression (provided it is supported by the target swift_proxy_server proxy)." - - - name: s3_store_host - type: string - default: '127.0.0.1:8080/v1.0/' - help: "Address where the S3 authentication service lives Valid schemes are 'http://' and 'https://' If no scheme specified, default to 'http://'" - - - name: s3_store_access_key - type: string - default: '<20-char AWS access key>' - help: 'User to authenticate against the S3 authentication service' - - - name: s3_store_secret_key - type: string - default: '<40-char AWS secret key>' - help: 'Auth key for the user authenticating against the S3 authentication service' - - - name: s3_store_bucket - type: string - default: 'glance' - help: "Container within the account that the account should use for storing images in S3. Note that S3 has a flat namespace, so you need a unique bucket name for your glance images. An easy way to do this is append your AWS access key to 'glance'. S3 buckets in AWS *must* be lowercased, so remember to lowercase your AWS access key if you use it in your bucket name below!" - - - name: s3_store_create_bucket_on_put - type: boolean - default: false - help: 'Do we create the bucket if it does not exist?' - - - name: s3_store_object_buffer_dir - type: directory - default: '/path/to/dir' - help: "When sending images to S3, the data will first be written to a temporary buffer on disk. By default the platform's temporary directory will be used. If required, an alternative directory can be specified here." - - - name: s3_store_bucket_url_format - type: string - default: 'subdomain' - help: "When forming a bucket url, boto will either set the bucket name as the subdomain or as the first token of the path. Amazon's S3 service will accept it as the subdomain, but Swift's S3 middleware requires it be in the path. Set this to 'path' or 'subdomain' - defaults to 'subdomain'." - - - name: rbd_store_ceph_conf - type: file - default: '/etc/ceph/ceph.conf' - help: 'Ceph configuration file path If using cephx authentication, this file should include a reference to the right keyring in a client. section' - - - name: rbd_store_user - type: string - default: 'glance' - help: 'RADOS user to authenticate as (only applicable if using cephx)' - - - name: rbd_store_pool - type: string - default: 'images' - help: 'RADOS pool in which images are stored' - - - name: rbd_store_chunk_size - type: integer - default: 8 - help: 'Images will be chunked into objects of this size (in megabytes). For best performance, this should be a power of two' - - - name: sheepdog_store_address - type: host - default: 'localhost' - - - name: sheepdog_store_port - type: port - default: 7000 - - - name: sheepdog_store_chunk_size - type: integer - default: 64 - help: 'Images will be chunked into objects of this size (in megabytes). For best performance, this should be a power of two' - - - name: cinder_catalog_info - type: string - default: 'volume:cinder:publicURL' - help: 'Info to match when looking for cinder in the service catalog Format is : separated values of the form: :: ' - - - name: cinder_endpoint_template - type: string - default: ~ - help: 'Override service catalog lookup with template for cinder endpoint e.g. http://localhost:8776/v1/%(project_id)s ' - - - name: os_region_name - type: string - default: ~ - help: 'Region name of this node ' - - - name: cinder_ca_certificates_file - type: string - default: ~ - help: 'Location of ca certicates file to use for cinder client requests ' - - - name: cinder_http_retries - type: integer - default: 3 - help: 'Number of cinderclient retries on failed http calls ' - - - name: cinder_api_insecure - type: boolean - default: false - help: 'Allow to perform insecure SSL requests to cinder ' - - - name: delayed_delete - type: boolean - default: false - help: 'Turn on/off delayed delete' - - - name: scrub_time - type: integer - default: 43200 - help: 'Delayed delete time in seconds' - - - name: scrubber_datadir - type: directory - default: '/var/lib/glance/scrubber' - help: 'Directory that the scrubber will use to remind itself of what to delete Make sure this is also set in glance-scrubber.conf' - - - name: image_cache_dir - type: directory - default: '/var/lib/glance/image-cache/' - help: 'Base directory that the Image Cache uses' - - - name: keystone_authtoken.auth_host - type: host - default: '127.0.0.1' - comment: 'New param' - - - name: keystone_authtoken.auth_port - type: port - default: 35357 - - - name: keystone_authtoken.auth_protocol - type: string - default: 'http' - - - name: keystone_authtoken.admin_tenant_name - type: string - default: '%SERVICE_TENANT_NAME%' - - - name: keystone_authtoken.admin_user - type: string - default: '%SERVICE_USER%' - - - name: keystone_authtoken.admin_password - type: string - default: '%SERVICE_PASSWORD%' - - - name: paste_deploy.config_file - type: file - default: 'glance-api-paste.ini' - help: 'Name of the paste configuration file that defines the available pipelines' - - - name: paste_deploy.flavor - type: string - default: '' - help: "Partial name of a pipeline in your paste configuration file with the service name removed. For example, if your paste section name is [pipeline:glance-api-keystone], you would configure the flavor below as 'keystone'." - -# ==================================================== diff --git a/rubick/schemas/glance_registry/2013.2.1.yml b/rubick/schemas/glance_registry/2013.2.1.yml deleted file mode 100644 index faeb06b..0000000 --- a/rubick/schemas/glance_registry/2013.2.1.yml +++ /dev/null @@ -1,133 +0,0 @@ -project: glance_registry -version: '2013.2.1' -parameters: - - - name: verbose - type: string - default: 'False' - help: 'Show more verbose log output (sets INFO log level output)' - - - name: debug - type: string - default: 'False' - help: 'Show debugging output in logs (sets DEBUG log level output)' - - - name: bind_host - type: host - default: '0.0.0.0' - help: 'Address to bind the registry server' - - - name: bind_port - type: string - default: '9191' - help: 'Port the bind the registry server to' - - - name: log_file - type: string - default: '/var/log/glance/registry.log' - help: 'Log to this file. Make sure you do not set the same log file for both the API and registry servers!' - - - name: backlog - type: string - default: '4096' - help: 'Backlog requests when creating socket' - - - name: tcp_keepidle - type: string - default: '600' - help: 'TCP_KEEPIDLE value in seconds when creating socket. Not supported on OS X.' - - - name: sql_connection - type: string - default: 'sqlite:///glance.sqlite' - help: 'SQLAlchemy connection string for the reference implementation registry server. Any valid SQLAlchemy connection string is fine. See: http://www.sqlalchemy.org/docs/05/reference/sqlalchemy/connections.html#sqlalchemy.create_engine' - - - name: sql_idle_timeout - type: string - default: '3600' - help: "MySQL uses a default `wait_timeout` of 8 hours, after which it will drop idle connections. This can result in 'MySQL Gone Away' exceptions. If you notice this, you can lower this value to ensure that SQLAlchemy reconnects before MySQL can drop the connection." - - - name: api_limit_max - type: string - default: '1000' - help: 'Limit the api to return `param_limit_max` items in a call to a container. If a larger `limit` query param is provided, it will be reduced to this value.' - - - name: limit_param_default - type: string - default: '25' - help: 'If a `limit` query param is not provided in an api request, it will default to `limit_param_default`' - - - name: admin_role - type: string - default: 'admin' - help: 'Role used to identify an authenticated user as administrator' - - - name: db_auto_create - type: string - default: 'False' - help: 'Whether to automatically create the database tables. Default: False' - - - name: sqlalchemy_debug - type: string - default: 'True' - help: 'Enable DEBUG log messages from sqlalchemy which prints every database query and response. Default: False' - - - name: use_syslog - type: string - default: 'False' - help: 'Send logs to syslog (/dev/log) instead of to file specified by `log_file`' - - - name: syslog_log_facility - type: string - default: 'LOG_LOCAL1' - help: 'Facility to use. If unset defaults to LOG_USER.' - - - name: cert_file - type: string - default: '/path/to/certfile' - help: 'Certificate file to use when starting registry server securely' - - - name: key_file - type: string - default: '/path/to/keyfile' - help: 'Private key file to use when starting registry server securely' - - - name: ca_file - type: string - default: '/path/to/cafile' - help: 'CA certificate file to use to verify connecting clients' - - - name: keystone_authtoken.auth_host - type: host - default: '127.0.0.1' - - - name: keystone_authtoken.auth_port - type: string - default: '35357' - - - name: keystone_authtoken.auth_protocol - type: string - default: 'http' - - - name: keystone_authtoken.admin_tenant_name - type: string - default: '%SERVICE_TENANT_NAME%' - - - name: keystone_authtoken.admin_user - type: string - default: '%SERVICE_USER%' - - - name: keystone_authtoken.admin_password - type: string - default: '%SERVICE_PASSWORD%' - - - name: paste_deploy.config_file - type: string - default: 'glance-registry-paste.ini' - help: 'Name of the paste configuration file that defines the available pipelines' - - - name: paste_deploy.flavor - type: string - default: '' - help: "Partial name of a pipeline in your paste configuration file with the service name removed. For example, if your paste section name is [pipeline:glance-registry-keystone], you would configure the flavor below as 'keystone'." - diff --git a/rubick/schemas/glance_registry/glance_registry.conf.yml b/rubick/schemas/glance_registry/glance_registry.conf.yml deleted file mode 100644 index fdbac38..0000000 --- a/rubick/schemas/glance_registry/glance_registry.conf.yml +++ /dev/null @@ -1,161 +0,0 @@ -- version: '2013.2.1' - checkpoint: true - added: - - - name: verbose - type: string - default: 'False' - help: 'Show more verbose log output (sets INFO log level output)' - comment: 'New param' - - - name: debug - type: string - default: 'False' - help: 'Show debugging output in logs (sets DEBUG log level output)' - comment: 'New param' - - - name: bind_host - type: host - default: '0.0.0.0' - help: 'Address to bind the registry server' - comment: 'New param' - - - name: bind_port - type: string - default: '9191' - help: 'Port the bind the registry server to' - comment: 'New param' - - - name: log_file - type: string - default: '/var/log/glance/registry.log' - help: 'Log to this file. Make sure you do not set the same log file for both the API and registry servers!' - comment: 'New param' - - - name: backlog - type: string - default: '4096' - help: 'Backlog requests when creating socket' - comment: 'New param' - - - name: tcp_keepidle - type: string - default: '600' - help: 'TCP_KEEPIDLE value in seconds when creating socket. Not supported on OS X.' - comment: 'New param' - - - name: sql_connection - type: string - default: 'sqlite:///glance.sqlite' - help: 'SQLAlchemy connection string for the reference implementation registry server. Any valid SQLAlchemy connection string is fine. See: http://www.sqlalchemy.org/docs/05/reference/sqlalchemy/connections.html#sqlalchemy.create_engine' - comment: 'New param' - - - name: sql_idle_timeout - type: string - default: '3600' - help: "MySQL uses a default `wait_timeout` of 8 hours, after which it will drop idle connections. This can result in 'MySQL Gone Away' exceptions. If you notice this, you can lower this value to ensure that SQLAlchemy reconnects before MySQL can drop the connection." - comment: 'New param' - - - name: api_limit_max - type: string - default: '1000' - help: 'Limit the api to return `param_limit_max` items in a call to a container. If a larger `limit` query param is provided, it will be reduced to this value.' - comment: 'New param' - - - name: limit_param_default - type: string - default: '25' - help: 'If a `limit` query param is not provided in an api request, it will default to `limit_param_default`' - comment: 'New param' - - - name: admin_role - type: string - default: 'admin' - help: 'Role used to identify an authenticated user as administrator' - comment: 'New param' - - - name: db_auto_create - type: string - default: 'False' - help: 'Whether to automatically create the database tables. Default: False' - comment: 'New param' - - - name: sqlalchemy_debug - type: string - default: 'True' - help: 'Enable DEBUG log messages from sqlalchemy which prints every database query and response. Default: False' - comment: 'New param' - - - name: use_syslog - type: string - default: 'False' - help: 'Send logs to syslog (/dev/log) instead of to file specified by `log_file`' - comment: 'New param' - - - name: syslog_log_facility - type: string - default: 'LOG_LOCAL1' - help: 'Facility to use. If unset defaults to LOG_USER.' - comment: 'New param' - - - name: cert_file - type: string - default: '/path/to/certfile' - help: 'Certificate file to use when starting registry server securely' - comment: 'New param' - - - name: key_file - type: string - default: '/path/to/keyfile' - help: 'Private key file to use when starting registry server securely' - comment: 'New param' - - - name: ca_file - type: string - default: '/path/to/cafile' - help: 'CA certificate file to use to verify connecting clients' - comment: 'New param' - - - name: keystone_authtoken.auth_host - type: host - default: '127.0.0.1' - comment: 'New param' - - - name: keystone_authtoken.auth_port - type: string - default: '35357' - comment: 'New param' - - - name: keystone_authtoken.auth_protocol - type: string - default: 'http' - comment: 'New param' - - - name: keystone_authtoken.admin_tenant_name - type: string - default: '%SERVICE_TENANT_NAME%' - comment: 'New param' - - - name: keystone_authtoken.admin_user - type: string - default: '%SERVICE_USER%' - comment: 'New param' - - - name: keystone_authtoken.admin_password - type: string - default: '%SERVICE_PASSWORD%' - comment: 'New param' - - - name: paste_deploy.config_file - type: string - default: 'glance-registry-paste.ini' - help: 'Name of the paste configuration file that defines the available pipelines' - comment: 'New param' - - - name: paste_deploy.flavor - type: string - default: '' - help: "Partial name of a pipeline in your paste configuration file with the service name removed. For example, if your paste section name is [pipeline:glance-registry-keystone], you would configure the flavor below as 'keystone'." - comment: 'New param' - -# ==================================================== diff --git a/rubick/schemas/keystone/2013.1.3.yml b/rubick/schemas/keystone/2013.1.3.yml deleted file mode 100644 index 9e2bb75..0000000 --- a/rubick/schemas/keystone/2013.1.3.yml +++ /dev/null @@ -1,642 +0,0 @@ -project: keystone -version: '2013.1.3' -parameters: - - - name: admin_token - type: string - default: 'ADMIN' - help: "A 'shared secret' between keystone and other openstack services" - - - name: bind_host - type: host - default: '0.0.0.0' - help: 'The IP address of the network interface to listen on' - - - name: public_port - type: port - default: 5000 - help: 'The port number which the public service listens on' - - - name: admin_port - type: port - default: 35357 - help: 'The port number which the public admin listens on' - - - name: public_endpoint - type: string - default: 'http://localhost:%(public_port)s/' - help: 'The base endpoint URLs for keystone that are advertised to clients (NOTE: this does NOT affect how keystone listens for connections)' - - - name: admin_endpoint - type: string - default: 'http://localhost:%(admin_port)s/' - - - name: compute_port - type: port - default: 8774 - help: 'The port number which the OpenStack Compute service listens on' - - - name: policy_file - type: string - default: 'policy.json' - help: 'Path to your policy definition containing identity actions' - - - name: policy_default_rule - type: string - default: 'admin_required' - help: 'Rule to check if no matching policy definition is found FIXME(dolph): This should really be defined as [policy] default_rule' - - - name: member_role_id - type: string - default: '9fe2ff9ee4384b1894a90878d3e92bab' - help: 'Role for migrating membership relationships During a SQL upgrade, the following values will be used to create a new role that will replace records in the user_tenant_membership table with explicit role grants. After migration, the member_role_id will be used in the API add_user_to_project, and member_role_name will be ignored.' - - - name: member_role_name - type: string - default: '_member_' - - - name: max_request_body_size - type: integer - default: 114688 - help: 'enforced by optional sizelimit middleware (keystone.middleware:RequestBodySizeLimiter)' - - - name: max_param_size - type: integer - default: 64 - help: 'limit the sizes of user & tenant ID/names' - - - name: max_token_size - type: integer - default: 8192 - help: 'similar to max_param_size, but provides an exception for token values' - - - name: debug - type: boolean - default: false - help: '=== Logging Options === Print debugging output (includes plaintext request logging, potentially including passwords)' - - - name: verbose - type: boolean - default: false - help: 'Print more verbose output' - - - name: log_file - type: string - default: 'keystone.log' - help: 'Name of log file to output to. If not set, logging will go to stdout.' - - - name: log_dir - type: string - default: '/var/log/keystone' - help: 'The directory to keep log files in (will be prepended to --logfile)' - - - name: use_syslog - type: boolean - default: false - help: 'Use syslog for logging.' - - - name: syslog_log_facility - type: string - default: 'LOG_USER' - help: 'syslog facility to receive log lines' - - - name: log_config - type: string - default: 'logging.conf' - help: 'If this option is specified, the logging configuration file specified is used and overrides any other logging options specified. Please see the Python logging module documentation for details on logging configuration files.' - - - name: log_format - type: string - default: '%(asctime)s %(levelname)8s [%(name)s] %(message)s' - help: 'A logging.Formatter log message format string which may use any of the available logging.LogRecord attributes.' - - - name: log_date_format - type: string - default: '%Y-%m-%d %H:%M:%S' - help: 'Format string for %(asctime)s in log records.' - - - name: onready - type: string - default: 'keystone.common.systemd' - help: 'onready allows you to send a notification when the process is ready to serve For example, to have it notify using systemd, one could set shell command: onready = systemd-notify --ready or a module with notify() method:' - - - name: default_notification_level - type: string - default: 'INFO' - help: 'Default notification level for outgoing notifications' - - - name: default_publisher_id - type: string - default: '' - help: 'Default publisher_id for outgoing notifications; included in the payload.' - - - name: rpc_backend - type: string - default: 'keystone.openstack.common.rpc.impl_kombu' - help: 'The messaging module to use, defaults to kombu.' - - - name: rpc_thread_pool_size - type: integer - default: 64 - help: 'Size of RPC thread pool' - - - name: rpc_conn_pool_size - type: integer - default: 30 - help: 'Size of RPC connection pool' - - - name: rpc_response_timeout - type: integer - default: 60 - help: 'Seconds to wait for a response from call or multicall' - - - name: rpc_cast_timeout - type: integer - default: 30 - help: 'Seconds to wait before a cast expires (TTL). Only supported by impl_zmq.' - - - name: fake_rabbit - type: boolean - default: false - help: 'If True, use a fake RabbitMQ provider' - - - name: control_exchange - type: string - default: 'openstack' - help: 'AMQP exchange to connect to if using RabbitMQ or Qpid' - - - name: sql.connection - type: string - default: 'sqlite:///keystone.db' - help: 'The SQLAlchemy connection string used to connect to the database' - - - name: sql.idle_timeout - type: integer - default: 200 - help: 'the timeout before idle sql connections are reaped' - - - name: oauth1.driver - type: string - default: 'keystone.contrib.oauth1.backends.sql.OAuth1' - - - name: identity.default_domain_id - type: string - default: 'default' - help: 'This references the domain to use for all Identity API v2 requests (which are not aware of domains). A domain with this ID will be created for you by keystone-manage db_sync in migration 008. The domain referenced by this ID cannot be deleted on the v3 API, to prevent accidentally breaking the v2 API. There is nothing special about this domain, other than the fact that it must exist to order to maintain support for your v2 clients.' - - - name: identity.domain_specific_drivers_enabled - type: boolean - default: false - help: 'A subset (or all) of domains can have their own identity driver, each with their own partial configuration file in a domain configuration directory. Only' - - - name: identity.domain_config_dir - type: string - default: '/etc/keystone/domains' - - - name: identity.max_password_length - type: integer - default: 4096 - help: 'Maximum supported length for user passwords; decrease to improve performance.' - - - name: cache.enabled - type: boolean - default: false - help: 'Global cache functionality toggle.' - - - name: catalog.template_file - type: string - default: 'default_catalog.templates' - - - name: endpoint_filter.return_all_endpoints_if_no_filter - type: boolean - default: true - - - name: token.provider - type: string - default: '' - help: 'Controls the token construction, validation, and revocation operations. Core providers are keystone.token.providers.[pki|uuid].Provider' - - - name: token.expiration - type: integer - default: 86400 - help: 'Amount of time a token should remain valid (in seconds)' - - - name: token.bind - type: string - default: '' - help: 'External auth mechanisms that should add bind information to token. eg kerberos, x509' - - - name: token.enforce_token_bind - type: string - default: 'permissive' - help: 'Enforcement policy on tokens presented to keystone with bind information. One of disabled, permissive, strict, required or a specifically required bind mode e.g. kerberos or x509 to require binding to that authentication.' - - - name: assignment.caching - type: boolean - default: true - help: 'Assignment specific caching toggle. This has no effect unless the global caching option is set to True' - - - name: assignment.cache_time - type: integer - default: 0 - help: 'Assignment specific cache time-to-live (TTL) in seconds.' - - - name: token.revocation_cache_time - type: integer - default: 3600 - help: 'Revocation-List specific cache time-to-live (TTL) in seconds.' - - - name: cache.config_prefix - type: string - default: 'cache.keystone' - help: 'Prefix for building the configuration dictionary for the cache region. This should not need to be changed unless there is another dogpile.cache region with the same configuration name' - - - name: cache.backend - type: string - default: 'keystone.common.cache.noop' - help: 'Dogpile.cache backend module. It is recommended that Memcache (dogpile.cache.memcache) or Redis (dogpile.cache.redis) be used in production deployments. Small workloads (single process) like devstack can use the dogpile.cache.memory backend.' - - - name: cache.backend_argument - type: string - default: '' - help: 'Arguments supplied to the backend module. Specify this option once per argument to be passed to the dogpile.cache backend. Example format: :' - - - name: cache.proxies - type: string - default: '' - help: 'Proxy Classes to import that will affect the way the dogpile.cache backend functions. See the dogpile.cache documentation on changing-backend-behavior. Comma delimited list e.g. my.dogpile.proxy.Class, my.dogpile.proxyClass2' - - - name: cache.use_key_mangler - type: boolean - default: true - help: 'Use a key-mangling function (sha1) to ensure fixed length cache-keys. This is toggle-able for debugging purposes, it is highly recommended to always leave this set to True.' - - - name: cache.debug_cache_backend - type: boolean - default: false - help: 'Extra debugging from the cache backend (cache keys, get/set/delete/etc calls) This is only really useful if you need to see the specific cache-backend get/set/delete calls with the keys/values. Typically this should be left set to False.' - - - name: oauth1.request_token_duration - type: integer - default: 28800 - help: 'The Identity service may include expire attributes. If no such attribute is included, then the token lasts indefinitely. Specify how quickly the request token will expire (in seconds)' - - - name: oauth1.access_token_duration - type: integer - default: 86400 - help: 'Specify how quickly the access token will expire (in seconds)' - - - name: ssl.enable - type: boolean - default: true - - - name: signing.certfile - type: string - default: '/etc/keystone/pki/certs/signing_cert.pem' - - - name: signing.keyfile - type: string - default: '/etc/keystone/pki/private/signing_key.pem' - - - name: signing.ca_certs - type: string - default: '/etc/keystone/pki/certs/cacert.pem' - - - name: signing.ca_key - type: string - default: '/etc/keystone/pki/private/cakey.pem' - - - name: signing.key_size - type: integer - default: 2048 - - - name: signing.valid_days - type: integer - default: 3650 - - - name: ssl.cert_required - type: boolean - default: false - - - name: signing.cert_subject - type: string - default: '/CUS/STUnset/LUnset/OUnset/CNwww.example.com' - - - name: signing.token_format - type: string - default: '' - help: 'Deprecated in favor of provider in the [token] section Allowed values are PKI or UUID' - - - name: ldap.url - type: string - default: 'ldap://localhost' - - - name: ldap.user - type: string - default: 'dcManager,dcexample,dccom' - - - name: auth.password - type: string - default: 'keystone.auth.plugins.password.Password' - - - name: ldap.suffix - type: string - default: 'cnexample,cncom' - - - name: ldap.use_dumb_member - type: boolean - default: false - - - name: ldap.allow_subtree_delete - type: boolean - default: false - - - name: ldap.dumb_member - type: string - default: 'cndumb,dcexample,dccom' - - - name: ldap.page_size - type: integer - default: 0 - help: "Maximum results per page; a value of zero ('0') disables paging (default)" - - - name: ldap.alias_dereferencing - type: string - default: 'default' - help: "The LDAP dereferencing option for queries. This can be either 'never', 'searching', 'always', 'finding' or 'default'. The 'default' option falls back to using default dereferencing configured by your ldap.conf." - - - name: ldap.query_scope - type: string - default: 'one' - help: "The LDAP scope for queries, this can be either 'one' (onelevel/singleLevel) or 'sub' (subtree/wholeSubtree)" - - - name: ldap.user_tree_dn - type: string - default: 'ouUsers,dcexample,dccom' - - - name: ldap.user_filter - type: string - default: '' - - - name: ldap.user_objectclass - type: string - default: 'inetOrgPerson' - - - name: ldap.user_domain_id_attribute - type: string - default: 'businessCategory' - - - name: ldap.user_id_attribute - type: string - default: 'cn' - - - name: ldap.user_name_attribute - type: string - default: 'sn' - - - name: ldap.user_mail_attribute - type: string - default: 'email' - - - name: ldap.user_pass_attribute - type: string - default: 'userPassword' - - - name: ldap.user_enabled_attribute - type: string - default: 'enabled' - - - name: ldap.user_enabled_mask - type: integer - default: 0 - - - name: ldap.user_enabled_default - type: boolean - default: true - - - name: ldap.user_attribute_ignore - type: string - default: 'tenant_id,tenants' - - - name: ldap.user_allow_create - type: boolean - default: true - - - name: ldap.user_allow_update - type: boolean - default: true - - - name: ldap.user_allow_delete - type: boolean - default: true - - - name: ldap.user_enabled_emulation - type: boolean - default: false - - - name: ldap.user_enabled_emulation_dn - type: string - default: '' - - - name: ldap.tenant_tree_dn - type: string - default: 'ouProjects,dcexample,dccom' - - - name: ldap.tenant_filter - type: string - default: '' - - - name: ldap.tenant_objectclass - type: string - default: 'groupOfNames' - - - name: ldap.tenant_domain_id_attribute - type: string - default: 'businessCategory' - - - name: ldap.tenant_id_attribute - type: string - default: 'cn' - - - name: ldap.tenant_member_attribute - type: string - default: 'member' - - - name: ldap.tenant_name_attribute - type: string - default: 'ou' - - - name: ldap.tenant_desc_attribute - type: string - default: 'desc' - - - name: ldap.tenant_enabled_attribute - type: string - default: 'enabled' - - - name: ldap.tenant_attribute_ignore - type: string - default: '' - - - name: ldap.tenant_allow_create - type: boolean - default: true - - - name: ldap.tenant_allow_update - type: boolean - default: true - - - name: ldap.tenant_allow_delete - type: boolean - default: true - - - name: ldap.tenant_enabled_emulation - type: boolean - default: false - - - name: ldap.tenant_enabled_emulation_dn - type: string - default: '' - - - name: ldap.role_tree_dn - type: string - default: 'ouRoles,dcexample,dccom' - - - name: ldap.role_filter - type: string - default: '' - - - name: ldap.role_objectclass - type: string - default: 'organizationalRole' - - - name: ldap.role_id_attribute - type: string - default: 'cn' - - - name: ldap.role_name_attribute - type: string - default: 'ou' - - - name: ldap.role_member_attribute - type: string - default: 'roleOccupant' - - - name: ldap.role_attribute_ignore - type: string - default: '' - - - name: ldap.role_allow_create - type: boolean - default: true - - - name: ldap.role_allow_update - type: boolean - default: true - - - name: ldap.role_allow_delete - type: boolean - default: true - - - name: ldap.group_tree_dn - type: string - default: '' - - - name: ldap.group_filter - type: string - default: '' - - - name: ldap.group_objectclass - type: string - default: 'groupOfNames' - - - name: ldap.group_id_attribute - type: string - default: 'cn' - - - name: ldap.group_name_attribute - type: string - default: 'ou' - - - name: ldap.group_member_attribute - type: string - default: 'member' - - - name: ldap.group_desc_attribute - type: string - default: 'desc' - - - name: ldap.group_attribute_ignore - type: string - default: '' - - - name: ldap.group_allow_create - type: boolean - default: true - - - name: ldap.group_allow_update - type: boolean - default: true - - - name: ldap.group_allow_delete - type: boolean - default: true - - - name: ldap.use_tls - type: boolean - default: false - help: 'ldap TLS options if both tls_cacertfile and tls_cacertdir are set then tls_cacertfile will be used and tls_cacertdir is ignored valid options for tls_req_cert are demand, never, and allow' - - - name: ldap.tls_cacertfile - type: string - default: '' - - - name: ldap.tls_cacertdir - type: string - default: '' - - - name: ldap.tls_req_cert - type: string - default: 'demand' - - - name: ldap.user_additional_attribute_mapping - type: string - default: '' - - - name: ldap.domain_additional_attribute_mapping - type: string - default: '' - - - name: ldap.group_additional_attribute_mapping - type: string - default: '' - - - name: ldap.role_additional_attribute_mapping - type: string - default: '' - - - name: ldap.project_additional_attribute_mapping - type: string - default: '' - - - name: auth.methods - type: string - default: 'external,password,token,oauth1' - - - name: auth.external - type: string - default: 'keystone.auth.plugins.external.ExternalDefault' - - - name: auth.token - type: string - default: 'keystone.auth.plugins.token.Token' - - - name: auth.oauth1 - type: string - default: 'keystone.auth.plugins.oauth1.OAuth' - - - name: paste_deploy.config_file - type: string - default: 'keystone-paste.ini' - help: 'Name of the paste configuration file that defines the available pipelines' - diff --git a/rubick/schemas/keystone/2013.1.4.yml b/rubick/schemas/keystone/2013.1.4.yml deleted file mode 100644 index 64ad67a..0000000 --- a/rubick/schemas/keystone/2013.1.4.yml +++ /dev/null @@ -1,642 +0,0 @@ -project: keystone -version: '2013.1.4' -parameters: - - - name: admin_token - type: string - default: 'ADMIN' - help: "A 'shared secret' between keystone and other openstack services" - - - name: bind_host - type: host - default: '0.0.0.0' - help: 'The IP address of the network interface to listen on' - - - name: public_port - type: port - default: 5000 - help: 'The port number which the public service listens on' - - - name: admin_port - type: port - default: 35357 - help: 'The port number which the public admin listens on' - - - name: public_endpoint - type: string - default: 'http://localhost:%(public_port)s/' - help: 'The base endpoint URLs for keystone that are advertised to clients (NOTE: this does NOT affect how keystone listens for connections)' - - - name: admin_endpoint - type: string - default: 'http://localhost:%(admin_port)s/' - - - name: compute_port - type: port - default: 8774 - help: 'The port number which the OpenStack Compute service listens on' - - - name: policy_file - type: string - default: 'policy.json' - help: 'Path to your policy definition containing identity actions' - - - name: policy_default_rule - type: string - default: 'admin_required' - help: 'Rule to check if no matching policy definition is found FIXME(dolph): This should really be defined as [policy] default_rule' - - - name: member_role_id - type: string - default: '9fe2ff9ee4384b1894a90878d3e92bab' - help: 'Role for migrating membership relationships During a SQL upgrade, the following values will be used to create a new role that will replace records in the user_tenant_membership table with explicit role grants. After migration, the member_role_id will be used in the API add_user_to_project, and member_role_name will be ignored.' - - - name: member_role_name - type: string - default: '_member_' - - - name: max_request_body_size - type: integer - default: 114688 - help: 'enforced by optional sizelimit middleware (keystone.middleware:RequestBodySizeLimiter)' - - - name: max_param_size - type: integer - default: 64 - help: 'limit the sizes of user & tenant ID/names' - - - name: max_token_size - type: integer - default: 8192 - help: 'similar to max_param_size, but provides an exception for token values' - - - name: debug - type: boolean - default: False - help: '=== Logging Options === Print debugging output (includes plaintext request logging, potentially including passwords)' - - - name: verbose - type: boolean - default: False - help: 'Print more verbose output' - - - name: log_file - type: string - default: 'keystone.log' - help: 'Name of log file to output to. If not set, logging will go to stdout.' - - - name: log_dir - type: string - default: '/var/log/keystone' - help: 'The directory to keep log files in (will be prepended to --logfile)' - - - name: use_syslog - type: boolean - default: False - help: 'Use syslog for logging.' - - - name: syslog_log_facility - type: string - default: 'LOG_USER' - help: 'syslog facility to receive log lines' - - - name: log_config - type: string - default: 'logging.conf' - help: 'If this option is specified, the logging configuration file specified is used and overrides any other logging options specified. Please see the Python logging module documentation for details on logging configuration files.' - - - name: log_format - type: string - default: '%(asctime)s %(levelname)8s [%(name)s] %(message)s' - help: 'A logging.Formatter log message format string which may use any of the available logging.LogRecord attributes.' - - - name: log_date_format - type: string - default: '%Y-%m-%d %H:%M:%S' - help: 'Format string for %(asctime)s in log records.' - - - name: onready - type: string - default: 'keystone.common.systemd' - help: 'onready allows you to send a notification when the process is ready to serve For example, to have it notify using systemd, one could set shell command: onready = systemd-notify --ready or a module with notify() method:' - - - name: default_notification_level - type: string - default: 'INFO' - help: 'Default notification level for outgoing notifications' - - - name: default_publisher_id - type: string - default: '' - help: 'Default publisher_id for outgoing notifications; included in the payload.' - - - name: rpc_backend - type: string - default: 'keystone.openstack.common.rpc.impl_kombu' - help: 'The messaging module to use, defaults to kombu.' - - - name: rpc_thread_pool_size - type: integer - default: 64 - help: 'Size of RPC thread pool' - - - name: rpc_conn_pool_size - type: integer - default: 30 - help: 'Size of RPC connection pool' - - - name: rpc_response_timeout - type: integer - default: 60 - help: 'Seconds to wait for a response from call or multicall' - - - name: rpc_cast_timeout - type: integer - default: 30 - help: 'Seconds to wait before a cast expires (TTL). Only supported by impl_zmq.' - - - name: fake_rabbit - type: boolean - default: False - help: 'If True, use a fake RabbitMQ provider' - - - name: control_exchange - type: string - default: 'openstack' - help: 'AMQP exchange to connect to if using RabbitMQ or Qpid' - - - name: sql.connection - type: string - default: 'sqlite:///keystone.db' - help: 'The SQLAlchemy connection string used to connect to the database' - - - name: sql.idle_timeout - type: integer - default: 200 - help: 'the timeout before idle sql connections are reaped' - - - name: oauth1.driver - type: string - default: 'keystone.contrib.oauth1.backends.sql.OAuth1' - - - name: identity.default_domain_id - type: string - default: 'default' - help: 'This references the domain to use for all Identity API v2 requests (which are not aware of domains). A domain with this ID will be created for you by keystone-manage db_sync in migration 008. The domain referenced by this ID cannot be deleted on the v3 API, to prevent accidentally breaking the v2 API. There is nothing special about this domain, other than the fact that it must exist to order to maintain support for your v2 clients.' - - - name: identity.domain_specific_drivers_enabled - type: boolean - default: False - help: 'A subset (or all) of domains can have their own identity driver, each with their own partial configuration file in a domain configuration directory. Only' - - - name: identity.domain_config_dir - type: string - default: '/etc/keystone/domains' - - - name: identity.max_password_length - type: integer - default: 4096 - help: 'Maximum supported length for user passwords; decrease to improve performance.' - - - name: cache.enabled - type: boolean - default: False - help: 'Global cache functionality toggle.' - - - name: catalog.template_file - type: string - default: 'default_catalog.templates' - - - name: endpoint_filter.return_all_endpoints_if_no_filter - type: boolean - default: True - - - name: token.provider - type: string - default: '' - help: 'Controls the token construction, validation, and revocation operations. Core providers are keystone.token.providers.[pki|uuid].Provider' - - - name: token.expiration - type: integer - default: 86400 - help: 'Amount of time a token should remain valid (in seconds)' - - - name: token.bind - type: string - default: '' - help: 'External auth mechanisms that should add bind information to token. eg kerberos, x509' - - - name: token.enforce_token_bind - type: string - default: 'permissive' - help: 'Enforcement policy on tokens presented to keystone with bind information. One of disabled, permissive, strict, required or a specifically required bind mode e.g. kerberos or x509 to require binding to that authentication.' - - - name: assignment.caching - type: boolean - default: True - help: 'Assignment specific caching toggle. This has no effect unless the global caching option is set to True' - - - name: assignment.cache_time - type: integer - default: 0 - help: 'Assignment specific cache time-to-live (TTL) in seconds.' - - - name: token.revocation_cache_time - type: integer - default: 3600 - help: 'Revocation-List specific cache time-to-live (TTL) in seconds.' - - - name: cache.config_prefix - type: string - default: 'cache.keystone' - help: 'Prefix for building the configuration dictionary for the cache region. This should not need to be changed unless there is another dogpile.cache region with the same configuration name' - - - name: cache.backend - type: string - default: 'keystone.common.cache.noop' - help: 'Dogpile.cache backend module. It is recommended that Memcache (dogpile.cache.memcache) or Redis (dogpile.cache.redis) be used in production deployments. Small workloads (single process) like devstack can use the dogpile.cache.memory backend.' - - - name: cache.backend_argument - type: string - default: '' - help: 'Arguments supplied to the backend module. Specify this option once per argument to be passed to the dogpile.cache backend. Example format: :' - - - name: cache.proxies - type: string - default: '' - help: 'Proxy Classes to import that will affect the way the dogpile.cache backend functions. See the dogpile.cache documentation on changing-backend-behavior. Comma delimited list e.g. my.dogpile.proxy.Class, my.dogpile.proxyClass2' - - - name: cache.use_key_mangler - type: boolean - default: True - help: 'Use a key-mangling function (sha1) to ensure fixed length cache-keys. This is toggle-able for debugging purposes, it is highly recommended to always leave this set to True.' - - - name: cache.debug_cache_backend - type: boolean - default: False - help: 'Extra debugging from the cache backend (cache keys, get/set/delete/etc calls) This is only really useful if you need to see the specific cache-backend get/set/delete calls with the keys/values. Typically this should be left set to False.' - - - name: oauth1.request_token_duration - type: integer - default: 28800 - help: 'The Identity service may include expire attributes. If no such attribute is included, then the token lasts indefinitely. Specify how quickly the request token will expire (in seconds)' - - - name: oauth1.access_token_duration - type: integer - default: 86400 - help: 'Specify how quickly the access token will expire (in seconds)' - - - name: ssl.enable - type: boolean - default: True - - - name: signing.certfile - type: string - default: '/etc/keystone/pki/certs/signing_cert.pem' - - - name: signing.keyfile - type: string - default: '/etc/keystone/pki/private/signing_key.pem' - - - name: signing.ca_certs - type: string - default: '/etc/keystone/pki/certs/cacert.pem' - - - name: signing.ca_key - type: string - default: '/etc/keystone/pki/private/cakey.pem' - - - name: signing.key_size - type: integer - default: 2048 - - - name: signing.valid_days - type: integer - default: 3650 - - - name: ssl.cert_required - type: boolean - default: False - - - name: signing.cert_subject - type: string - default: '/CUS/STUnset/LUnset/OUnset/CNwww.example.com' - - - name: signing.token_format - type: string - default: '' - help: 'Deprecated in favor of provider in the [token] section Allowed values are PKI or UUID' - - - name: ldap.url - type: string - default: 'ldap://localhost' - - - name: ldap.user - type: string - default: 'dcManager,dcexample,dccom' - - - name: auth.password - type: string - default: 'keystone.auth.plugins.password.Password' - - - name: ldap.suffix - type: string - default: 'cnexample,cncom' - - - name: ldap.use_dumb_member - type: boolean - default: False - - - name: ldap.allow_subtree_delete - type: boolean - default: False - - - name: ldap.dumb_member - type: string - default: 'cndumb,dcexample,dccom' - - - name: ldap.page_size - type: integer - default: 0 - help: "Maximum results per page; a value of zero ('0') disables paging (default)" - - - name: ldap.alias_dereferencing - type: string - default: 'default' - help: "The LDAP dereferencing option for queries. This can be either 'never', 'searching', 'always', 'finding' or 'default'. The 'default' option falls back to using default dereferencing configured by your ldap.conf." - - - name: ldap.query_scope - type: string - default: 'one' - help: "The LDAP scope for queries, this can be either 'one' (onelevel/singleLevel) or 'sub' (subtree/wholeSubtree)" - - - name: ldap.user_tree_dn - type: string - default: 'ouUsers,dcexample,dccom' - - - name: ldap.user_filter - type: string - default: '' - - - name: ldap.user_objectclass - type: string - default: 'inetOrgPerson' - - - name: ldap.user_domain_id_attribute - type: string - default: 'businessCategory' - - - name: ldap.user_id_attribute - type: string - default: 'cn' - - - name: ldap.user_name_attribute - type: string - default: 'sn' - - - name: ldap.user_mail_attribute - type: string - default: 'email' - - - name: ldap.user_pass_attribute - type: string - default: 'userPassword' - - - name: ldap.user_enabled_attribute - type: string - default: 'enabled' - - - name: ldap.user_enabled_mask - type: integer - default: 0 - - - name: ldap.user_enabled_default - type: boolean - default: True - - - name: ldap.user_attribute_ignore - type: string - default: 'tenant_id,tenants' - - - name: ldap.user_allow_create - type: boolean - default: True - - - name: ldap.user_allow_update - type: boolean - default: True - - - name: ldap.user_allow_delete - type: boolean - default: True - - - name: ldap.user_enabled_emulation - type: boolean - default: False - - - name: ldap.user_enabled_emulation_dn - type: string - default: '' - - - name: ldap.tenant_tree_dn - type: string - default: 'ouProjects,dcexample,dccom' - - - name: ldap.tenant_filter - type: string - default: '' - - - name: ldap.tenant_objectclass - type: string - default: 'groupOfNames' - - - name: ldap.tenant_domain_id_attribute - type: string - default: 'businessCategory' - - - name: ldap.tenant_id_attribute - type: string - default: 'cn' - - - name: ldap.tenant_member_attribute - type: string - default: 'member' - - - name: ldap.tenant_name_attribute - type: string - default: 'ou' - - - name: ldap.tenant_desc_attribute - type: string - default: 'desc' - - - name: ldap.tenant_enabled_attribute - type: string - default: 'enabled' - - - name: ldap.tenant_attribute_ignore - type: string - default: '' - - - name: ldap.tenant_allow_create - type: boolean - default: True - - - name: ldap.tenant_allow_update - type: boolean - default: True - - - name: ldap.tenant_allow_delete - type: boolean - default: True - - - name: ldap.tenant_enabled_emulation - type: boolean - default: False - - - name: ldap.tenant_enabled_emulation_dn - type: string - default: '' - - - name: ldap.role_tree_dn - type: string - default: 'ouRoles,dcexample,dccom' - - - name: ldap.role_filter - type: string - default: '' - - - name: ldap.role_objectclass - type: string - default: 'organizationalRole' - - - name: ldap.role_id_attribute - type: string - default: 'cn' - - - name: ldap.role_name_attribute - type: string - default: 'ou' - - - name: ldap.role_member_attribute - type: string - default: 'roleOccupant' - - - name: ldap.role_attribute_ignore - type: string - default: '' - - - name: ldap.role_allow_create - type: boolean - default: True - - - name: ldap.role_allow_update - type: boolean - default: True - - - name: ldap.role_allow_delete - type: boolean - default: True - - - name: ldap.group_tree_dn - type: string - default: '' - - - name: ldap.group_filter - type: string - default: '' - - - name: ldap.group_objectclass - type: string - default: 'groupOfNames' - - - name: ldap.group_id_attribute - type: string - default: 'cn' - - - name: ldap.group_name_attribute - type: string - default: 'ou' - - - name: ldap.group_member_attribute - type: string - default: 'member' - - - name: ldap.group_desc_attribute - type: string - default: 'desc' - - - name: ldap.group_attribute_ignore - type: string - default: '' - - - name: ldap.group_allow_create - type: boolean - default: True - - - name: ldap.group_allow_update - type: boolean - default: True - - - name: ldap.group_allow_delete - type: boolean - default: True - - - name: ldap.use_tls - type: boolean - default: False - help: 'ldap TLS options if both tls_cacertfile and tls_cacertdir are set then tls_cacertfile will be used and tls_cacertdir is ignored valid options for tls_req_cert are demand, never, and allow' - - - name: ldap.tls_cacertfile - type: string - default: '' - - - name: ldap.tls_cacertdir - type: string - default: '' - - - name: ldap.tls_req_cert - type: string - default: 'demand' - - - name: ldap.user_additional_attribute_mapping - type: string - default: '' - - - name: ldap.domain_additional_attribute_mapping - type: string - default: '' - - - name: ldap.group_additional_attribute_mapping - type: string - default: '' - - - name: ldap.role_additional_attribute_mapping - type: string - default: '' - - - name: ldap.project_additional_attribute_mapping - type: string - default: '' - - - name: auth.methods - type: string - default: 'external,password,token,oauth1' - - - name: auth.external - type: string - default: 'keystone.auth.plugins.external.ExternalDefault' - - - name: auth.token - type: string - default: 'keystone.auth.plugins.token.Token' - - - name: auth.oauth1 - type: string - default: 'keystone.auth.plugins.oauth1.OAuth' - - - name: paste_deploy.config_file - type: string - default: 'keystone-paste.ini' - help: 'Name of the paste configuration file that defines the available pipelines' - diff --git a/rubick/schemas/keystone/2013.2.0.yml b/rubick/schemas/keystone/2013.2.0.yml deleted file mode 100644 index cc1a356..0000000 --- a/rubick/schemas/keystone/2013.2.0.yml +++ /dev/null @@ -1,666 +0,0 @@ -project: keystone -version: '2013.2.0' -parameters: - - - name: admin_token - type: string - default: 'ADMIN' - help: "A 'shared secret' between keystone and other openstack services" - - - name: bind_host - type: host - default: '0.0.0.0' - help: 'The IP address of the network interface to listen on' - - - name: public_port - type: port - default: 5000 - help: 'The port number which the public service listens on' - - - name: admin_port - type: port - default: 35357 - help: 'The port number which the public admin listens on' - - - name: public_endpoint - type: string - default: 'http://localhost:%(public_port)s/' - help: 'The base endpoint URLs for keystone that are advertised to clients (NOTE: this does NOT affect how keystone listens for connections)' - - - name: admin_endpoint - type: string - default: 'http://localhost:%(admin_port)s/' - help: 'The base endpoint URLs for keystone that are advertised to clients (NOTE: this does NOT affect how keystone listens for connections)' - - - name: compute_port - type: port - default: 8774 - help: 'The port number which the OpenStack Compute service listens on' - - - name: policy_file - type: string - default: 'policy.json' - help: 'Path to your policy definition containing identity actions' - - - name: policy_default_rule - type: string - default: 'admin_required' - help: 'Rule to check if no matching policy definition is found FIXME(dolph): This should really be defined as [policy] default_rule' - - - name: member_role_id - type: string - default: '9fe2ff9ee4384b1894a90878d3e92bab' - help: 'Role for migrating membership relationships During a SQL upgrade, the following values will be used to create a new role that will replace records in the user_tenant_membership table with explicit role grants. After migration, the member_role_id will be used in the API add_user_to_project, and member_role_name will be ignored.' - - - name: member_role_name - type: string - default: '_member_' - help: 'Role for migrating membership relationships During a SQL upgrade, the following values will be used to create a new role that will replace records in the user_tenant_membership table with explicit role grants. After migration, the member_role_id will be used in the API add_user_to_project, and member_role_name will be ignored.' - - - name: max_request_body_size - type: integer - default: 114688 - help: 'enforced by optional sizelimit middleware (keystone.middleware:RequestBodySizeLimiter)' - - - name: max_param_size - type: integer - default: 64 - help: 'limit the sizes of user & tenant ID/names' - - - name: max_token_size - type: integer - default: 8192 - help: 'similar to max_param_size, but provides an exception for token values' - - - name: debug - type: boolean - default: false - help: '=== Logging Options === Print debugging output (includes plaintext request logging, potentially including passwords)' - - - name: verbose - type: boolean - default: false - help: 'Print more verbose output' - - - name: log_file - type: string - default: 'keystone.log' - help: 'Name of log file to output to. If not set, logging will go to stdout.' - - - name: log_dir - type: string - default: '/var/log/keystone' - help: 'The directory to keep log files in (will be prepended to --logfile)' - - - name: use_syslog - type: boolean - default: false - help: 'Use syslog for logging.' - - - name: syslog_log_facility - type: string - default: 'LOG_USER' - help: 'syslog facility to receive log lines' - - - name: log_config - type: string - default: 'logging.conf' - help: 'If this option is specified, the logging configuration file specified is used and overrides any other logging options specified. Please see the Python logging module documentation for details on logging configuration files.' - - - name: log_format - type: string - default: '%(asctime)s %(levelname)8s [%(name)s] %(message)s' - help: 'A logging.Formatter log message format string which may use any of the available logging.LogRecord attributes.' - - - name: log_date_format - type: string - default: '%Y-%m-%d %H:%M:%S' - help: 'Format string for %(asctime)s in log records.' - - - name: onready - type: string - default: 'keystone.common.systemd' - help: 'onready allows you to send a notification when the process is ready to serve For example, to have it notify using systemd, one could set shell command: onready = systemd-notify --ready or a module with notify() method:' - - - name: default_notification_level - type: string - default: 'INFO' - help: 'Default notification level for outgoing notifications' - - - name: default_publisher_id - type: string - default: '' - help: 'Default publisher_id for outgoing notifications; included in the payload.' - - - name: rpc_backend - type: string - default: 'keystone.openstack.common.rpc.impl_kombu' - help: 'The messaging module to use, defaults to kombu.' - - - name: rpc_thread_pool_size - type: integer - default: 64 - help: 'Size of RPC thread pool' - - - name: rpc_conn_pool_size - type: integer - default: 30 - help: 'Size of RPC connection pool' - - - name: rpc_response_timeout - type: integer - default: 60 - help: 'Seconds to wait for a response from call or multicall' - - - name: rpc_cast_timeout - type: integer - default: 30 - help: 'Seconds to wait before a cast expires (TTL). Only supported by impl_zmq.' - - - name: fake_rabbit - type: boolean - default: false - help: 'If True, use a fake RabbitMQ provider' - - - name: control_exchange - type: string - default: 'openstack' - help: 'AMQP exchange to connect to if using RabbitMQ or Qpid' - - - name: sql.connection - type: string - default: 'sqlite:///keystone.db' - help: 'The SQLAlchemy connection string used to connect to the database' - - - name: sql.idle_timeout - type: integer - default: 200 - help: 'the timeout before idle sql connections are reaped' - - - name: oauth1.driver - type: string - default: 'keystone.contrib.oauth1.backends.sql.OAuth1' - - - name: identity.default_domain_id - type: string - default: 'default' - help: 'This references the domain to use for all Identity API v2 requests (which are not aware of domains). A domain with this ID will be created for you by keystone-manage db_sync in migration 008. The domain referenced by this ID cannot be deleted on the v3 API, to prevent accidentally breaking the v2 API. There is nothing special about this domain, other than the fact that it must exist to order to maintain support for your v2 clients.' - - - name: identity.domain_specific_drivers_enabled - type: boolean - default: false - help: 'A subset (or all) of domains can have their own identity driver, each with their own partial configuration file in a domain configuration directory. Only values specific to the domain need to be placed in the domain specific configuration file. This feature is disabled by default; set domain_specific_drivers_enabled to True to enable.' - - - name: identity.domain_config_dir - type: string - default: '/etc/keystone/domains' - help: 'A subset (or all) of domains can have their own identity driver, each with their own partial configuration file in a domain configuration directory. Only values specific to the domain need to be placed in the domain specific configuration file. This feature is disabled by default; set domain_specific_drivers_enabled to True to enable.' - - - name: identity.max_password_length - type: integer - default: 4096 - help: 'Maximum supported length for user passwords; decrease to improve performance.' - - - name: cache.enabled - type: boolean - default: false - help: 'Global cache functionality toggle.' - - - name: catalog.template_file - type: string - default: 'default_catalog.templates' - - - name: endpoint_filter.return_all_endpoints_if_no_filter - type: boolean - default: true - help: 'extension for creating associations between project and endpoints in order to provide a tailored catalog for project-scoped token requests.' - - - name: token.provider - type: string - default: '' - help: 'Controls the token construction, validation, and revocation operations. Core providers are keystone.token.providers.[pki|uuid].Provider' - - - name: token.expiration - type: integer - default: 86400 - help: 'Amount of time a token should remain valid (in seconds)' - - - name: token.bind - type: string - default: '' - help: 'External auth mechanisms that should add bind information to token. eg kerberos, x509' - - - name: token.enforce_token_bind - type: string - default: 'permissive' - help: 'Enforcement policy on tokens presented to keystone with bind information. One of disabled, permissive, strict, required or a specifically required bind mode e.g. kerberos or x509 to require binding to that authentication.' - - - name: assignment.caching - type: boolean - default: true - help: 'Assignment specific caching toggle. This has no effect unless the global caching option is set to True' - - - name: assignment.cache_time - type: integer - default: ~ - help: 'Assignment specific cache time-to-live (TTL) in seconds.' - - - name: token.revocation_cache_time - type: integer - default: 3600 - help: 'Revocation-List specific cache time-to-live (TTL) in seconds.' - - - name: cache.config_prefix - type: string - default: 'cache.keystone' - help: 'Prefix for building the configuration dictionary for the cache region. This should not need to be changed unless there is another dogpile.cache region with the same configuration name' - - - name: cache.backend - type: string - default: 'keystone.common.cache.noop' - help: 'Dogpile.cache backend module. It is recommended that Memcache (dogpile.cache.memcache) or Redis (dogpile.cache.redis) be used in production deployments. Small workloads (single process) like devstack can use the dogpile.cache.memory backend.' - - - name: cache.backend_argument - type: string - default: '' - help: 'Arguments supplied to the backend module. Specify this option once per argument to be passed to the dogpile.cache backend. Example format: :' - - - name: cache.proxies - type: string - default: '' - help: 'Proxy Classes to import that will affect the way the dogpile.cache backend functions. See the dogpile.cache documentation on changing-backend-behavior. Comma delimited list e.g. my.dogpile.proxy.Class, my.dogpile.proxyClass2' - - - name: cache.use_key_mangler - type: boolean - default: true - help: 'Use a key-mangling function (sha1) to ensure fixed length cache-keys. This is toggle-able for debugging purposes, it is highly recommended to always leave this set to True.' - - - name: cache.debug_cache_backend - type: boolean - default: false - help: 'Extra debugging from the cache backend (cache keys, get/set/delete/etc calls) This is only really useful if you need to see the specific cache-backend get/set/delete calls with the keys/values. Typically this should be left set to False.' - - - name: oauth1.request_token_duration - type: integer - default: 28800 - help: 'The Identity service may include expire attributes. If no such attribute is included, then the token lasts indefinitely. Specify how quickly the request token will expire (in seconds)' - - - name: oauth1.access_token_duration - type: integer - default: 86400 - help: 'The Identity service may include expire attributes. If no such attribute is included, then the token lasts indefinitely. Specify how quickly the request token will expire (in seconds) Specify how quickly the access token will expire (in seconds)' - - - name: ssl.enable - type: boolean - default: true - - - name: signing.certfile - type: string - default: '/etc/keystone/pki/certs/signing_cert.pem' - - - name: signing.keyfile - type: string - default: '/etc/keystone/pki/private/signing_key.pem' - - - name: signing.ca_certs - type: string - default: '/etc/keystone/pki/certs/cacert.pem' - - - name: signing.ca_key - type: string - default: '/etc/keystone/pki/private/cakey.pem' - - - name: signing.key_size - type: integer - default: 2048 - - - name: signing.valid_days - type: integer - default: 3650 - - - name: ssl.cert_required - type: boolean - default: false - - - name: signing.cert_subject - type: string - default: '/C=US/ST=Unset/L=Unset/O=Unset/CN=www.example.com' - - - name: signing.token_format - type: string - default: '' - help: 'Deprecated in favor of provider in the [token] section Allowed values are PKI or UUID' - - - name: ldap.url - type: string - default: 'ldap://localhost' - - - name: ldap.user - type: string - default: 'dcManager,dcexample,dccom' - - - name: auth.password - type: string - default: 'keystone.auth.plugins.password.Password' - - - name: ldap.suffix - type: string - default: 'cnexample,cncom' - - - name: ldap.use_dumb_member - type: boolean - default: false - - - name: ldap.allow_subtree_delete - type: boolean - default: false - - - name: ldap.dumb_member - type: string - default: 'cndumb,dcexample,dccom' - - - name: ldap.page_size - type: integer - default: 0 - help: "Maximum results per page; a value of zero ('0') disables paging (default)" - - - name: ldap.alias_dereferencing - type: string - default: 'default' - help: "The LDAP dereferencing option for queries. This can be either 'never', 'searching', 'always', 'finding' or 'default'. The 'default' option falls back to using default dereferencing configured by your ldap.conf." - - - name: ldap.query_scope - type: string - default: 'one' - help: "The LDAP scope for queries, this can be either 'one' (onelevel/singleLevel) or 'sub' (subtree/wholeSubtree)" - - - name: ldap.user_tree_dn - type: string - default: 'ouUsers,dcexample,dccom' - - - name: ldap.user_filter - type: string - default: '' - - - name: ldap.user_objectclass - type: string - default: 'inetOrgPerson' - - - name: ldap.user_domain_id_attribute - type: string - default: 'businessCategory' - - - name: ldap.user_id_attribute - type: string - default: 'cn' - - - name: ldap.user_name_attribute - type: string - default: 'sn' - - - name: ldap.user_mail_attribute - type: string - default: 'email' - - - name: ldap.user_pass_attribute - type: string - default: 'userPassword' - - - name: ldap.user_enabled_attribute - type: string - default: 'enabled' - - - name: ldap.user_enabled_mask - type: integer - default: 0 - - - name: ldap.user_enabled_default - type: boolean - default: true - - - name: ldap.user_attribute_ignore - type: string - default: 'tenant_id,tenants' - - - name: ldap.user_allow_create - type: boolean - default: true - - - name: ldap.user_allow_update - type: boolean - default: true - - - name: ldap.user_allow_delete - type: boolean - default: true - - - name: ldap.user_enabled_emulation - type: boolean - default: false - - - name: ldap.user_enabled_emulation_dn - type: string - default: '' - - - name: ldap.tenant_tree_dn - type: string - default: 'ouProjects,dcexample,dccom' - - - name: ldap.tenant_filter - type: string - default: '' - - - name: ldap.tenant_objectclass - type: string - default: 'groupOfNames' - - - name: ldap.tenant_domain_id_attribute - type: string - default: 'businessCategory' - - - name: ldap.tenant_id_attribute - type: string - default: 'cn' - - - name: ldap.tenant_member_attribute - type: string - default: 'member' - - - name: ldap.tenant_name_attribute - type: string - default: 'ou' - - - name: ldap.tenant_desc_attribute - type: string - default: 'desc' - - - name: ldap.tenant_enabled_attribute - type: string - default: 'enabled' - - - name: ldap.tenant_attribute_ignore - type: string - default: '' - - - name: ldap.tenant_allow_create - type: boolean - default: true - - - name: ldap.tenant_allow_update - type: boolean - default: true - - - name: ldap.tenant_allow_delete - type: boolean - default: true - - - name: ldap.tenant_enabled_emulation - type: boolean - default: false - - - name: ldap.tenant_enabled_emulation_dn - type: string - default: '' - - - name: ldap.role_tree_dn - type: string - default: 'ouRoles,dcexample,dccom' - - - name: ldap.role_filter - type: string - default: '' - - - name: ldap.role_objectclass - type: string - default: 'organizationalRole' - - - name: ldap.role_id_attribute - type: string - default: 'cn' - - - name: ldap.role_name_attribute - type: string - default: 'ou' - - - name: ldap.role_member_attribute - type: string - default: 'roleOccupant' - - - name: ldap.role_attribute_ignore - type: string - default: '' - - - name: ldap.role_allow_create - type: boolean - default: true - - - name: ldap.role_allow_update - type: boolean - default: true - - - name: ldap.role_allow_delete - type: boolean - default: true - - - name: ldap.group_tree_dn - type: string - default: '' - - - name: ldap.group_filter - type: string - default: '' - - - name: ldap.group_objectclass - type: string - default: 'groupOfNames' - - - name: ldap.group_id_attribute - type: string - default: 'cn' - - - name: ldap.group_name_attribute - type: string - default: 'ou' - - - name: ldap.group_member_attribute - type: string - default: 'member' - - - name: ldap.group_desc_attribute - type: string - default: 'desc' - - - name: ldap.group_attribute_ignore - type: string - default: '' - - - name: ldap.group_allow_create - type: boolean - default: true - - - name: ldap.group_allow_update - type: boolean - default: true - - - name: ldap.group_allow_delete - type: boolean - default: true - - - name: ldap.use_tls - type: boolean - default: false - help: 'ldap TLS options if both tls_cacertfile and tls_cacertdir are set then tls_cacertfile will be used and tls_cacertdir is ignored valid options for tls_req_cert are demand, never, and allow' - - - name: ldap.tls_cacertfile - type: string - default: '' - - - name: ldap.tls_cacertdir - type: string - default: '' - - - name: ldap.tls_req_cert - type: string - default: 'demand' - - - name: ldap.user_additional_attribute_mapping - type: string - default: '' - - - name: ldap.domain_additional_attribute_mapping - type: string - default: '' - - - name: ldap.group_additional_attribute_mapping - type: string - default: '' - - - name: ldap.role_additional_attribute_mapping - type: string - default: '' - - - name: ldap.project_additional_attribute_mapping - type: string - default: '' - - - name: auth.methods - type: string - default: 'external,password,token,oauth1' - - - name: auth.external - type: string - default: 'keystone.auth.plugins.external.ExternalDefault' - - - name: auth.token - type: string - default: 'keystone.auth.plugins.token.Token' - - - name: auth.oauth1 - type: string - default: 'keystone.auth.plugins.oauth1.OAuth' - - - name: paste_deploy.config_file - type: string - default: 'keystone-paste.ini' - help: 'Name of the paste configuration file that defines the available pipelines' - - - name: notification_driver - type: string - default: 'keystone.openstack.common.notifier.rpc_notifier' - help: 'notification_driver can be defined multiple times Do nothing driver (the default) notification_driver = keystone.openstack.common.notifier.no_op_notifier Logging driver example (not enabled by default) notification_driver = keystone.openstack.common.notifier.log_notifier RPC driver example (not enabled by default)' - - - name: notification_topics - type: string - default: 'notifications' - help: 'AMQP topics to publish to when using the RPC notification driver. Multiple values can be specified by separating with commas. The actual topic names will be %s.%(default_notification_level)s' - - - name: allowed_rpc_exception_modules - type: string - default: 'keystone.openstack.common.exception,nova.exception,cinder.exception,exceptions' - help: 'Modules of exceptions that are permitted to be recreated upon receiving exception data from an rpc call.' - - - name: cache.expiration_time - type: integer - default: 600 - help: "Default TTL, in seconds, for any cached item in the dogpile.cache region. This applies to any cached method that doesn't have an explicit cache expiration time defined for it." - diff --git a/rubick/schemas/keystone/keystone.conf.yml b/rubick/schemas/keystone/keystone.conf.yml deleted file mode 100644 index 8feaabf..0000000 --- a/rubick/schemas/keystone/keystone.conf.yml +++ /dev/null @@ -1,864 +0,0 @@ -- version: '2013.1.3' - checkpoint: true - added: - - - name: admin_token - type: string - default: 'ADMIN' - help: "A 'shared secret' between keystone and other openstack services" - comment: 'New param' - - - name: bind_host - type: host - default: '0.0.0.0' - help: 'The IP address of the network interface to listen on' - comment: 'New param' - - - name: public_port - type: port - default: 5000 - help: 'The port number which the public service listens on' - comment: 'New param' - - - name: admin_port - type: port - default: 35357 - help: 'The port number which the public admin listens on' - comment: 'New param' - - - name: public_endpoint - type: string - default: 'http://localhost:%(public_port)s/' - help: 'The base endpoint URLs for keystone that are advertised to clients (NOTE: this does NOT affect how keystone listens for connections)' - comment: 'New param' - - - name: admin_endpoint - type: string - default: 'http://localhost:%(admin_port)s/' - comment: 'New param' - - - name: compute_port - type: port - default: 8774 - help: 'The port number which the OpenStack Compute service listens on' - comment: 'New param' - - - name: policy_file - type: string - default: 'policy.json' - help: 'Path to your policy definition containing identity actions' - comment: 'New param' - - - name: policy_default_rule - type: string - default: 'admin_required' - help: 'Rule to check if no matching policy definition is found FIXME(dolph): This should really be defined as [policy] default_rule' - comment: 'New param' - - - name: member_role_id - type: string - default: '9fe2ff9ee4384b1894a90878d3e92bab' - help: 'Role for migrating membership relationships During a SQL upgrade, the following values will be used to create a new role that will replace records in the user_tenant_membership table with explicit role grants. After migration, the member_role_id will be used in the API add_user_to_project, and member_role_name will be ignored.' - comment: 'New param' - - - name: member_role_name - type: string - default: '_member_' - comment: 'New param' - - - name: max_request_body_size - type: integer - default: 114688 - help: 'enforced by optional sizelimit middleware (keystone.middleware:RequestBodySizeLimiter)' - comment: 'New param' - - - name: max_param_size - type: integer - default: 64 - help: 'limit the sizes of user & tenant ID/names' - comment: 'New param' - - - name: max_token_size - type: integer - default: 8192 - help: 'similar to max_param_size, but provides an exception for token values' - comment: 'New param' - - - name: debug - type: boolean - default: false - help: '=== Logging Options === Print debugging output (includes plaintext request logging, potentially including passwords)' - comment: 'New param' - - - name: verbose - type: boolean - default: false - help: 'Print more verbose output' - comment: 'New param' - - - name: log_file - type: string - default: 'keystone.log' - help: 'Name of log file to output to. If not set, logging will go to stdout.' - comment: 'New param' - - - name: log_dir - type: string - default: '/var/log/keystone' - help: 'The directory to keep log files in (will be prepended to --logfile)' - comment: 'New param' - - - name: use_syslog - type: boolean - default: false - help: 'Use syslog for logging.' - comment: 'New param' - - - name: syslog_log_facility - type: string - default: 'LOG_USER' - help: 'syslog facility to receive log lines' - comment: 'New param' - - - name: log_config - type: string - default: 'logging.conf' - help: 'If this option is specified, the logging configuration file specified is used and overrides any other logging options specified. Please see the Python logging module documentation for details on logging configuration files.' - comment: 'New param' - - - name: log_format - type: string - default: '%(asctime)s %(levelname)8s [%(name)s] %(message)s' - help: 'A logging.Formatter log message format string which may use any of the available logging.LogRecord attributes.' - comment: 'New param' - - - name: log_date_format - type: string - default: '%Y-%m-%d %H:%M:%S' - help: 'Format string for %(asctime)s in log records.' - comment: 'New param' - - - name: onready - type: string - default: 'keystone.common.systemd' - help: 'onready allows you to send a notification when the process is ready to serve For example, to have it notify using systemd, one could set shell command: onready = systemd-notify --ready or a module with notify() method:' - comment: 'New param' - - - name: default_notification_level - type: string - default: 'INFO' - help: 'Default notification level for outgoing notifications' - comment: 'New param' - - - name: default_publisher_id - type: string - default: '' - help: 'Default publisher_id for outgoing notifications; included in the payload.' - comment: 'New param' - - - name: rpc_backend - type: string - default: 'keystone.openstack.common.rpc.impl_kombu' - help: 'The messaging module to use, defaults to kombu.' - comment: 'New param' - - - name: rpc_thread_pool_size - type: integer - default: 64 - help: 'Size of RPC thread pool' - comment: 'New param' - - - name: rpc_conn_pool_size - type: integer - default: 30 - help: 'Size of RPC connection pool' - comment: 'New param' - - - name: rpc_response_timeout - type: integer - default: 60 - help: 'Seconds to wait for a response from call or multicall' - comment: 'New param' - - - name: rpc_cast_timeout - type: integer - default: 30 - help: 'Seconds to wait before a cast expires (TTL). Only supported by impl_zmq.' - comment: 'New param' - - - name: fake_rabbit - type: boolean - default: false - help: 'If True, use a fake RabbitMQ provider' - comment: 'New param' - - - name: control_exchange - type: string - default: 'openstack' - help: 'AMQP exchange to connect to if using RabbitMQ or Qpid' - comment: 'New param' - - - name: sql.connection - type: string - default: 'sqlite:///keystone.db' - help: 'The SQLAlchemy connection string used to connect to the database' - comment: 'New param' - - - name: sql.idle_timeout - type: integer - default: 200 - help: 'the timeout before idle sql connections are reaped' - comment: 'New param' - - - name: oauth1.driver - type: string - default: 'keystone.contrib.oauth1.backends.sql.OAuth1' - comment: 'New param' - - - name: identity.default_domain_id - type: string - default: 'default' - help: 'This references the domain to use for all Identity API v2 requests (which are not aware of domains). A domain with this ID will be created for you by keystone-manage db_sync in migration 008. The domain referenced by this ID cannot be deleted on the v3 API, to prevent accidentally breaking the v2 API. There is nothing special about this domain, other than the fact that it must exist to order to maintain support for your v2 clients.' - comment: 'New param' - - - name: identity.domain_specific_drivers_enabled - type: boolean - default: false - help: 'A subset (or all) of domains can have their own identity driver, each with their own partial configuration file in a domain configuration directory. Only' - comment: 'New param' - - - name: identity.domain_config_dir - type: string - default: '/etc/keystone/domains' - comment: 'New param' - - - name: identity.max_password_length - type: integer - default: 4096 - help: 'Maximum supported length for user passwords; decrease to improve performance.' - comment: 'New param' - - - name: cache.enabled - type: boolean - default: false - help: 'Global cache functionality toggle.' - comment: 'New param' - - - name: catalog.template_file - type: string - default: 'default_catalog.templates' - comment: 'New param' - - - name: endpoint_filter.return_all_endpoints_if_no_filter - type: boolean - default: true - comment: 'New param' - - - name: token.provider - type: string - default: '' - help: 'Controls the token construction, validation, and revocation operations. Core providers are keystone.token.providers.[pki|uuid].Provider' - comment: 'New param' - - - name: token.expiration - type: integer - default: 86400 - help: 'Amount of time a token should remain valid (in seconds)' - comment: 'New param' - - - name: token.bind - type: string - default: '' - help: 'External auth mechanisms that should add bind information to token. eg kerberos, x509' - comment: 'New param' - - - name: token.enforce_token_bind - type: string - default: 'permissive' - help: 'Enforcement policy on tokens presented to keystone with bind information. One of disabled, permissive, strict, required or a specifically required bind mode e.g. kerberos or x509 to require binding to that authentication.' - comment: 'New param' - - - name: assignment.caching - type: boolean - default: true - help: 'Assignment specific caching toggle. This has no effect unless the global caching option is set to True' - comment: 'New param' - - - name: assignment.cache_time - type: integer - default: false - help: 'Assignment specific cache time-to-live (TTL) in seconds.' - comment: 'New param' - - - name: token.revocation_cache_time - type: integer - default: 3600 - help: 'Revocation-List specific cache time-to-live (TTL) in seconds.' - comment: 'New param' - - - name: cache.config_prefix - type: string - default: 'cache.keystone' - help: 'Prefix for building the configuration dictionary for the cache region. This should not need to be changed unless there is another dogpile.cache region with the same configuration name' - comment: 'New param' - - - name: cache.backend - type: string - default: 'keystone.common.cache.noop' - help: 'Dogpile.cache backend module. It is recommended that Memcache (dogpile.cache.memcache) or Redis (dogpile.cache.redis) be used in production deployments. Small workloads (single process) like devstack can use the dogpile.cache.memory backend.' - comment: 'New param' - - - name: cache.backend_argument - type: string - default: '' - help: 'Arguments supplied to the backend module. Specify this option once per argument to be passed to the dogpile.cache backend. Example format: :' - comment: 'New param' - - - name: cache.proxies - type: string - default: '' - help: 'Proxy Classes to import that will affect the way the dogpile.cache backend functions. See the dogpile.cache documentation on changing-backend-behavior. Comma delimited list e.g. my.dogpile.proxy.Class, my.dogpile.proxyClass2' - comment: 'New param' - - - name: cache.use_key_mangler - type: boolean - default: true - help: 'Use a key-mangling function (sha1) to ensure fixed length cache-keys. This is toggle-able for debugging purposes, it is highly recommended to always leave this set to True.' - comment: 'New param' - - - name: cache.debug_cache_backend - type: boolean - default: false - help: 'Extra debugging from the cache backend (cache keys, get/set/delete/etc calls) This is only really useful if you need to see the specific cache-backend get/set/delete calls with the keys/values. Typically this should be left set to False.' - comment: 'New param' - - - name: oauth1.request_token_duration - type: integer - default: 28800 - help: 'The Identity service may include expire attributes. If no such attribute is included, then the token lasts indefinitely. Specify how quickly the request token will expire (in seconds)' - comment: 'New param' - - - name: oauth1.access_token_duration - type: integer - default: 86400 - help: 'Specify how quickly the access token will expire (in seconds)' - comment: 'New param' - - - name: ssl.enable - type: boolean - default: true - comment: 'New param' - - - name: signing.certfile - type: string - default: '/etc/keystone/pki/certs/signing_cert.pem' - comment: 'New param' - - - name: signing.keyfile - type: string - default: '/etc/keystone/pki/private/signing_key.pem' - comment: 'New param' - - - name: signing.ca_certs - type: string - default: '/etc/keystone/pki/certs/cacert.pem' - comment: 'New param' - - - name: signing.ca_key - type: string - default: '/etc/keystone/pki/private/cakey.pem' - comment: 'New param' - - - name: signing.key_size - type: integer - default: 2048 - comment: 'New param' - - - name: signing.valid_days - type: integer - default: 3650 - comment: 'New param' - - - name: ssl.cert_required - type: boolean - default: false - comment: 'New param' - - - name: signing.cert_subject - type: string - default: '/CUS/STUnset/LUnset/OUnset/CNwww.example.com' - comment: 'New param' - - - name: signing.token_format - type: string - default: '' - help: 'Deprecated in favor of provider in the [token] section Allowed values are PKI or UUID' - comment: 'New param' - - - name: ldap.url - type: string - default: 'ldap://localhost' - comment: 'New param' - - - name: ldap.user - type: string - default: 'dcManager,dcexample,dccom' - comment: 'New param' - - - name: auth.password - type: string - default: 'keystone.auth.plugins.password.Password' - comment: 'New param' - - - name: ldap.suffix - type: string - default: 'cnexample,cncom' - comment: 'New param' - - - name: ldap.use_dumb_member - type: boolean - default: false - comment: 'New param' - - - name: ldap.allow_subtree_delete - type: boolean - default: false - comment: 'New param' - - - name: ldap.dumb_member - type: string - default: 'cndumb,dcexample,dccom' - comment: 'New param' - - - name: ldap.page_size - type: integer - default: false - help: "Maximum results per page; a value of zero ('0') disables paging (default)" - comment: 'New param' - - - name: ldap.alias_dereferencing - type: string - default: 'default' - help: "The LDAP dereferencing option for queries. This can be either 'never', 'searching', 'always', 'finding' or 'default'. The 'default' option falls back to using default dereferencing configured by your ldap.conf." - comment: 'New param' - - - name: ldap.query_scope - type: string - default: 'one' - help: "The LDAP scope for queries, this can be either 'one' (onelevel/singleLevel) or 'sub' (subtree/wholeSubtree)" - comment: 'New param' - - - name: ldap.user_tree_dn - type: string - default: 'ouUsers,dcexample,dccom' - comment: 'New param' - - - name: ldap.user_filter - type: string - default: '' - comment: 'New param' - - - name: ldap.user_objectclass - type: string - default: 'inetOrgPerson' - comment: 'New param' - - - name: ldap.user_domain_id_attribute - type: string - default: 'businessCategory' - comment: 'New param' - - - name: ldap.user_id_attribute - type: string - default: 'cn' - comment: 'New param' - - - name: ldap.user_name_attribute - type: string - default: 'sn' - comment: 'New param' - - - name: ldap.user_mail_attribute - type: string - default: 'email' - comment: 'New param' - - - name: ldap.user_pass_attribute - type: string - default: 'userPassword' - comment: 'New param' - - - name: ldap.user_enabled_attribute - type: string - default: 'enabled' - comment: 'New param' - - - name: ldap.user_enabled_mask - type: integer - default: false - comment: 'New param' - - - name: ldap.user_enabled_default - type: boolean - default: true - comment: 'New param' - - - name: ldap.user_attribute_ignore - type: string - default: 'tenant_id,tenants' - comment: 'New param' - - - name: ldap.user_allow_create - type: boolean - default: true - comment: 'New param' - - - name: ldap.user_allow_update - type: boolean - default: true - comment: 'New param' - - - name: ldap.user_allow_delete - type: boolean - default: true - comment: 'New param' - - - name: ldap.user_enabled_emulation - type: boolean - default: false - comment: 'New param' - - - name: ldap.user_enabled_emulation_dn - type: string - default: '' - comment: 'New param' - - - name: ldap.tenant_tree_dn - type: string - default: 'ouProjects,dcexample,dccom' - comment: 'New param' - - - name: ldap.tenant_filter - type: string - default: '' - comment: 'New param' - - - name: ldap.tenant_objectclass - type: string - default: 'groupOfNames' - comment: 'New param' - - - name: ldap.tenant_domain_id_attribute - type: string - default: 'businessCategory' - comment: 'New param' - - - name: ldap.tenant_id_attribute - type: string - default: 'cn' - comment: 'New param' - - - name: ldap.tenant_member_attribute - type: string - default: 'member' - comment: 'New param' - - - name: ldap.tenant_name_attribute - type: string - default: 'ou' - comment: 'New param' - - - name: ldap.tenant_desc_attribute - type: string - default: 'desc' - comment: 'New param' - - - name: ldap.tenant_enabled_attribute - type: string - default: 'enabled' - comment: 'New param' - - - name: ldap.tenant_attribute_ignore - type: string - default: '' - comment: 'New param' - - - name: ldap.tenant_allow_create - type: boolean - default: true - comment: 'New param' - - - name: ldap.tenant_allow_update - type: boolean - default: true - comment: 'New param' - - - name: ldap.tenant_allow_delete - type: boolean - default: true - comment: 'New param' - - - name: ldap.tenant_enabled_emulation - type: boolean - default: false - comment: 'New param' - - - name: ldap.tenant_enabled_emulation_dn - type: string - default: '' - comment: 'New param' - - - name: ldap.role_tree_dn - type: string - default: 'ouRoles,dcexample,dccom' - comment: 'New param' - - - name: ldap.role_filter - type: string - default: '' - comment: 'New param' - - - name: ldap.role_objectclass - type: string - default: 'organizationalRole' - comment: 'New param' - - - name: ldap.role_id_attribute - type: string - default: 'cn' - comment: 'New param' - - - name: ldap.role_name_attribute - type: string - default: 'ou' - comment: 'New param' - - - name: ldap.role_member_attribute - type: string - default: 'roleOccupant' - comment: 'New param' - - - name: ldap.role_attribute_ignore - type: string - default: '' - comment: 'New param' - - - name: ldap.role_allow_create - type: boolean - default: true - comment: 'New param' - - - name: ldap.role_allow_update - type: boolean - default: true - comment: 'New param' - - - name: ldap.role_allow_delete - type: boolean - default: true - comment: 'New param' - - - name: ldap.group_tree_dn - type: string - default: '' - comment: 'New param' - - - name: ldap.group_filter - type: string - default: '' - comment: 'New param' - - - name: ldap.group_objectclass - type: string - default: 'groupOfNames' - comment: 'New param' - - - name: ldap.group_id_attribute - type: string - default: 'cn' - comment: 'New param' - - - name: ldap.group_name_attribute - type: string - default: 'ou' - comment: 'New param' - - - name: ldap.group_member_attribute - type: string - default: 'member' - comment: 'New param' - - - name: ldap.group_desc_attribute - type: string - default: 'desc' - comment: 'New param' - - - name: ldap.group_attribute_ignore - type: string - default: '' - comment: 'New param' - - - name: ldap.group_allow_create - type: boolean - default: true - comment: 'New param' - - - name: ldap.group_allow_update - type: boolean - default: true - comment: 'New param' - - - name: ldap.group_allow_delete - type: boolean - default: true - comment: 'New param' - - - name: ldap.use_tls - type: boolean - default: false - help: 'ldap TLS options if both tls_cacertfile and tls_cacertdir are set then tls_cacertfile will be used and tls_cacertdir is ignored valid options for tls_req_cert are demand, never, and allow' - comment: 'New param' - - - name: ldap.tls_cacertfile - type: string - default: '' - comment: 'New param' - - - name: ldap.tls_cacertdir - type: string - default: '' - comment: 'New param' - - - name: ldap.tls_req_cert - type: string - default: 'demand' - comment: 'New param' - - - name: ldap.user_additional_attribute_mapping - type: string - default: '' - comment: 'New param' - - - name: ldap.domain_additional_attribute_mapping - type: string - default: '' - comment: 'New param' - - - name: ldap.group_additional_attribute_mapping - type: string - default: '' - comment: 'New param' - - - name: ldap.role_additional_attribute_mapping - type: string - default: '' - comment: 'New param' - - - name: ldap.project_additional_attribute_mapping - type: string - default: '' - comment: 'New param' - - - name: auth.methods - type: string - default: 'external,password,token,oauth1' - comment: 'New param' - - - name: auth.external - type: string - default: 'keystone.auth.plugins.external.ExternalDefault' - comment: 'New param' - - - name: auth.token - type: string - default: 'keystone.auth.plugins.token.Token' - comment: 'New param' - - - name: auth.oauth1 - type: string - default: 'keystone.auth.plugins.oauth1.OAuth' - comment: 'New param' - - - name: paste_deploy.config_file - type: string - default: 'keystone-paste.ini' - help: 'Name of the paste configuration file that defines the available pipelines' - comment: 'New param' - -# ==================================================== - -- version: '2013.2.0' - added: - - - name: admin_endpoint - type: string - default: 'http://localhost:%(admin_port)s/' - help: 'The base endpoint URLs for keystone that are advertised to clients (NOTE: this does NOT affect how keystone listens for connections)' - comment: 'Help string has changed' - - - name: member_role_name - type: string - default: '_member_' - help: 'Role for migrating membership relationships During a SQL upgrade, the following values will be used to create a new role that will replace records in the user_tenant_membership table with explicit role grants. After migration, the member_role_id will be used in the API add_user_to_project, and member_role_name will be ignored.' - comment: 'Help string has changed' - - - name: identity.domain_specific_drivers_enabled - type: boolean - default: false - help: 'A subset (or all) of domains can have their own identity driver, each with their own partial configuration file in a domain configuration directory. Only values specific to the domain need to be placed in the domain specific configuration file. This feature is disabled by default; set domain_specific_drivers_enabled to True to enable.' - comment: 'Help string has changed' - - - name: identity.domain_config_dir - type: string - default: '/etc/keystone/domains' - help: 'A subset (or all) of domains can have their own identity driver, each with their own partial configuration file in a domain configuration directory. Only values specific to the domain need to be placed in the domain specific configuration file. This feature is disabled by default; set domain_specific_drivers_enabled to True to enable.' - comment: 'Help string has changed' - - - name: endpoint_filter.return_all_endpoints_if_no_filter - type: boolean - default: true - help: 'extension for creating associations between project and endpoints in order to provide a tailored catalog for project-scoped token requests.' - comment: 'Help string has changed' - - - name: assignment.cache_time - type: integer - default: ~ - help: 'Assignment specific cache time-to-live (TTL) in seconds.' - comment: 'Default value has changed' - - - name: oauth1.access_token_duration - type: integer - default: 86400 - help: 'The Identity service may include expire attributes. If no such attribute is included, then the token lasts indefinitely. Specify how quickly the request token will expire (in seconds) Specify how quickly the access token will expire (in seconds)' - comment: 'Help string has changed' - - - name: signing.cert_subject - type: string - default: '/C=US/ST=Unset/L=Unset/O=Unset/CN=www.example.com' - comment: 'Default value has changed' - - - name: notification_driver - type: string - default: 'keystone.openstack.common.notifier.rpc_notifier' - help: 'notification_driver can be defined multiple times Do nothing driver (the default) notification_driver = keystone.openstack.common.notifier.no_op_notifier Logging driver example (not enabled by default) notification_driver = keystone.openstack.common.notifier.log_notifier RPC driver example (not enabled by default)' - comment: 'New param' - - - name: notification_topics - type: string - default: 'notifications' - help: 'AMQP topics to publish to when using the RPC notification driver. Multiple values can be specified by separating with commas. The actual topic names will be %s.%(default_notification_level)s' - comment: 'New param' - - - name: allowed_rpc_exception_modules - type: string - default: 'keystone.openstack.common.exception,nova.exception,cinder.exception,exceptions' - help: 'Modules of exceptions that are permitted to be recreated upon receiving exception data from an rpc call.' - comment: 'New param' - - - name: cache.expiration_time - type: integer - default: 600 - help: "Default TTL, in seconds, for any cached item in the dogpile.cache region. This applies to any cached method that doesn't have an explicit cache expiration time defined for it." - comment: 'New param' - -# ==================================================== diff --git a/rubick/schemas/neutron_dhcp_agent/2013.2.1.yml b/rubick/schemas/neutron_dhcp_agent/2013.2.1.yml deleted file mode 100644 index 788ba61..0000000 --- a/rubick/schemas/neutron_dhcp_agent/2013.2.1.yml +++ /dev/null @@ -1,84 +0,0 @@ -project: neutron_dhcp_agent -version: '2013.2.1' -parameters: - - - name: debug - type: string - default: 'False' - help: 'Show debugging output in log (sets DEBUG log level output)' - - - name: resync_interval - type: string - default: '5' - help: 'The DHCP agent will resync its state with Neutron to recover from any transient notification or rpc errors. The interval is number of seconds between attempts.' - - - name: interface_driver - type: string - default: 'neutron.agent.linux.interface.BridgeInterfaceDriver' - help: 'Example of interface_driver option for LinuxBridge' - - - name: ovs_use_veth - type: string - default: 'False' - help: 'Use veth for an OVS interface or not. Support kernels with limited namespace support (e.g. RHEL 6.5) so long as ovs_use_veth is set to True.' - - - name: dhcp_driver - type: string - default: 'neutron.agent.linux.dhcp.Dnsmasq' - help: 'The agent can use other DHCP drivers. Dnsmasq is the simplest and requires no additional setup of the DHCP server.' - - - name: use_namespaces - type: string - default: 'True' - help: 'Allow overlapping IP (Must have kernel build with CONFIG_NET_NS=y and iproute2 package that supports namespaces).' - - - name: enable_isolated_metadata - type: string - default: 'False' - help: 'The DHCP server can assist with providing metadata support on isolated networks. Setting this value to True will cause the DHCP server to append specific host routes to the DHCP request. The metadata service will only be activated when the subnet gateway_ip is None. The guest instance must be configured to request host routes via DHCP (Option 121).' - - - name: enable_metadata_network - type: string - default: 'False' - help: 'Allows for serving metadata requests coming from a dedicated metadata access network whose cidr is 169.254.169.254/16 (or larger prefix), and is connected to a Neutron router from which the VMs send metadata request. In this case DHCP Option 121 will not be injected in VMs, as they will be able to reach 169.254.169.254 through a router. This option requires enable_isolated_metadata = True' - - - name: num_sync_threads - type: string - default: '4' - help: 'Number of threads to use during sync process. Should not exceed connection pool size configured on server.' - - - name: dhcp_confs - type: string - default: '$state_path/dhcp' - help: 'Location to store DHCP server config files' - - - name: dhcp_domain - type: string - default: 'openstacklocal' - help: 'Domain to use for building the hostnames' - - - name: dnsmasq_config_file - type: string - default: '' - help: 'Override the default dnsmasq settings with this file' - - - name: dnsmasq_dns_server - type: string - default: '' - help: 'Use another DNS server before any in /etc/resolv.conf.' - - - name: dnsmasq_lease_max - type: string - default: '16777216' - help: 'Limit number of leases to prevent a denial-of-service.' - - - name: dhcp_lease_relay_socket - type: string - default: '$state_path/dhcp/lease_relay' - help: 'Location to DHCP lease relay UNIX domain socket' - - - name: metadata_proxy_socket - type: string - default: '$state_path/metadata_proxy' - help: 'Location of Metadata Proxy UNIX domain socket' - diff --git a/rubick/schemas/neutron_dhcp_agent/neutron_dhcp_agent.conf.yml b/rubick/schemas/neutron_dhcp_agent/neutron_dhcp_agent.conf.yml deleted file mode 100644 index ac6568c..0000000 --- a/rubick/schemas/neutron_dhcp_agent/neutron_dhcp_agent.conf.yml +++ /dev/null @@ -1,101 +0,0 @@ -- version: '2013.2.1' - checkpoint: true - added: - - - name: debug - type: string - default: 'False' - help: 'Show debugging output in log (sets DEBUG log level output)' - comment: 'New param' - - - name: resync_interval - type: string - default: '5' - help: 'The DHCP agent will resync its state with Neutron to recover from any transient notification or rpc errors. The interval is number of seconds between attempts.' - comment: 'New param' - - - name: interface_driver - type: string - default: 'neutron.agent.linux.interface.BridgeInterfaceDriver' - help: 'Example of interface_driver option for LinuxBridge' - comment: 'New param' - - - name: ovs_use_veth - type: string - default: 'False' - help: 'Use veth for an OVS interface or not. Support kernels with limited namespace support (e.g. RHEL 6.5) so long as ovs_use_veth is set to True.' - comment: 'New param' - - - name: dhcp_driver - type: string - default: 'neutron.agent.linux.dhcp.Dnsmasq' - help: 'The agent can use other DHCP drivers. Dnsmasq is the simplest and requires no additional setup of the DHCP server.' - comment: 'New param' - - - name: use_namespaces - type: string - default: 'True' - help: 'Allow overlapping IP (Must have kernel build with CONFIG_NET_NS=y and iproute2 package that supports namespaces).' - comment: 'New param' - - - name: enable_isolated_metadata - type: string - default: 'False' - help: 'The DHCP server can assist with providing metadata support on isolated networks. Setting this value to True will cause the DHCP server to append specific host routes to the DHCP request. The metadata service will only be activated when the subnet gateway_ip is None. The guest instance must be configured to request host routes via DHCP (Option 121).' - comment: 'New param' - - - name: enable_metadata_network - type: string - default: 'False' - help: 'Allows for serving metadata requests coming from a dedicated metadata access network whose cidr is 169.254.169.254/16 (or larger prefix), and is connected to a Neutron router from which the VMs send metadata request. In this case DHCP Option 121 will not be injected in VMs, as they will be able to reach 169.254.169.254 through a router. This option requires enable_isolated_metadata = True' - comment: 'New param' - - - name: num_sync_threads - type: string - default: '4' - help: 'Number of threads to use during sync process. Should not exceed connection pool size configured on server.' - comment: 'New param' - - - name: dhcp_confs - type: string - default: '$state_path/dhcp' - help: 'Location to store DHCP server config files' - comment: 'New param' - - - name: dhcp_domain - type: string - default: 'openstacklocal' - help: 'Domain to use for building the hostnames' - comment: 'New param' - - - name: dnsmasq_config_file - type: string - default: '' - help: 'Override the default dnsmasq settings with this file' - comment: 'New param' - - - name: dnsmasq_dns_server - type: string - default: '' - help: 'Use another DNS server before any in /etc/resolv.conf.' - comment: 'New param' - - - name: dnsmasq_lease_max - type: string - default: '16777216' - help: 'Limit number of leases to prevent a denial-of-service.' - comment: 'New param' - - - name: dhcp_lease_relay_socket - type: string - default: '$state_path/dhcp/lease_relay' - help: 'Location to DHCP lease relay UNIX domain socket' - comment: 'New param' - - - name: metadata_proxy_socket - type: string - default: '$state_path/metadata_proxy' - help: 'Location of Metadata Proxy UNIX domain socket' - comment: 'New param' - -# ==================================================== diff --git a/rubick/schemas/neutron_l3_agent/2013.2.1.yml b/rubick/schemas/neutron_l3_agent/2013.2.1.yml deleted file mode 100644 index 09e5307..0000000 --- a/rubick/schemas/neutron_l3_agent/2013.2.1.yml +++ /dev/null @@ -1,74 +0,0 @@ -project: neutron_l3_agent -version: '2013.2.1' -parameters: - - - name: debug - type: string - default: 'False' - help: 'Show debugging output in log (sets DEBUG log level output)' - - - name: interface_driver - type: string - default: 'neutron.agent.linux.interface.BridgeInterfaceDriver' - help: 'Example of interface_driver option for LinuxBridge' - - - name: ovs_use_veth - type: string - default: 'False' - help: 'Use veth for an OVS interface or not. Support kernels with limited namespace support (e.g. RHEL 6.5) so long as ovs_use_veth is set to True.' - - - name: use_namespaces - type: string - default: 'True' - help: 'Allow overlapping IP (Must have kernel build with CONFIG_NET_NS=y and iproute2 package that supports namespaces).' - - - name: router_id - type: string - default: '' - help: 'This is done by setting the specific router_id.' - - - name: gateway_external_network_id - type: string - default: '' - help: 'Each L3 agent can be associated with at most one external network. This value should be set to the UUID of that external network. If empty, the agent will enforce that only a single external networks exists and use that external network id' - - - name: handle_internal_only_routers - type: string - default: 'True' - help: 'Indicates that this L3 agent should also handle routers that do not have an external network gateway configured. This option should be True only for a single agent in a Neutron deployment, and may be False for all agents if all routers must have an external network gateway' - - - name: external_network_bridge - type: string - default: 'br-ex' - help: 'Name of bridge used for external network traffic. This should be set to empty value for the linux bridge' - - - name: metadata_port - type: string - default: '9697' - help: 'TCP Port used by Neutron metadata server' - - - name: send_arp_for_ha - type: string - default: '3' - help: 'Send this many gratuitous ARPs for HA setup. Set it below or equal to 0 to disable this feature.' - - - name: periodic_interval - type: string - default: '40' - help: "seconds between re-sync routers' data if needed" - - - name: periodic_fuzzy_delay - type: string - default: '5' - help: "seconds to start to sync routers' data after starting agent" - - - name: enable_metadata_proxy - type: string - default: 'True' - help: 'enable_metadata_proxy, which is true by default, can be set to False if the Nova metadata server is not available' - - - name: metadata_proxy_socket - type: string - default: '$state_path/metadata_proxy' - help: 'Location of Metadata Proxy UNIX domain socket' - diff --git a/rubick/schemas/neutron_l3_agent/neutron_l3_agent.conf.yml b/rubick/schemas/neutron_l3_agent/neutron_l3_agent.conf.yml deleted file mode 100644 index 5649372..0000000 --- a/rubick/schemas/neutron_l3_agent/neutron_l3_agent.conf.yml +++ /dev/null @@ -1,89 +0,0 @@ -- version: '2013.2.1' - checkpoint: true - added: - - - name: debug - type: string - default: 'False' - help: 'Show debugging output in log (sets DEBUG log level output)' - comment: 'New param' - - - name: interface_driver - type: string - default: 'neutron.agent.linux.interface.BridgeInterfaceDriver' - help: 'Example of interface_driver option for LinuxBridge' - comment: 'New param' - - - name: ovs_use_veth - type: string - default: 'False' - help: 'Use veth for an OVS interface or not. Support kernels with limited namespace support (e.g. RHEL 6.5) so long as ovs_use_veth is set to True.' - comment: 'New param' - - - name: use_namespaces - type: string - default: 'True' - help: 'Allow overlapping IP (Must have kernel build with CONFIG_NET_NS=y and iproute2 package that supports namespaces).' - comment: 'New param' - - - name: router_id - type: string - default: '' - help: 'This is done by setting the specific router_id.' - comment: 'New param' - - - name: gateway_external_network_id - type: string - default: '' - help: 'Each L3 agent can be associated with at most one external network. This value should be set to the UUID of that external network. If empty, the agent will enforce that only a single external networks exists and use that external network id' - comment: 'New param' - - - name: handle_internal_only_routers - type: string - default: 'True' - help: 'Indicates that this L3 agent should also handle routers that do not have an external network gateway configured. This option should be True only for a single agent in a Neutron deployment, and may be False for all agents if all routers must have an external network gateway' - comment: 'New param' - - - name: external_network_bridge - type: string - default: 'br-ex' - help: 'Name of bridge used for external network traffic. This should be set to empty value for the linux bridge' - comment: 'New param' - - - name: metadata_port - type: string - default: '9697' - help: 'TCP Port used by Neutron metadata server' - comment: 'New param' - - - name: send_arp_for_ha - type: string - default: '3' - help: 'Send this many gratuitous ARPs for HA setup. Set it below or equal to 0 to disable this feature.' - comment: 'New param' - - - name: periodic_interval - type: string - default: '40' - help: "seconds between re-sync routers' data if needed" - comment: 'New param' - - - name: periodic_fuzzy_delay - type: string - default: '5' - help: "seconds to start to sync routers' data after starting agent" - comment: 'New param' - - - name: enable_metadata_proxy - type: string - default: 'True' - help: 'enable_metadata_proxy, which is true by default, can be set to False if the Nova metadata server is not available' - comment: 'New param' - - - name: metadata_proxy_socket - type: string - default: '$state_path/metadata_proxy' - help: 'Location of Metadata Proxy UNIX domain socket' - comment: 'New param' - -# ==================================================== diff --git a/rubick/schemas/neutron_metadata_agent/2013.2.1.yml b/rubick/schemas/neutron_metadata_agent/2013.2.1.yml deleted file mode 100644 index 1c255a0..0000000 --- a/rubick/schemas/neutron_metadata_agent/2013.2.1.yml +++ /dev/null @@ -1,59 +0,0 @@ -project: neutron_metadata_agent -version: '2013.2.1' -parameters: - - - name: debug - type: string - default: 'True' - help: 'Show debugging output in log (sets DEBUG log level output)' - - - name: auth_url - type: string - default: 'http://localhost:5000/v2.0' - help: 'The Neutron user information for accessing the Neutron API.' - - - name: auth_region - type: string - default: 'RegionOne' - help: 'The Neutron user information for accessing the Neutron API.' - - - name: admin_tenant_name - type: string - default: '%SERVICE_TENANT_NAME%' - help: 'The Neutron user information for accessing the Neutron API.' - - - name: admin_user - type: string - default: '%SERVICE_USER%' - help: 'The Neutron user information for accessing the Neutron API.' - - - name: admin_password - type: string - default: '%SERVICE_PASSWORD%' - help: 'The Neutron user information for accessing the Neutron API.' - - - name: endpoint_type - type: string - default: 'adminURL' - help: 'Network service endpoint type to pull from the keystone catalog' - - - name: nova_metadata_ip - type: string - default: '127.0.0.1' - help: 'IP address used by Nova metadata server' - - - name: nova_metadata_port - type: string - default: '8775' - help: 'TCP Port used by Nova metadata server' - - - name: metadata_proxy_shared_secret - type: string - default: '' - help: 'When proxying metadata requests, Neutron signs the Instance-ID header with a shared secret to prevent spoofing. You may select any string for a secret, but it must match here and in the configuration used by the Nova Metadata Server. NOTE: Nova uses a different key: neutron_metadata_proxy_shared_secret' - - - name: metadata_proxy_socket - type: string - default: '$state_path/metadata_proxy' - help: 'Location of Metadata Proxy UNIX domain socket' - diff --git a/rubick/schemas/neutron_metadata_agent/neutron_metadata_agent.conf.yml b/rubick/schemas/neutron_metadata_agent/neutron_metadata_agent.conf.yml deleted file mode 100644 index 6a708d0..0000000 --- a/rubick/schemas/neutron_metadata_agent/neutron_metadata_agent.conf.yml +++ /dev/null @@ -1,71 +0,0 @@ -- version: '2013.2.1' - checkpoint: true - added: - - - name: debug - type: string - default: 'True' - help: 'Show debugging output in log (sets DEBUG log level output)' - comment: 'New param' - - - name: auth_url - type: string - default: 'http://localhost:5000/v2.0' - help: 'The Neutron user information for accessing the Neutron API.' - comment: 'New param' - - - name: auth_region - type: string - default: 'RegionOne' - help: 'The Neutron user information for accessing the Neutron API.' - comment: 'New param' - - - name: admin_tenant_name - type: string - default: '%SERVICE_TENANT_NAME%' - help: 'The Neutron user information for accessing the Neutron API.' - comment: 'New param' - - - name: admin_user - type: string - default: '%SERVICE_USER%' - help: 'The Neutron user information for accessing the Neutron API.' - comment: 'New param' - - - name: admin_password - type: string - default: '%SERVICE_PASSWORD%' - help: 'The Neutron user information for accessing the Neutron API.' - comment: 'New param' - - - name: endpoint_type - type: string - default: 'adminURL' - help: 'Network service endpoint type to pull from the keystone catalog' - comment: 'New param' - - - name: nova_metadata_ip - type: string - default: '127.0.0.1' - help: 'IP address used by Nova metadata server' - comment: 'New param' - - - name: nova_metadata_port - type: string - default: '8775' - help: 'TCP Port used by Nova metadata server' - comment: 'New param' - - - name: metadata_proxy_shared_secret - type: string - default: '' - help: 'When proxying metadata requests, Neutron signs the Instance-ID header with a shared secret to prevent spoofing. You may select any string for a secret, but it must match here and in the configuration used by the Nova Metadata Server. NOTE: Nova uses a different key: neutron_metadata_proxy_shared_secret' - comment: 'New param' - - - name: metadata_proxy_socket - type: string - default: '$state_path/metadata_proxy' - help: 'Location of Metadata Proxy UNIX domain socket' - comment: 'New param' - -# ==================================================== diff --git a/rubick/schemas/neutron_openvswitch_agent/2013.2.1.yml b/rubick/schemas/neutron_openvswitch_agent/2013.2.1.yml deleted file mode 100644 index 2fe7dcf..0000000 --- a/rubick/schemas/neutron_openvswitch_agent/2013.2.1.yml +++ /dev/null @@ -1,38 +0,0 @@ -project: neutron_openvswitch_agent -version: '2013.2.1' -parameters: - - - name: ml2.type_drivers - type: string - default: 'local,flat,vlan,gre,vxlan' - - - name: ml2.tenant_network_types - type: string - default: 'local' - - - name: ml2.mechanism_drivers - type: string - default: '' - help: '(ListOpt) Ordered list of networking mechanism driver entrypoints to be loaded from the neutron.ml2.mechanism_drivers namespace.' - - - name: ml2_type_flat.flat_networks - type: string - default: '' - - - name: ml2_type_vlan.network_vlan_ranges - type: string - default: '' - - - name: ml2_type_gre.tunnel_id_ranges - type: string - default: '' - help: '(ListOpt) Comma-separated list of : tuples enumerating ranges of GRE tunnel IDs that are available for tenant network allocation' - - - name: ml2_type_vxlan.vni_ranges - type: string - default: '' - - - name: ml2_type_vxlan.vxlan_group - type: string - default: '' - diff --git a/rubick/schemas/neutron_openvswitch_agent/neutron_openvswitch_agent.conf.yml b/rubick/schemas/neutron_openvswitch_agent/neutron_openvswitch_agent.conf.yml deleted file mode 100644 index 66fb0b3..0000000 --- a/rubick/schemas/neutron_openvswitch_agent/neutron_openvswitch_agent.conf.yml +++ /dev/null @@ -1,47 +0,0 @@ -- version: '2013.2.1' - checkpoint: true - added: - - - name: ml2.type_drivers - type: string - default: 'local,flat,vlan,gre,vxlan' - comment: 'New param' - - - name: ml2.tenant_network_types - type: string - default: 'local' - comment: 'New param' - - - name: ml2.mechanism_drivers - type: string - default: '' - help: '(ListOpt) Ordered list of networking mechanism driver entrypoints to be loaded from the neutron.ml2.mechanism_drivers namespace.' - comment: 'New param' - - - name: ml2_type_flat.flat_networks - type: string - default: '' - comment: 'New param' - - - name: ml2_type_vlan.network_vlan_ranges - type: string - default: '' - comment: 'New param' - - - name: ml2_type_gre.tunnel_id_ranges - type: string - default: '' - help: '(ListOpt) Comma-separated list of : tuples enumerating ranges of GRE tunnel IDs that are available for tenant network allocation' - comment: 'New param' - - - name: ml2_type_vxlan.vni_ranges - type: string - default: '' - comment: 'New param' - - - name: ml2_type_vxlan.vxlan_group - type: string - default: '' - comment: 'New param' - -# ==================================================== diff --git a/rubick/schemas/neutron_server/2013.2.1.yml b/rubick/schemas/neutron_server/2013.2.1.yml deleted file mode 100644 index 32736e7..0000000 --- a/rubick/schemas/neutron_server/2013.2.1.yml +++ /dev/null @@ -1,526 +0,0 @@ -project: neutron_server -version: '2013.2.1' -parameters: - - - name: verbose - type: string - default: 'False' - help: 'Default log level is INFO verbose and debug has the same result. One of them will set DEBUG log level output' - - - name: state_path - type: string - default: '/var/lib/neutron' - help: 'Where to store Neutron state files. This directory must be writable by the user executing the agent.' - - - name: lock_path - type: string - default: '$state_path/lock' - help: 'Where to store lock files' - - - name: log_format - type: string - default: '%(asctime)s %(levelname)8s [%(name)s] %(message)s' - - - name: log_date_format - type: string - default: '%Y-%m-%d %H:%M:%S' - - - name: use_syslog - type: string - default: 'False' - - - name: syslog_log_facility - type: string - default: 'LOG_USER' - - - name: use_stderr - type: string - default: 'True' - - - name: publish_errors - type: string - default: 'False' - - - name: bind_host - type: host - default: '0.0.0.0' - help: 'Address to bind the API server' - - - name: bind_port - type: string - default: '9696' - help: 'Port the bind the API server to' - - - name: api_extensions_path - type: string - default: '' - help: "Path to the extensions. Note that this can be a colon-separated list of paths. For example: api_extensions_path = extensions:/path/to/more/extensions:/even/more/extensions The __path__ of neutron.extensions is appended to this, so if your extensions are in there you don't need to specify them here" - - - name: core_plugin - type: string - default: '' - help: 'Neutron plugin provider module' - - - name: service_plugins - type: string - default: '' - help: 'Advanced service modules' - - - name: api_paste_config - type: string - default: 'api-paste.ini' - help: 'Paste configuration file' - - - name: auth_strategy - type: string - default: 'keystone' - help: "The strategy to be used for auth. Supported values are 'keystone'(default), 'noauth'." - - - name: mac_generation_retries - type: string - default: '16' - help: 'Maximum amount of retries to generate a unique MAC address' - - - name: dhcp_lease_duration - type: string - default: '86400' - help: 'DHCP Lease duration (in seconds)' - - - name: dhcp_agent_notification - type: string - default: 'True' - help: 'Allow sending resource operation notification to DHCP agent' - - - name: allow_bulk - type: string - default: 'True' - help: 'Enable or disable bulk create/update/delete operations' - - - name: allow_pagination - type: string - default: 'False' - help: 'Enable or disable bulk create/update/delete operations Enable or disable pagination' - - - name: allow_sorting - type: string - default: 'False' - help: 'Enable or disable bulk create/update/delete operations Enable or disable pagination Enable or disable sorting' - - - name: allow_overlapping_ips - type: string - default: 'False' - help: 'Enable or disable bulk create/update/delete operations Enable or disable pagination Enable or disable sorting Enable or disable overlapping IPs for subnets Attention: the following parameter MUST be set to False if Neutron is being used in conjunction with nova security groups' - - - name: force_gateway_on_subnet - type: string - default: 'False' - help: 'Enable or disable bulk create/update/delete operations Enable or disable pagination Enable or disable sorting Enable or disable overlapping IPs for subnets Attention: the following parameter MUST be set to False if Neutron is being used in conjunction with nova security groups Ensure that configured gateway is on subnet' - - - name: rpc_backend - type: string - default: 'neutron.openstack.common.rpc.impl_zmq' - help: 'ZMQ' - - - name: rpc_thread_pool_size - type: string - default: '64' - help: 'RPC configuration options. Defined in rpc __init__ The messaging module to use, defaults to kombu. Size of RPC thread pool' - - - name: rpc_conn_pool_size - type: string - default: '30' - help: 'RPC configuration options. Defined in rpc __init__ The messaging module to use, defaults to kombu. Size of RPC thread pool Size of RPC connection pool' - - - name: rpc_response_timeout - type: string - default: '60' - help: 'RPC configuration options. Defined in rpc __init__ The messaging module to use, defaults to kombu. Size of RPC thread pool Size of RPC connection pool Seconds to wait for a response from call or multicall' - - - name: rpc_cast_timeout - type: string - default: '30' - help: 'RPC configuration options. Defined in rpc __init__ The messaging module to use, defaults to kombu. Size of RPC thread pool Size of RPC connection pool Seconds to wait for a response from call or multicall Seconds to wait before a cast expires (TTL). Only supported by impl_zmq.' - - - name: allowed_rpc_exception_modules - type: string - default: 'neutron.openstack.common.exception, nova.exception' - help: 'RPC configuration options. Defined in rpc __init__ The messaging module to use, defaults to kombu. Size of RPC thread pool Size of RPC connection pool Seconds to wait for a response from call or multicall Seconds to wait before a cast expires (TTL). Only supported by impl_zmq. Modules of exceptions that are permitted to be recreated upon receiving exception data from an rpc call.' - - - name: control_exchange - type: string - default: 'neutron' - help: 'RPC configuration options. Defined in rpc __init__ The messaging module to use, defaults to kombu. Size of RPC thread pool Size of RPC connection pool Seconds to wait for a response from call or multicall Seconds to wait before a cast expires (TTL). Only supported by impl_zmq. Modules of exceptions that are permitted to be recreated upon receiving exception data from an rpc call. AMQP exchange to connect to if using RabbitMQ or QPID' - - - name: fake_rabbit - type: string - default: 'False' - help: 'If passed, use a fake RabbitMQ provider' - - - name: kombu_ssl_version - type: string - default: '' - help: 'Configuration options if sending notifications via kombu rpc (these are the defaults) SSL version to use (valid only if SSL enabled)' - - - name: kombu_ssl_keyfile - type: string - default: '' - help: 'Configuration options if sending notifications via kombu rpc (these are the defaults) SSL version to use (valid only if SSL enabled) SSL key file (valid only if SSL enabled)' - - - name: kombu_ssl_certfile - type: string - default: '' - help: 'Configuration options if sending notifications via kombu rpc (these are the defaults) SSL version to use (valid only if SSL enabled) SSL key file (valid only if SSL enabled) SSL cert file (valid only if SSL enabled)' - - - name: kombu_ssl_ca_certs - type: string - default: '' - help: "Configuration options if sending notifications via kombu rpc (these are the defaults) SSL version to use (valid only if SSL enabled) SSL key file (valid only if SSL enabled) SSL cert file (valid only if SSL enabled) SSL certification authority file (valid only if SSL enabled)'" - - - name: rabbit_host - type: host - default: 'localhost' - help: "Configuration options if sending notifications via kombu rpc (these are the defaults) SSL version to use (valid only if SSL enabled) SSL key file (valid only if SSL enabled) SSL cert file (valid only if SSL enabled) SSL certification authority file (valid only if SSL enabled)' IP address of the RabbitMQ installation" - - - name: rabbit_password - type: string - default: 'guest' - help: "Configuration options if sending notifications via kombu rpc (these are the defaults) SSL version to use (valid only if SSL enabled) SSL key file (valid only if SSL enabled) SSL cert file (valid only if SSL enabled) SSL certification authority file (valid only if SSL enabled)' IP address of the RabbitMQ installation Password of the RabbitMQ server" - - - name: rabbit_port - type: string - default: '5672' - help: "Configuration options if sending notifications via kombu rpc (these are the defaults) SSL version to use (valid only if SSL enabled) SSL key file (valid only if SSL enabled) SSL cert file (valid only if SSL enabled) SSL certification authority file (valid only if SSL enabled)' IP address of the RabbitMQ installation Password of the RabbitMQ server Port where RabbitMQ server is running/listening" - - - name: rabbit_hosts - type: string - default: 'localhost:5672' - help: "Configuration options if sending notifications via kombu rpc (these are the defaults) SSL version to use (valid only if SSL enabled) SSL key file (valid only if SSL enabled) SSL cert file (valid only if SSL enabled) SSL certification authority file (valid only if SSL enabled)' IP address of the RabbitMQ installation Password of the RabbitMQ server Port where RabbitMQ server is running/listening RabbitMQ single or HA cluster (host:port pairs i.e: host1:5672, host2:5672) rabbit_hosts is defaulted to '$rabbit_host:$rabbit_port'" - - - name: rabbit_userid - type: string - default: 'guest' - help: "Configuration options if sending notifications via kombu rpc (these are the defaults) SSL version to use (valid only if SSL enabled) SSL key file (valid only if SSL enabled) SSL cert file (valid only if SSL enabled) SSL certification authority file (valid only if SSL enabled)' IP address of the RabbitMQ installation Password of the RabbitMQ server Port where RabbitMQ server is running/listening RabbitMQ single or HA cluster (host:port pairs i.e: host1:5672, host2:5672) rabbit_hosts is defaulted to '$rabbit_host:$rabbit_port' User ID used for RabbitMQ connections" - - - name: rabbit_virtual_host - type: string - default: '/' - help: "Configuration options if sending notifications via kombu rpc (these are the defaults) SSL version to use (valid only if SSL enabled) SSL key file (valid only if SSL enabled) SSL cert file (valid only if SSL enabled) SSL certification authority file (valid only if SSL enabled)' IP address of the RabbitMQ installation Password of the RabbitMQ server Port where RabbitMQ server is running/listening RabbitMQ single or HA cluster (host:port pairs i.e: host1:5672, host2:5672) rabbit_hosts is defaulted to '$rabbit_host:$rabbit_port' User ID used for RabbitMQ connections Location of a virtual RabbitMQ installation." - - - name: rabbit_max_retries - type: string - default: '0' - help: "Configuration options if sending notifications via kombu rpc (these are the defaults) SSL version to use (valid only if SSL enabled) SSL key file (valid only if SSL enabled) SSL cert file (valid only if SSL enabled) SSL certification authority file (valid only if SSL enabled)' IP address of the RabbitMQ installation Password of the RabbitMQ server Port where RabbitMQ server is running/listening RabbitMQ single or HA cluster (host:port pairs i.e: host1:5672, host2:5672) rabbit_hosts is defaulted to '$rabbit_host:$rabbit_port' User ID used for RabbitMQ connections Location of a virtual RabbitMQ installation. Maximum retries with trying to connect to RabbitMQ (the default of 0 implies an infinite retry count)" - - - name: rabbit_retry_interval - type: string - default: '1' - help: "Configuration options if sending notifications via kombu rpc (these are the defaults) SSL version to use (valid only if SSL enabled) SSL key file (valid only if SSL enabled) SSL cert file (valid only if SSL enabled) SSL certification authority file (valid only if SSL enabled)' IP address of the RabbitMQ installation Password of the RabbitMQ server Port where RabbitMQ server is running/listening RabbitMQ single or HA cluster (host:port pairs i.e: host1:5672, host2:5672) rabbit_hosts is defaulted to '$rabbit_host:$rabbit_port' User ID used for RabbitMQ connections Location of a virtual RabbitMQ installation. Maximum retries with trying to connect to RabbitMQ (the default of 0 implies an infinite retry count) RabbitMQ connection retry interval" - - - name: rabbit_ha_queues - type: boolean - default: False - help: "Configuration options if sending notifications via kombu rpc (these are the defaults) SSL version to use (valid only if SSL enabled) SSL key file (valid only if SSL enabled) SSL cert file (valid only if SSL enabled) SSL certification authority file (valid only if SSL enabled)' IP address of the RabbitMQ installation Password of the RabbitMQ server Port where RabbitMQ server is running/listening RabbitMQ single or HA cluster (host:port pairs i.e: host1:5672, host2:5672) rabbit_hosts is defaulted to '$rabbit_host:$rabbit_port' User ID used for RabbitMQ connections Location of a virtual RabbitMQ installation. Maximum retries with trying to connect to RabbitMQ (the default of 0 implies an infinite retry count) RabbitMQ connection retry interval Use HA queues in RabbitMQ (x-ha-policy: all).You need to wipe RabbitMQ database when changing this option. " - - - name: qpid_hostname - type: string - default: 'localhost' - help: 'QPID Qpid broker hostname' - - - name: qpid_port - type: string - default: '5672' - help: 'QPID Qpid broker hostname Qpid broker port' - - - name: qpid_hosts - type: string - default: 'localhost:5672' - help: "QPID Qpid broker hostname Qpid broker port Qpid single or HA cluster (host:port pairs i.e: host1:5672, host2:5672) qpid_hosts is defaulted to '$qpid_hostname:$qpid_port'" - - - name: qpid_username - type: string - default: "''" - help: "QPID Qpid broker hostname Qpid broker port Qpid single or HA cluster (host:port pairs i.e: host1:5672, host2:5672) qpid_hosts is defaulted to '$qpid_hostname:$qpid_port' Username for qpid connection" - - - name: qpid_password - type: string - default: "''" - help: "QPID Qpid broker hostname Qpid broker port Qpid single or HA cluster (host:port pairs i.e: host1:5672, host2:5672) qpid_hosts is defaulted to '$qpid_hostname:$qpid_port' Username for qpid connection Password for qpid connection" - - - name: qpid_sasl_mechanisms - type: string - default: "''" - help: "QPID Qpid broker hostname Qpid broker port Qpid single or HA cluster (host:port pairs i.e: host1:5672, host2:5672) qpid_hosts is defaulted to '$qpid_hostname:$qpid_port' Username for qpid connection Password for qpid connection Space separated list of SASL mechanisms to use for auth" - - - name: qpid_heartbeat - type: string - default: '60' - help: "QPID Qpid broker hostname Qpid broker port Qpid single or HA cluster (host:port pairs i.e: host1:5672, host2:5672) qpid_hosts is defaulted to '$qpid_hostname:$qpid_port' Username for qpid connection Password for qpid connection Space separated list of SASL mechanisms to use for auth Seconds between connection keepalive heartbeats" - - - name: qpid_protocol - type: string - default: 'tcp' - help: "QPID Qpid broker hostname Qpid broker port Qpid single or HA cluster (host:port pairs i.e: host1:5672, host2:5672) qpid_hosts is defaulted to '$qpid_hostname:$qpid_port' Username for qpid connection Password for qpid connection Space separated list of SASL mechanisms to use for auth Seconds between connection keepalive heartbeats Transport to use, either 'tcp' or 'ssl'" - - - name: qpid_tcp_nodelay - type: string - default: 'True' - help: "QPID Qpid broker hostname Qpid broker port Qpid single or HA cluster (host:port pairs i.e: host1:5672, host2:5672) qpid_hosts is defaulted to '$qpid_hostname:$qpid_port' Username for qpid connection Password for qpid connection Space separated list of SASL mechanisms to use for auth Seconds between connection keepalive heartbeats Transport to use, either 'tcp' or 'ssl' Disable Nagle algorithm" - - - name: rpc_zmq_bind_address - type: string - default: '*' - help: "ZMQ ZeroMQ bind address. Should be a wildcard (*), an ethernet interface, or IP. The 'host' option should point or resolve to this address." - - - name: notification_driver - type: string - default: 'neutron.openstack.common.notifier.rpc_notifier' - help: 'Notification_driver can be defined multiple times Do nothing driver notification_driver = neutron.openstack.common.notifier.no_op_notifier Logging driver notification_driver = neutron.openstack.common.notifier.log_notifier RPC driver. DHCP agents needs it.' - - - name: default_notification_level - type: string - default: 'INFO' - help: 'default_notification_level is used to form actual topic name(s) or to set logging level' - - - name: host - type: string - default: 'myhost.com' - help: 'default_publisher_id is a part of the notification payload' - - - name: default_publisher_id - type: string - default: '$host' - help: 'default_publisher_id is a part of the notification payload' - - - name: notification_topics - type: string - default: 'notifications' - help: 'Defined in rpc_notifier, can be comma separated values. The actual topic names will be %s.%(default_notification_level)s' - - - name: pagination_max_limit - type: string - default: '-1' - help: 'Default maximum number of items returned in a single response, value == infinite and value < 0 means no max limit, and value must greater than 0. If the number of items requested is greater than pagination_max_limit, server will just return pagination_max_limit of number of items.' - - - name: max_dns_nameservers - type: string - default: '5' - help: 'Maximum number of DNS nameservers per subnet' - - - name: max_subnet_host_routes - type: string - default: '20' - help: 'Maximum number of host routes per subnet' - - - name: max_fixed_ips_per_port - type: string - default: '5' - help: 'Maximum number of fixed ips per port' - - - name: agent_down_time - type: string - default: '5' - help: '=========== items for agent management extension ============= Seconds to regard the agent as down.' - - - name: network_scheduler_driver - type: string - default: 'neutron.scheduler.dhcp_agent_scheduler.ChanceScheduler' - help: '=========== items for agent scheduler extension ============= Driver to use for scheduling network to DHCP agent' - - - name: router_scheduler_driver - type: string - default: 'neutron.scheduler.l3_agent_scheduler.ChanceScheduler' - help: '=========== items for agent scheduler extension ============= Driver to use for scheduling network to DHCP agent Driver to use for scheduling router to a default L3 agent' - - - name: loadbalancer_pool_scheduler_driver - type: string - default: 'neutron.services.loadbalancer.agent_scheduler.ChanceScheduler' - help: '=========== items for agent scheduler extension ============= Driver to use for scheduling network to DHCP agent Driver to use for scheduling router to a default L3 agent Driver to use for scheduling a loadbalancer pool to an lbaas agent' - - - name: network_auto_schedule - type: string - default: 'True' - help: 'Allow auto scheduling networks to DHCP agent. It will schedule non-hosted networks to first DHCP agent which sends get_active_networks message to neutron server' - - - name: router_auto_schedule - type: string - default: 'True' - help: 'Allow auto scheduling routers to L3 agent. It will schedule non-hosted routers to first L3 agent which sends sync_routers message to neutron server' - - - name: dhcp_agents_per_network - type: string - default: '1' - help: 'Number of DHCP agents scheduled to host a network. This enables redundant DHCP agents for configured networks.' - - - name: tcp_keepidle - type: string - default: '600' - help: '=========== WSGI parameters related to the API server ============== Sets the value of TCP_KEEPIDLE in seconds to use for each server socket when starting API server. Not supported on OS X.' - - - name: retry_until_window - type: string - default: '30' - help: 'Number of seconds to keep retrying to listen' - - - name: backlog - type: string - default: '4096' - help: 'Number of backlog requests to configure the socket with.' - - - name: use_ssl - type: string - default: 'False' - help: 'Enable SSL on the API server' - - - name: ssl_cert_file - type: string - default: '/path/to/certfile' - help: 'Certificate file to use when starting API server securely' - - - name: ssl_key_file - type: string - default: '/path/to/keyfile' - help: 'Private key file to use when starting API server securely' - - - name: ssl_ca_file - type: string - default: '/path/to/cafile' - help: 'CA certificate file to use when starting API server securely to verify connecting clients. This is an optional parameter only required if API clients need to authenticate to the API server using SSL certificates signed by a trusted CA' - - - name: quotas.quota_items - type: string - default: 'network,subnet,port' - help: 'resource name(s) that are supported in quota features' - - - name: quotas.default_quota - type: string - default: '-1' - help: 'default number of resource allowed per tenant, minus for unlimited' - - - name: quotas.quota_network - type: string - default: '10' - help: 'number of networks allowed per tenant, and minus means unlimited' - - - name: quotas.quota_subnet - type: string - default: '10' - help: 'number of subnets allowed per tenant, and minus means unlimited' - - - name: quotas.quota_port - type: string - default: '50' - help: 'number of ports allowed per tenant, and minus means unlimited' - - - name: quotas.quota_security_group - type: string - default: '10' - help: 'number of security groups allowed per tenant, and minus means unlimited' - - - name: quotas.quota_security_group_rule - type: string - default: '100' - help: 'number of security group rules allowed per tenant, and minus means unlimited' - - - name: quotas.quota_driver - type: string - default: 'neutron.db.quota_db.DbQuotaDriver' - help: 'default driver to use for quota checks' - - - name: agent.root_helper - type: string - default: 'sudo' - help: "Use 'sudo neutron-rootwrap /etc/neutron/rootwrap.conf' to use the real root filter facility. Change to 'sudo' to skip the filtering and just run the comand directly" - - - name: agent.report_interval - type: string - default: '4' - help: '=========== items for agent management extension ============= seconds between nodes reporting state to server, should be less than agent_down_time' - - - name: keystone_authtoken.auth_host - type: host - default: '127.0.0.1' - - - name: keystone_authtoken.auth_port - type: string - default: '35357' - - - name: keystone_authtoken.auth_protocol - type: string - default: 'http' - - - name: keystone_authtoken.admin_tenant_name - type: string - default: '%SERVICE_TENANT_NAME%' - - - name: keystone_authtoken.admin_user - type: string - default: '%SERVICE_USER%' - - - name: keystone_authtoken.admin_password - type: string - default: '%SERVICE_PASSWORD%' - - - name: keystone_authtoken.signing_dir - type: string - default: '$state_path/keystone-signing' - - - name: database.connection - type: string - default: 'mysql://root:pass@127.0.0.1:3306/neutron' - help: 'This line MUST be changed to actually run the plugin. Example:' - - - name: database.slave_connection - type: string - default: '' - help: 'The SQLAlchemy connection string used to connect to the slave database' - - - name: database.max_retries - type: string - default: '10' - help: 'Database reconnection retry times - in event connectivity is lost set to -1 implies an infinite retry count' - - - name: database.retry_interval - type: string - default: '10' - help: 'Database reconnection interval in seconds - if the initial connection to the database fails' - - - name: database.min_pool_size - type: string - default: '1' - help: 'Minimum number of SQL connections to keep open in a pool' - - - name: database.max_pool_size - type: string - default: '10' - help: 'Maximum number of SQL connections to keep open in a pool' - - - name: database.idle_timeout - type: string - default: '3600' - help: 'Timeout in seconds before idle sql connections are reaped' - - - name: database.max_overflow - type: string - default: '20' - help: 'If set, use this value for max_overflow with sqlalchemy' - - - name: database.connection_debug - type: string - default: '0' - help: 'Verbosity of SQL debugging information. 0=None, 100=Everything' - - - name: database.connection_trace - type: string - default: 'False' - help: 'Add python stack traces to SQL as comment strings' - - - name: database.pool_timeout - type: string - default: '10' - help: 'If set, use this value for pool_timeout with sqlalchemy' - - - name: service_providers.service_provider - type: string - default: 'LOADBALANCER:Haproxy:neutron.services.loadbalancer.drivers.haproxy.plugin_driver.HaproxyOnHostPluginDriver:default' - help: 'Specify service providers (drivers) for advanced services like loadbalancer, VPN, Firewall. Must be in form: service_provider=::[:default] List of allowed service type include LOADBALANCER, FIREWALL, VPN Combination of and must be unique; must also be unique this is multiline option, example for default provider: service_provider=LOADBALANCER:name:lbaas_plugin_driver_path:default example of non-default provider: service_provider=FIREWALL:name2:firewall_driver_path --- Reference implementations ---' - diff --git a/rubick/schemas/neutron_server/neutron_server.conf.yml b/rubick/schemas/neutron_server/neutron_server.conf.yml deleted file mode 100644 index fd05738..0000000 --- a/rubick/schemas/neutron_server/neutron_server.conf.yml +++ /dev/null @@ -1,634 +0,0 @@ -- version: '2013.2.1' - checkpoint: true - added: - - - name: verbose - type: string - default: 'False' - help: 'Default log level is INFO verbose and debug has the same result. One of them will set DEBUG log level output' - comment: 'New param' - - - name: state_path - type: string - default: '/var/lib/neutron' - help: 'Where to store Neutron state files. This directory must be writable by the user executing the agent.' - comment: 'New param' - - - name: lock_path - type: string - default: '$state_path/lock' - help: 'Where to store lock files' - comment: 'New param' - - - name: log_format - type: string - default: '%(asctime)s %(levelname)8s [%(name)s] %(message)s' - comment: 'New param' - - - name: log_date_format - type: string - default: '%Y-%m-%d %H:%M:%S' - comment: 'New param' - - - name: use_syslog - type: string - default: 'False' - comment: 'New param' - - - name: syslog_log_facility - type: string - default: 'LOG_USER' - comment: 'New param' - - - name: use_stderr - type: string - default: 'True' - comment: 'New param' - - - name: publish_errors - type: string - default: 'False' - comment: 'New param' - - - name: bind_host - type: host - default: '0.0.0.0' - help: 'Address to bind the API server' - comment: 'New param' - - - name: bind_port - type: string - default: '9696' - help: 'Port the bind the API server to' - comment: 'New param' - - - name: api_extensions_path - type: string - default: '' - help: "Path to the extensions. Note that this can be a colon-separated list of paths. For example: api_extensions_path = extensions:/path/to/more/extensions:/even/more/extensions The __path__ of neutron.extensions is appended to this, so if your extensions are in there you don't need to specify them here" - comment: 'New param' - - - name: core_plugin - type: string - default: '' - help: 'Neutron plugin provider module' - comment: 'New param' - - - name: service_plugins - type: string - default: '' - help: 'Advanced service modules' - comment: 'New param' - - - name: api_paste_config - type: string - default: 'api-paste.ini' - help: 'Paste configuration file' - comment: 'New param' - - - name: auth_strategy - type: string - default: 'keystone' - help: "The strategy to be used for auth. Supported values are 'keystone'(default), 'noauth'." - comment: 'New param' - - - name: mac_generation_retries - type: string - default: '16' - help: 'Maximum amount of retries to generate a unique MAC address' - comment: 'New param' - - - name: dhcp_lease_duration - type: string - default: '86400' - help: 'DHCP Lease duration (in seconds)' - comment: 'New param' - - - name: dhcp_agent_notification - type: string - default: 'True' - help: 'Allow sending resource operation notification to DHCP agent' - comment: 'New param' - - - name: allow_bulk - type: string - default: 'True' - help: 'Enable or disable bulk create/update/delete operations' - comment: 'New param' - - - name: allow_pagination - type: string - default: 'False' - help: 'Enable or disable bulk create/update/delete operations Enable or disable pagination' - comment: 'New param' - - - name: allow_sorting - type: string - default: 'False' - help: 'Enable or disable bulk create/update/delete operations Enable or disable pagination Enable or disable sorting' - comment: 'New param' - - - name: allow_overlapping_ips - type: string - default: 'False' - help: 'Enable or disable bulk create/update/delete operations Enable or disable pagination Enable or disable sorting Enable or disable overlapping IPs for subnets Attention: the following parameter MUST be set to False if Neutron is being used in conjunction with nova security groups' - comment: 'New param' - - - name: force_gateway_on_subnet - type: string - default: 'False' - help: 'Enable or disable bulk create/update/delete operations Enable or disable pagination Enable or disable sorting Enable or disable overlapping IPs for subnets Attention: the following parameter MUST be set to False if Neutron is being used in conjunction with nova security groups Ensure that configured gateway is on subnet' - comment: 'New param' - - - name: rpc_backend - type: string - default: 'neutron.openstack.common.rpc.impl_zmq' - help: 'ZMQ' - comment: 'New param' - - - name: rpc_thread_pool_size - type: string - default: '64' - help: 'RPC configuration options. Defined in rpc __init__ The messaging module to use, defaults to kombu. Size of RPC thread pool' - comment: 'New param' - - - name: rpc_conn_pool_size - type: string - default: '30' - help: 'RPC configuration options. Defined in rpc __init__ The messaging module to use, defaults to kombu. Size of RPC thread pool Size of RPC connection pool' - comment: 'New param' - - - name: rpc_response_timeout - type: string - default: '60' - help: 'RPC configuration options. Defined in rpc __init__ The messaging module to use, defaults to kombu. Size of RPC thread pool Size of RPC connection pool Seconds to wait for a response from call or multicall' - comment: 'New param' - - - name: rpc_cast_timeout - type: string - default: '30' - help: 'RPC configuration options. Defined in rpc __init__ The messaging module to use, defaults to kombu. Size of RPC thread pool Size of RPC connection pool Seconds to wait for a response from call or multicall Seconds to wait before a cast expires (TTL). Only supported by impl_zmq.' - comment: 'New param' - - - name: allowed_rpc_exception_modules - type: string - default: 'neutron.openstack.common.exception, nova.exception' - help: 'RPC configuration options. Defined in rpc __init__ The messaging module to use, defaults to kombu. Size of RPC thread pool Size of RPC connection pool Seconds to wait for a response from call or multicall Seconds to wait before a cast expires (TTL). Only supported by impl_zmq. Modules of exceptions that are permitted to be recreated upon receiving exception data from an rpc call.' - comment: 'New param' - - - name: control_exchange - type: string - default: 'neutron' - help: 'RPC configuration options. Defined in rpc __init__ The messaging module to use, defaults to kombu. Size of RPC thread pool Size of RPC connection pool Seconds to wait for a response from call or multicall Seconds to wait before a cast expires (TTL). Only supported by impl_zmq. Modules of exceptions that are permitted to be recreated upon receiving exception data from an rpc call. AMQP exchange to connect to if using RabbitMQ or QPID' - comment: 'New param' - - - name: fake_rabbit - type: string - default: 'False' - help: 'If passed, use a fake RabbitMQ provider' - comment: 'New param' - - - name: kombu_ssl_version - type: string - default: '' - help: 'Configuration options if sending notifications via kombu rpc (these are the defaults) SSL version to use (valid only if SSL enabled)' - comment: 'New param' - - - name: kombu_ssl_keyfile - type: string - default: '' - help: 'Configuration options if sending notifications via kombu rpc (these are the defaults) SSL version to use (valid only if SSL enabled) SSL key file (valid only if SSL enabled)' - comment: 'New param' - - - name: kombu_ssl_certfile - type: string - default: '' - help: 'Configuration options if sending notifications via kombu rpc (these are the defaults) SSL version to use (valid only if SSL enabled) SSL key file (valid only if SSL enabled) SSL cert file (valid only if SSL enabled)' - comment: 'New param' - - - name: kombu_ssl_ca_certs - type: string - default: '' - help: "Configuration options if sending notifications via kombu rpc (these are the defaults) SSL version to use (valid only if SSL enabled) SSL key file (valid only if SSL enabled) SSL cert file (valid only if SSL enabled) SSL certification authority file (valid only if SSL enabled)'" - comment: 'New param' - - - name: rabbit_host - type: host - default: 'localhost' - help: "Configuration options if sending notifications via kombu rpc (these are the defaults) SSL version to use (valid only if SSL enabled) SSL key file (valid only if SSL enabled) SSL cert file (valid only if SSL enabled) SSL certification authority file (valid only if SSL enabled)' IP address of the RabbitMQ installation" - comment: 'New param' - - - name: rabbit_password - type: string - default: 'guest' - help: "Configuration options if sending notifications via kombu rpc (these are the defaults) SSL version to use (valid only if SSL enabled) SSL key file (valid only if SSL enabled) SSL cert file (valid only if SSL enabled) SSL certification authority file (valid only if SSL enabled)' IP address of the RabbitMQ installation Password of the RabbitMQ server" - comment: 'New param' - - - name: rabbit_port - type: string - default: '5672' - help: "Configuration options if sending notifications via kombu rpc (these are the defaults) SSL version to use (valid only if SSL enabled) SSL key file (valid only if SSL enabled) SSL cert file (valid only if SSL enabled) SSL certification authority file (valid only if SSL enabled)' IP address of the RabbitMQ installation Password of the RabbitMQ server Port where RabbitMQ server is running/listening" - comment: 'New param' - - - name: rabbit_hosts - type: string - default: 'localhost:5672' - help: "Configuration options if sending notifications via kombu rpc (these are the defaults) SSL version to use (valid only if SSL enabled) SSL key file (valid only if SSL enabled) SSL cert file (valid only if SSL enabled) SSL certification authority file (valid only if SSL enabled)' IP address of the RabbitMQ installation Password of the RabbitMQ server Port where RabbitMQ server is running/listening RabbitMQ single or HA cluster (host:port pairs i.e: host1:5672, host2:5672) rabbit_hosts is defaulted to '$rabbit_host:$rabbit_port'" - comment: 'New param' - - - name: rabbit_userid - type: string - default: 'guest' - help: "Configuration options if sending notifications via kombu rpc (these are the defaults) SSL version to use (valid only if SSL enabled) SSL key file (valid only if SSL enabled) SSL cert file (valid only if SSL enabled) SSL certification authority file (valid only if SSL enabled)' IP address of the RabbitMQ installation Password of the RabbitMQ server Port where RabbitMQ server is running/listening RabbitMQ single or HA cluster (host:port pairs i.e: host1:5672, host2:5672) rabbit_hosts is defaulted to '$rabbit_host:$rabbit_port' User ID used for RabbitMQ connections" - comment: 'New param' - - - name: rabbit_virtual_host - type: string - default: '/' - help: "Configuration options if sending notifications via kombu rpc (these are the defaults) SSL version to use (valid only if SSL enabled) SSL key file (valid only if SSL enabled) SSL cert file (valid only if SSL enabled) SSL certification authority file (valid only if SSL enabled)' IP address of the RabbitMQ installation Password of the RabbitMQ server Port where RabbitMQ server is running/listening RabbitMQ single or HA cluster (host:port pairs i.e: host1:5672, host2:5672) rabbit_hosts is defaulted to '$rabbit_host:$rabbit_port' User ID used for RabbitMQ connections Location of a virtual RabbitMQ installation." - comment: 'New param' - - - name: rabbit_max_retries - type: string - default: '0' - help: "Configuration options if sending notifications via kombu rpc (these are the defaults) SSL version to use (valid only if SSL enabled) SSL key file (valid only if SSL enabled) SSL cert file (valid only if SSL enabled) SSL certification authority file (valid only if SSL enabled)' IP address of the RabbitMQ installation Password of the RabbitMQ server Port where RabbitMQ server is running/listening RabbitMQ single or HA cluster (host:port pairs i.e: host1:5672, host2:5672) rabbit_hosts is defaulted to '$rabbit_host:$rabbit_port' User ID used for RabbitMQ connections Location of a virtual RabbitMQ installation. Maximum retries with trying to connect to RabbitMQ (the default of 0 implies an infinite retry count)" - comment: 'New param' - - - name: rabbit_retry_interval - type: string - default: '1' - help: "Configuration options if sending notifications via kombu rpc (these are the defaults) SSL version to use (valid only if SSL enabled) SSL key file (valid only if SSL enabled) SSL cert file (valid only if SSL enabled) SSL certification authority file (valid only if SSL enabled)' IP address of the RabbitMQ installation Password of the RabbitMQ server Port where RabbitMQ server is running/listening RabbitMQ single or HA cluster (host:port pairs i.e: host1:5672, host2:5672) rabbit_hosts is defaulted to '$rabbit_host:$rabbit_port' User ID used for RabbitMQ connections Location of a virtual RabbitMQ installation. Maximum retries with trying to connect to RabbitMQ (the default of 0 implies an infinite retry count) RabbitMQ connection retry interval" - comment: 'New param' - - - name: rabbit_ha_queues - type: boolean - default: false - help: "Configuration options if sending notifications via kombu rpc (these are the defaults) SSL version to use (valid only if SSL enabled) SSL key file (valid only if SSL enabled) SSL cert file (valid only if SSL enabled) SSL certification authority file (valid only if SSL enabled)' IP address of the RabbitMQ installation Password of the RabbitMQ server Port where RabbitMQ server is running/listening RabbitMQ single or HA cluster (host:port pairs i.e: host1:5672, host2:5672) rabbit_hosts is defaulted to '$rabbit_host:$rabbit_port' User ID used for RabbitMQ connections Location of a virtual RabbitMQ installation. Maximum retries with trying to connect to RabbitMQ (the default of 0 implies an infinite retry count) RabbitMQ connection retry interval Use HA queues in RabbitMQ (x-ha-policy: all).You need to wipe RabbitMQ database when changing this option. " - comment: 'New param' - - - name: qpid_hostname - type: string - default: 'localhost' - help: 'QPID Qpid broker hostname' - comment: 'New param' - - - name: qpid_port - type: string - default: '5672' - help: 'QPID Qpid broker hostname Qpid broker port' - comment: 'New param' - - - name: qpid_hosts - type: string - default: 'localhost:5672' - help: "QPID Qpid broker hostname Qpid broker port Qpid single or HA cluster (host:port pairs i.e: host1:5672, host2:5672) qpid_hosts is defaulted to '$qpid_hostname:$qpid_port'" - comment: 'New param' - - - name: qpid_username - type: string - default: "''" - help: "QPID Qpid broker hostname Qpid broker port Qpid single or HA cluster (host:port pairs i.e: host1:5672, host2:5672) qpid_hosts is defaulted to '$qpid_hostname:$qpid_port' Username for qpid connection" - comment: 'New param' - - - name: qpid_password - type: string - default: "''" - help: "QPID Qpid broker hostname Qpid broker port Qpid single or HA cluster (host:port pairs i.e: host1:5672, host2:5672) qpid_hosts is defaulted to '$qpid_hostname:$qpid_port' Username for qpid connection Password for qpid connection" - comment: 'New param' - - - name: qpid_sasl_mechanisms - type: string - default: "''" - help: "QPID Qpid broker hostname Qpid broker port Qpid single or HA cluster (host:port pairs i.e: host1:5672, host2:5672) qpid_hosts is defaulted to '$qpid_hostname:$qpid_port' Username for qpid connection Password for qpid connection Space separated list of SASL mechanisms to use for auth" - comment: 'New param' - - - name: qpid_heartbeat - type: string - default: '60' - help: "QPID Qpid broker hostname Qpid broker port Qpid single or HA cluster (host:port pairs i.e: host1:5672, host2:5672) qpid_hosts is defaulted to '$qpid_hostname:$qpid_port' Username for qpid connection Password for qpid connection Space separated list of SASL mechanisms to use for auth Seconds between connection keepalive heartbeats" - comment: 'New param' - - - name: qpid_protocol - type: string - default: 'tcp' - help: "QPID Qpid broker hostname Qpid broker port Qpid single or HA cluster (host:port pairs i.e: host1:5672, host2:5672) qpid_hosts is defaulted to '$qpid_hostname:$qpid_port' Username for qpid connection Password for qpid connection Space separated list of SASL mechanisms to use for auth Seconds between connection keepalive heartbeats Transport to use, either 'tcp' or 'ssl'" - comment: 'New param' - - - name: qpid_tcp_nodelay - type: string - default: 'True' - help: "QPID Qpid broker hostname Qpid broker port Qpid single or HA cluster (host:port pairs i.e: host1:5672, host2:5672) qpid_hosts is defaulted to '$qpid_hostname:$qpid_port' Username for qpid connection Password for qpid connection Space separated list of SASL mechanisms to use for auth Seconds between connection keepalive heartbeats Transport to use, either 'tcp' or 'ssl' Disable Nagle algorithm" - comment: 'New param' - - - name: rpc_zmq_bind_address - type: string - default: '*' - help: "ZMQ ZeroMQ bind address. Should be a wildcard (*), an ethernet interface, or IP. The 'host' option should point or resolve to this address." - comment: 'New param' - - - name: notification_driver - type: string - default: 'neutron.openstack.common.notifier.rpc_notifier' - help: 'Notification_driver can be defined multiple times Do nothing driver notification_driver = neutron.openstack.common.notifier.no_op_notifier Logging driver notification_driver = neutron.openstack.common.notifier.log_notifier RPC driver. DHCP agents needs it.' - comment: 'New param' - - - name: default_notification_level - type: string - default: 'INFO' - help: 'default_notification_level is used to form actual topic name(s) or to set logging level' - comment: 'New param' - - - name: host - type: string - default: 'myhost.com' - help: 'default_publisher_id is a part of the notification payload' - comment: 'New param' - - - name: default_publisher_id - type: string - default: '$host' - help: 'default_publisher_id is a part of the notification payload' - comment: 'New param' - - - name: notification_topics - type: string - default: 'notifications' - help: 'Defined in rpc_notifier, can be comma separated values. The actual topic names will be %s.%(default_notification_level)s' - comment: 'New param' - - - name: pagination_max_limit - type: string - default: '-1' - help: 'Default maximum number of items returned in a single response, value == infinite and value < 0 means no max limit, and value must greater than 0. If the number of items requested is greater than pagination_max_limit, server will just return pagination_max_limit of number of items.' - comment: 'New param' - - - name: max_dns_nameservers - type: string - default: '5' - help: 'Maximum number of DNS nameservers per subnet' - comment: 'New param' - - - name: max_subnet_host_routes - type: string - default: '20' - help: 'Maximum number of host routes per subnet' - comment: 'New param' - - - name: max_fixed_ips_per_port - type: string - default: '5' - help: 'Maximum number of fixed ips per port' - comment: 'New param' - - - name: agent_down_time - type: string - default: '5' - help: '=========== items for agent management extension ============= Seconds to regard the agent as down.' - comment: 'New param' - - - name: network_scheduler_driver - type: string - default: 'neutron.scheduler.dhcp_agent_scheduler.ChanceScheduler' - help: '=========== items for agent scheduler extension ============= Driver to use for scheduling network to DHCP agent' - comment: 'New param' - - - name: router_scheduler_driver - type: string - default: 'neutron.scheduler.l3_agent_scheduler.ChanceScheduler' - help: '=========== items for agent scheduler extension ============= Driver to use for scheduling network to DHCP agent Driver to use for scheduling router to a default L3 agent' - comment: 'New param' - - - name: loadbalancer_pool_scheduler_driver - type: string - default: 'neutron.services.loadbalancer.agent_scheduler.ChanceScheduler' - help: '=========== items for agent scheduler extension ============= Driver to use for scheduling network to DHCP agent Driver to use for scheduling router to a default L3 agent Driver to use for scheduling a loadbalancer pool to an lbaas agent' - comment: 'New param' - - - name: network_auto_schedule - type: string - default: 'True' - help: 'Allow auto scheduling networks to DHCP agent. It will schedule non-hosted networks to first DHCP agent which sends get_active_networks message to neutron server' - comment: 'New param' - - - name: router_auto_schedule - type: string - default: 'True' - help: 'Allow auto scheduling routers to L3 agent. It will schedule non-hosted routers to first L3 agent which sends sync_routers message to neutron server' - comment: 'New param' - - - name: dhcp_agents_per_network - type: string - default: '1' - help: 'Number of DHCP agents scheduled to host a network. This enables redundant DHCP agents for configured networks.' - comment: 'New param' - - - name: tcp_keepidle - type: string - default: '600' - help: '=========== WSGI parameters related to the API server ============== Sets the value of TCP_KEEPIDLE in seconds to use for each server socket when starting API server. Not supported on OS X.' - comment: 'New param' - - - name: retry_until_window - type: string - default: '30' - help: 'Number of seconds to keep retrying to listen' - comment: 'New param' - - - name: backlog - type: string - default: '4096' - help: 'Number of backlog requests to configure the socket with.' - comment: 'New param' - - - name: use_ssl - type: string - default: 'False' - help: 'Enable SSL on the API server' - comment: 'New param' - - - name: ssl_cert_file - type: string - default: '/path/to/certfile' - help: 'Certificate file to use when starting API server securely' - comment: 'New param' - - - name: ssl_key_file - type: string - default: '/path/to/keyfile' - help: 'Private key file to use when starting API server securely' - comment: 'New param' - - - name: ssl_ca_file - type: string - default: '/path/to/cafile' - help: 'CA certificate file to use when starting API server securely to verify connecting clients. This is an optional parameter only required if API clients need to authenticate to the API server using SSL certificates signed by a trusted CA' - comment: 'New param' - - - name: quotas.quota_items - type: string - default: 'network,subnet,port' - help: 'resource name(s) that are supported in quota features' - comment: 'New param' - - - name: quotas.default_quota - type: string - default: '-1' - help: 'default number of resource allowed per tenant, minus for unlimited' - comment: 'New param' - - - name: quotas.quota_network - type: string - default: '10' - help: 'number of networks allowed per tenant, and minus means unlimited' - comment: 'New param' - - - name: quotas.quota_subnet - type: string - default: '10' - help: 'number of subnets allowed per tenant, and minus means unlimited' - comment: 'New param' - - - name: quotas.quota_port - type: string - default: '50' - help: 'number of ports allowed per tenant, and minus means unlimited' - comment: 'New param' - - - name: quotas.quota_security_group - type: string - default: '10' - help: 'number of security groups allowed per tenant, and minus means unlimited' - comment: 'New param' - - - name: quotas.quota_security_group_rule - type: string - default: '100' - help: 'number of security group rules allowed per tenant, and minus means unlimited' - comment: 'New param' - - - name: quotas.quota_driver - type: string - default: 'neutron.db.quota_db.DbQuotaDriver' - help: 'default driver to use for quota checks' - comment: 'New param' - - - name: agent.root_helper - type: string - default: 'sudo' - help: "Use 'sudo neutron-rootwrap /etc/neutron/rootwrap.conf' to use the real root filter facility. Change to 'sudo' to skip the filtering and just run the comand directly" - comment: 'New param' - - - name: agent.report_interval - type: string - default: '4' - help: '=========== items for agent management extension ============= seconds between nodes reporting state to server, should be less than agent_down_time' - comment: 'New param' - - - name: keystone_authtoken.auth_host - type: host - default: '127.0.0.1' - comment: 'New param' - - - name: keystone_authtoken.auth_port - type: string - default: '35357' - comment: 'New param' - - - name: keystone_authtoken.auth_protocol - type: string - default: 'http' - comment: 'New param' - - - name: keystone_authtoken.admin_tenant_name - type: string - default: '%SERVICE_TENANT_NAME%' - comment: 'New param' - - - name: keystone_authtoken.admin_user - type: string - default: '%SERVICE_USER%' - comment: 'New param' - - - name: keystone_authtoken.admin_password - type: string - default: '%SERVICE_PASSWORD%' - comment: 'New param' - - - name: keystone_authtoken.signing_dir - type: string - default: '$state_path/keystone-signing' - comment: 'New param' - - - name: database.connection - type: string - default: 'mysql://root:pass@127.0.0.1:3306/neutron' - help: 'This line MUST be changed to actually run the plugin. Example:' - comment: 'New param' - - - name: database.slave_connection - type: string - default: '' - help: 'The SQLAlchemy connection string used to connect to the slave database' - comment: 'New param' - - - name: database.max_retries - type: string - default: '10' - help: 'Database reconnection retry times - in event connectivity is lost set to -1 implies an infinite retry count' - comment: 'New param' - - - name: database.retry_interval - type: string - default: '10' - help: 'Database reconnection interval in seconds - if the initial connection to the database fails' - comment: 'New param' - - - name: database.min_pool_size - type: string - default: '1' - help: 'Minimum number of SQL connections to keep open in a pool' - comment: 'New param' - - - name: database.max_pool_size - type: string - default: '10' - help: 'Maximum number of SQL connections to keep open in a pool' - comment: 'New param' - - - name: database.idle_timeout - type: string - default: '3600' - help: 'Timeout in seconds before idle sql connections are reaped' - comment: 'New param' - - - name: database.max_overflow - type: string - default: '20' - help: 'If set, use this value for max_overflow with sqlalchemy' - comment: 'New param' - - - name: database.connection_debug - type: string - default: '0' - help: 'Verbosity of SQL debugging information. 0=None, 100=Everything' - comment: 'New param' - - - name: database.connection_trace - type: string - default: 'False' - help: 'Add python stack traces to SQL as comment strings' - comment: 'New param' - - - name: database.pool_timeout - type: string - default: '10' - help: 'If set, use this value for pool_timeout with sqlalchemy' - comment: 'New param' - - - name: service_providers.service_provider - type: string - default: 'LOADBALANCER:Haproxy:neutron.services.loadbalancer.drivers.haproxy.plugin_driver.HaproxyOnHostPluginDriver:default' - help: 'Specify service providers (drivers) for advanced services like loadbalancer, VPN, Firewall. Must be in form: service_provider=::[:default] List of allowed service type include LOADBALANCER, FIREWALL, VPN Combination of and must be unique; must also be unique this is multiline option, example for default provider: service_provider=LOADBALANCER:name:lbaas_plugin_driver_path:default example of non-default provider: service_provider=FIREWALL:name2:firewall_driver_path --- Reference implementations ---' - comment: 'New param' - -# ==================================================== diff --git a/rubick/schemas/nova/2013.1.3.yml b/rubick/schemas/nova/2013.1.3.yml deleted file mode 100644 index a900bec..0000000 --- a/rubick/schemas/nova/2013.1.3.yml +++ /dev/null @@ -1,3238 +0,0 @@ -project: nova -version: '2013.1.3' -parameters: - - - name: internal_service_availability_zone - type: string - default: 'internal' - help: 'availability_zone to show internal services under' - - - name: default_availability_zone - type: string - default: 'nova' - help: 'default compute node availability_zone' - - - name: ssl.ca_file - type: string - default: ~ - help: 'CA certificate file to use to verify connecting clients' - - - name: ssl.key_file - type: string - default: ~ - help: 'Private key file to use when starting the server securely' - - - name: crl_file - type: file - default: 'crl.pem' - help: 'Filename of root Certificate Revocation List' - - - name: keys_path - type: directory - default: '$state_path/keys' - help: 'Where we keep our keys' - - - name: ca_path - type: string - default: '$state_path/CA' - help: 'Where we keep our root CA' - - - name: use_project_ca - type: boolean - default: False - help: 'Should we use a CA for each project?' - - - name: user_cert_subject - type: string - default: '/CUS/STCalifornia/OOpenStack/OUNovaDev/CN%.16s-%.16s-%s' - help: 'Subject for certificate for users, %s for project, user, timestamp' - - - name: project_cert_subject - type: string - default: '/CUS/STCalifornia/OOpenStack/OUNovaDev/CNproject-ca-%.16s-%s' - help: 'Subject for certificate for projects, %s for project, timestamp' - - - name: fatal_exception_format_errors - type: boolean - default: False - help: 'make exception message format errors fatal' - - - name: my_ip - type: string - default: '10.0.0.1' - help: 'ip address of this host' - - - name: matchmaker_redis.host - type: string - default: '127.0.0.1' - help: 'Host to locate redis' - - - name: use_ipv6 - type: boolean - default: False - help: 'use ipv6' - - - name: notify_on_state_change - type: string - default: 'None' - help: "If set, send compute.instance.update notifications on instance state changes. Valid values are None for no notifications, 'vm_state' for notifications on VM state changes, or 'vm_and_task_state' for notifications on VM and task state changes." - - - name: notify_api_faults - type: boolean - default: False - help: 'If set, send api.fault notifications on caught exceptions in the API service.' - - - name: pybasedir - type: string - default: '/usr/lib/python/site-packages' - help: 'Directory where the nova python module is installed' - - - name: bindir - type: string - default: '/usr/local/bin' - help: 'Directory where nova binaries are installed' - - - name: state_path - type: string - default: '$pybasedir' - help: "Top-level directory for maintaining nova's state" - - - name: policy_file - type: string - default: 'policy.json' - help: 'JSON file representing policy' - - - name: policy_default_rule - type: string - default: 'default' - help: 'Rule checked when requested rule is not found' - - - name: quota_instances - type: integer - default: 10 - help: 'number of instances allowed per project' - - - name: quota_cores - type: integer - default: 20 - help: 'number of instance cores allowed per project' - - - name: quota_ram - type: integer - default: 51200 - help: 'megabytes of instance ram allowed per project' - - - name: quota_floating_ips - type: integer - default: 10 - help: 'number of floating ips allowed per project' - - - name: quota_fixed_ips - type: integer - default: -1 - help: 'number of fixed ips allowed per project' - - - name: quota_metadata_items - type: integer - default: 128 - help: 'number of metadata items allowed per instance' - - - name: quota_injected_files - type: integer - default: 5 - help: 'number of injected files allowed' - - - name: quota_injected_file_content_bytes - type: integer - default: 10240 - help: 'number of bytes allowed per injected file' - - - name: quota_injected_file_path_bytes - type: integer - default: 255 - help: 'number of bytes allowed per injected file path' - - - name: quota_security_groups - type: integer - default: 10 - help: 'number of security groups per project' - - - name: quota_security_group_rules - type: integer - default: 20 - help: 'number of security rules per security group' - - - name: quota_key_pairs - type: integer - default: 100 - help: 'number of key pairs per user' - - - name: reservation_expire - type: integer - default: 86400 - help: 'number of seconds until a reservation expires' - - - name: until_refresh - type: integer - default: 0 - help: 'count of reservations until usage is refreshed' - - - name: max_age - type: integer - default: 0 - help: 'number of seconds between subsequent usage refreshes' - - - name: quota_driver - type: string - default: 'nova.quota.DbQuotaDriver' - help: 'default driver to use for quota checks' - - - name: report_interval - type: integer - default: 10 - help: 'seconds between nodes reporting state to datastore' - - - name: periodic_enable - type: boolean - default: True - help: 'enable periodic tasks' - - - name: periodic_fuzzy_delay - type: integer - default: 60 - help: 'range of seconds to randomly delay when starting the periodic task scheduler to reduce stampeding.' - - - name: enabled_apis - type: list - default: 'ec2,osapi_compute,metadata' - help: 'a list of APIs to enable by default' - - - name: enabled_ssl_apis - type: list - default: '' - help: 'a list of APIs with enabled SSL' - - - name: ec2_listen - type: string - default: '0.0.0.0' - help: 'IP address for EC2 API to listen' - - - name: ec2_listen_port - type: integer - default: 8773 - help: 'port for ec2 api to listen' - - - name: ec2_workers - type: integer - default: ~ - help: 'Number of workers for EC2 API service' - - - name: osapi_compute_listen - type: string - default: '0.0.0.0' - help: 'IP address for OpenStack API to listen' - - - name: osapi_compute_listen_port - type: integer - default: 8774 - help: 'list port for osapi compute' - - - name: osapi_compute_workers - type: integer - default: ~ - help: 'Number of workers for OpenStack API service' - - - name: metadata_manager - type: string - default: 'nova.api.manager.MetadataManager' - help: 'OpenStack metadata service manager' - - - name: metadata_listen - type: string - default: '0.0.0.0' - help: 'IP address for metadata api to listen' - - - name: metadata_listen_port - type: integer - default: 8775 - help: 'port for metadata api to listen' - - - name: metadata_workers - type: integer - default: ~ - help: 'Number of workers for metadata service' - - - name: compute_manager - type: string - default: 'nova.compute.manager.ComputeManager' - help: 'full class name for the Manager for compute' - - - name: console_manager - type: string - default: 'nova.console.manager.ConsoleProxyManager' - help: 'full class name for the Manager for console proxy' - - - name: cert_manager - type: string - default: 'nova.cert.manager.CertManager' - help: 'full class name for the Manager for cert' - - - name: network_manager - type: string - default: 'nova.network.manager.VlanManager' - help: 'full class name for the Manager for network' - - - name: scheduler_manager - type: string - default: 'nova.scheduler.manager.SchedulerManager' - help: 'full class name for the Manager for scheduler' - - - name: service_down_time - type: integer - default: 60 - help: 'maximum time since last check-in for up service' - - - name: sqlite_clean_db - type: string - default: 'clean.sqlite' - help: 'File name of clean sqlite db' - - - name: monkey_patch - type: boolean - default: False - help: 'Whether to log monkey patching' - - - name: monkey_patch_modules - type: list - default: 'nova.api.ec2.cloud:nova.notifications.notify_decorator,nova.compute.api:nova.notifications.notify_decorator' - help: 'List of modules/decorators to monkey patch' - - - name: password_length - type: integer - default: 12 - help: 'Length of generated instance admin passwords' - - - name: instance_usage_audit_period - type: string - default: 'month' - help: 'time period to generate instance usages for. Time period must be hour, day, month or year' - - - name: rootwrap_config - type: string - default: '/etc/nova/rootwrap.conf' - help: 'Path to the rootwrap configuration file to use for running commands as root' - - - name: tempdir - type: string - default: ~ - help: 'Explicitly specify the temporary working directory' - - - name: api_paste_config - type: string - default: 'api-paste.ini' - help: 'File name for the paste.deploy config for nova-api' - - - name: wsgi_log_format - type: string - default: '%(client_ip)s "%(request_line)s" status: %(status_code)s len: %(body_length)s time: %(wall_seconds).7f' - help: 'A python format string that is used as the template to generate log lines. The following values can be formatted into it: client_ip, date_time, request_line, status_code, body_length, wall_seconds.' - - - name: ssl_ca_file - type: string - default: ~ - help: 'CA certificate file to use to verify connecting clients' - - - name: ssl_cert_file - type: string - default: ~ - help: 'SSL certificate of API server' - - - name: ssl_key_file - type: string - default: ~ - help: 'SSL private key of API server' - - - name: tcp_keepidle - type: integer - default: 600 - help: 'Sets the value of TCP_KEEPIDLE in seconds for each server socket. Not supported on OS X.' - - - name: api_rate_limit - type: boolean - default: False - help: 'whether to use per-user rate limiting for the api.' - - - name: auth_strategy - type: string - default: 'noauth' - help: 'The strategy to use for auth: noauth or keystone.' - - - name: use_forwarded_for - type: boolean - default: False - help: 'Treat X-Forwarded-For as the canonical remote address. Only enable this if you have a sanitizing proxy.' - - - name: lockout_attempts - type: integer - default: 5 - help: 'Number of failed auths before lockout.' - - - name: lockout_minutes - type: integer - default: 15 - help: 'Number of minutes to lockout if triggered.' - - - name: lockout_window - type: integer - default: 15 - help: 'Number of minutes for lockout window.' - - - name: keystone_ec2_url - type: string - default: 'http://localhost:5000/v2.0/ec2tokens' - help: 'URL to get token from ec2 request.' - - - name: ec2_private_dns_show_ip - type: boolean - default: False - help: 'Return the IP address as private dns hostname in describe instances' - - - name: ec2_strict_validation - type: boolean - default: True - help: 'Validate security group names according to EC2 specification' - - - name: ec2_timestamp_expiry - type: integer - default: 300 - help: 'Time in seconds before ec2 timestamp expires' - - - name: ec2_host - type: string - default: '$my_ip' - help: 'the ip of the ec2 api server' - - - name: ec2_dmz_host - type: string - default: '$my_ip' - help: 'the internal ip of the ec2 api server' - - - name: ec2_port - type: integer - default: 8773 - help: 'the port of the ec2 api server' - - - name: ec2_scheme - type: string - default: 'http' - help: 'the protocol to use when connecting to the ec2 api server' - - - name: ec2_path - type: string - default: '/services/Cloud' - help: 'the path prefix used to call the ec2 api server' - - - name: region_list - type: list - default: '' - help: 'list of region=fqdn pairs separated by commas' - - - name: config_drive_skip_versions - type: string - default: '1.0 2007-01-19 2007-03-01 2007-08-29 2007-10-10 2007-12-15 2008-02-01 2008-09-01' - help: 'List of metadata versions to skip placing into the config drive' - - - name: vendordata_driver - type: string - default: 'nova.api.metadata.vendordata_json.JsonFileVendorData' - help: 'Driver to use for vendor data' - - - name: service_neutron_metadata_proxy - type: boolean - default: False - help: 'Set flag to indicate Neutron will proxy metadata requests and resolve instance ids.' - - - name: neutron_metadata_proxy_shared_secret - type: string - default: '' - help: 'Shared secret to validate proxies Neutron metadata requests' - - - name: vendordata_jsonfile_path - type: string - default: ~ - help: 'File to load json formated vendor data from' - - - name: osapi_max_limit - type: integer - default: 1000 - help: 'the maximum number of items returned in a single response from a collection resource' - - - name: osapi_compute_link_prefix - type: string - default: ~ - help: 'Base URL that will be presented to users in links to the OpenStack Compute API' - - - name: osapi_glance_link_prefix - type: string - default: ~ - help: 'Base URL that will be presented to users in links to glance resources' - - - name: allow_instance_snapshots - type: boolean - default: True - help: 'Permit instance snapshot operations.' - - - name: osapi_compute_ext_list - type: list - default: '' - help: 'Specify list of extensions to load when using osapi_compute_extension option with nova_2013_1_3.api.openstack.compute.contrib.select_extensions' - - - name: fping_path - type: string - default: '/usr/sbin/fping' - help: 'Full path to fping.' - - - name: enable_network_quota - type: boolean - default: False - help: 'Enables or disables quota checking for tenant networks' - - - name: use_neutron_default_nets - type: string - default: 'False' - help: 'Control for checking for default networks' - - - name: neutron_default_tenant_id - type: string - default: 'default' - help: 'Default tenant id when creating neutron networks' - - - name: osapi_compute_extension - type: multi - default: 'nova.api.openstack.compute.contrib.standard_extensions' - help: 'osapi compute extension to load' - - - name: osapi_hide_server_address_states - type: list - default: 'building' - help: 'List of instance states that should hide network info' - - - name: enable_instance_password - type: boolean - default: True - help: 'Allows use of instance password during server creation' - - - name: osapi_max_request_body_size - type: integer - default: 114688 - help: 'the maximum body size per each osapi request(bytes)' - - - name: compute_api_class - type: string - default: 'nova.compute.api.API' - help: 'The full class name of the compute API class to use' - - - name: cert_topic - type: string - default: 'cert' - help: 'the topic cert nodes listen on' - - - name: vpn_image_id - type: string - default: '0' - help: 'image id used when starting up a cloudpipe vpn server' - - - name: vpn_flavor - type: string - default: 'm1.tiny' - help: 'Flavor for vpn instances' - - - name: boot_script_template - type: string - default: '$pybasedir/nova/cloudpipe/bootscript.template' - help: 'Template for cloudpipe instance boot script' - - - name: dmz_net - type: string - default: '10.0.0.0' - help: 'Network to push into openvpn config' - - - name: dmz_mask - type: string - default: '255.255.255.0' - help: 'Netmask to push into openvpn config' - - - name: vpn_key_suffix - type: string - default: '-vpn' - help: 'Suffix to add to project name for vpn key and secgroups' - - - name: record - type: boolean - default: False - help: 'Record sessions to FILE.[session_number]' - - - name: daemon - type: boolean - default: False - help: 'Become a daemon' - - - name: ssl_only - type: boolean - default: False - help: 'Disallow non-encrypted connections' - - - name: source_is_ipv6 - type: boolean - default: False - help: 'Source is ipv6' - - - name: upgrade_levels.cert - type: string - default: ~ - help: 'Set a version cap for messages sent to cert services' - - - name: key - type: string - default: ~ - help: 'SSL key file' - - - name: web - type: string - default: '/usr/share/spice-html5' - help: 'Run webserver on same port. Serve files from DIR.' - - - name: novncproxy_host - type: string - default: '0.0.0.0' - help: 'Host on which to listen for incoming requests' - - - name: novncproxy_port - type: integer - default: 6080 - help: 'Port on which to listen for incoming requests' - - - name: spicehtml5proxy_host - type: string - default: '0.0.0.0' - help: 'Host on which to listen for incoming requests' - - - name: spicehtml5proxy_port - type: integer - default: 6082 - help: 'Port on which to listen for incoming requests' - - - name: allow_resize_to_same_host - type: boolean - default: False - help: 'Allow destination machine to match source for resize. Useful when testing in single-host environments.' - - - name: allow_migrate_to_same_host - type: boolean - default: False - help: 'Allow migrate machine to the same host. Useful when testing in single-host environments.' - - - name: default_schedule_zone - type: string - default: ~ - help: "availability zone to use when user doesn't specify one" - - - name: non_inheritable_image_properties - type: list - default: 'cache_in_nova,bittorrent' - help: 'These are image properties which a snapshot should not inherit from an instance' - - - name: null_kernel - type: string - default: 'nokernel' - help: 'kernel image that indicates not to use a kernel, but to use a raw disk image instead' - - - name: multi_instance_display_name_template - type: string - default: '%(name)s-%(uuid)s' - help: "When creating multiple instances with a single request using the os-multiple-create API extension, this template will be used to build the display name for each instance. The benefit is that the instances end up with different hostnames. To restore legacy behavior of every instance having the same name, set this option to '%(name)s'. Valid keys for the template are: name, uuid, count." - - - name: max_local_block_devices - type: integer - default: 3 - help: 'Maximum number of devices that will result in a local image being created on the hypervisor node. Setting this to 0 means nova will allow only boot from volume. A negative number means unlimited.' - - - name: default_flavor - type: string - default: 'm1.small' - help: 'default flavor to use for the EC2 API only. The Nova API does not support a default flavor.' - - - name: console_host - type: string - default: 'nova' - help: 'Console proxy host to use to connect to instances on this host.' - - - name: default_access_ip_network_name - type: string - default: ~ - help: 'Name of network to use to set access ips for instances' - - - name: defer_iptables_apply - type: boolean - default: False - help: 'Whether to batch up the application of IPTables rules during a host restart and apply all at the end of the init phase' - - - name: instances_path - type: string - default: '$state_path/instances' - help: 'where instances are stored on disk' - - - name: instance_usage_audit - type: boolean - default: False - help: 'Generate periodic compute.instance.exists notifications' - - - name: live_migration_retry_count - type: integer - default: 30 - help: 'Number of 1 second retries needed in live_migration' - - - name: resume_guests_state_on_host_boot - type: boolean - default: False - help: 'Whether to start guests that were running before the host rebooted' - - - name: network_allocate_retries - type: integer - default: 0 - help: 'Number of times to retry network allocation on failures' - - - name: maximum_instance_delete_attempts - type: integer - default: 5 - help: 'The number of times to attempt to reap an instances files.' - - - name: bandwidth_poll_interval - type: integer - default: 600 - help: 'interval to pull bandwidth usage info' - - - name: sync_power_state_interval - type: integer - default: 600 - help: 'interval to sync power states between the database and the hypervisor' - - - name: heal_instance_info_cache_interval - type: integer - default: 60 - help: 'Number of seconds between instance info_cache self healing updates' - - - name: host_state_interval - type: integer - default: 120 - help: 'Interval in seconds for querying the host status' - - - name: image_cache_manager_interval - type: integer - default: 2400 - help: 'Number of seconds to wait between runs of the image cache manager' - - - name: reclaim_instance_interval - type: integer - default: 0 - help: 'Interval in seconds for reclaiming deleted instances' - - - name: volume_usage_poll_interval - type: integer - default: 0 - help: 'Interval in seconds for gathering volume usages' - - - name: shelved_poll_interval - type: integer - default: 3600 - help: 'Interval in seconds for polling shelved instances to offload' - - - name: shelved_offload_time - type: integer - default: 0 - help: 'Time in seconds before a shelved instance is eligible for removing from a host. -1 never offload, 0 offload when shelved' - - - name: instance_delete_interval - type: integer - default: 300 - help: 'Interval in seconds for retrying failed instance file deletes' - - - name: running_deleted_instance_action - type: string - default: 'log' - help: "Action to take if a running deleted instance is detected.Valid options are 'noop', 'log' and 'reap'. Set to 'noop' to disable." - - - name: running_deleted_instance_poll_interval - type: integer - default: 1800 - help: 'Number of seconds to wait between runs of the cleanup task.' - - - name: running_deleted_instance_timeout - type: integer - default: 0 - help: 'Number of seconds after being deleted when a running instance should be considered eligible for cleanup.' - - - name: reboot_timeout - type: integer - default: 0 - help: 'Automatically hard reboot an instance if it has been stuck in a rebooting state longer than N seconds. Set to 0 to disable.' - - - name: instance_build_timeout - type: integer - default: 0 - help: 'Amount of time in seconds an instance can be in BUILD before going into ERROR status.Set to 0 to disable.' - - - name: rescue_timeout - type: integer - default: 0 - help: 'Automatically unrescue an instance after N seconds. Set to 0 to disable.' - - - name: resize_confirm_window - type: integer - default: 0 - help: 'Automatically confirm resizes after N seconds. Set to 0 to disable.' - - - name: reserved_host_disk_mb - type: integer - default: 0 - help: 'Amount of disk in MB to reserve for the host' - - - name: reserved_host_memory_mb - type: integer - default: 512 - help: 'Amount of memory in MB to reserve for the host' - - - name: compute_stats_class - type: string - default: 'nova.compute.stats.Stats' - help: 'Class that will manage stats for the local compute host' - - - name: compute_topic - type: string - default: 'compute' - help: 'the topic compute nodes listen on' - - - name: migrate_max_retries - type: integer - default: -1 - help: 'Number of times to retry live-migration before failing. If == -1, try until out of hosts. If == 0, only try once, no retries.' - - - name: console_driver - type: string - default: 'nova.console.xvp.XVPConsoleProxy' - help: 'Driver to use for the console proxy' - - - name: stub_compute - type: boolean - default: False - help: 'Stub calls to compute worker for tests' - - - name: console_public_hostname - type: string - default: 'nova' - help: 'Publicly visible name for this console host' - - - name: console_topic - type: string - default: 'console' - help: 'the topic console proxy nodes listen on' - - - name: console_vmrc_port - type: integer - default: 443 - help: 'port for VMware VMRC connections' - - - name: console_vmrc_error_retries - type: integer - default: 10 - help: 'number of retries for retrieving VMRC information' - - - name: console_xvp_conf_template - type: string - default: '$pybasedir/nova/console/xvp.conf.template' - help: 'XVP conf template' - - - name: console_xvp_conf - type: string - default: '/etc/xvp.conf' - help: 'generated XVP conf file' - - - name: console_xvp_pid - type: string - default: '/var/run/xvp.pid' - help: 'XVP master process pid file' - - - name: console_xvp_log - type: string - default: '/var/log/xvp.log' - help: 'XVP log file' - - - name: console_xvp_multiplex_port - type: integer - default: 5900 - help: 'port for XVP to multiplex VNC connections on' - - - name: consoleauth_topic - type: string - default: 'consoleauth' - help: 'the topic console auth proxy nodes listen on' - - - name: console_token_ttl - type: integer - default: 600 - help: 'How many seconds before deleting tokens' - - - name: consoleauth_manager - type: string - default: 'nova.consoleauth.manager.ConsoleAuthManager' - help: 'Manager for console auth' - - - name: enable_new_services - type: boolean - default: True - help: 'Services to be added to the available pool on create' - - - name: instance_name_template - type: string - default: 'instance-%08x' - help: 'Template string to be used to generate instance names' - - - name: snapshot_name_template - type: string - default: 'snapshot-%s' - help: 'Template string to be used to generate snapshot names' - - - name: db_driver - type: string - default: 'nova.db' - help: 'driver to use for database access' - - - name: osapi_compute_unique_server_name_scope - type: string - default: '' - help: "When set, compute API will consider duplicate hostnames invalid within the specified scope, regardless of case. Should be empty, 'project' or 'global'." - - - name: glance_host - type: string - default: '$my_ip' - help: 'default glance hostname or ip' - - - name: glance_port - type: integer - default: 9292 - help: 'default glance port' - - - name: glance_protocol - type: string - default: 'http' - help: 'Default protocol to use when connecting to glance. Set to https for SSL.' - - - name: glance_api_servers - type: list - default: '$glance_host:$glance_port' - help: 'A list of the glance api servers available to nova_2013_1_3. Prefix with https:// for ssl-based glance api servers.' - - - name: glance_api_insecure - type: boolean - default: False - help: 'Allow to perform insecure SSL' - - - name: glance_num_retries - type: integer - default: 0 - help: 'Number retries when downloading an image from glance' - - - name: allowed_direct_url_schemes - type: list - default: '' - help: 'A list of url scheme that can be downloaded directly via the direct_url. Currently supported schemes: [file].' - - - name: image_decryption_dir - type: string - default: '/tmp' - help: 'parent dir for tempdir used for image decryption' - - - name: s3_host - type: string - default: '$my_ip' - help: 'hostname or ip for OpenStack to use when accessing the s3 api' - - - name: s3_port - type: integer - default: 3333 - help: 'port used when accessing the s3 api' - - - name: s3_access_key - type: string - default: 'notchecked' - help: 'access key to use for s3 server for images' - - - name: s3_secret_key - type: string - default: 'notchecked' - help: 'secret key to use for s3 server for images' - - - name: s3_use_ssl - type: boolean - default: False - help: 'whether to use ssl when talking to s3' - - - name: s3_affix_tenant - type: boolean - default: False - help: 'whether to affix the tenant id to the access key when downloading from s3' - - - name: ipv6_backend - type: string - default: 'rfc2462' - help: 'Backend to use for IPv6 generation' - - - name: network_api_class - type: string - default: 'nova.network.api.API' - help: 'The full class name of the network API class to use' - - - name: network_driver - type: string - default: 'nova.network.linux_net' - help: 'Driver to use for network creation' - - - name: default_floating_pool - type: string - default: 'nova' - help: 'Default pool for floating ips' - - - name: auto_assign_floating_ip - type: boolean - default: False - help: 'Autoassigning floating ip to VM' - - - name: floating_ip_dns_manager - type: string - default: 'nova.network.noop_dns_driver.NoopDNSDriver' - help: 'full class name for the DNS Manager for floating IPs' - - - name: instance_dns_manager - type: string - default: 'nova.network.noop_dns_driver.NoopDNSDriver' - help: 'full class name for the DNS Manager for instance IPs' - - - name: instance_dns_domain - type: string - default: '' - help: 'full class name for the DNS Zone for instance IPs' - - - name: ldap_dns_url - type: string - default: 'ldap://ldap.example.com:389' - help: 'URL for ldap server which will store dns entries' - - - name: ldap_dns_user - type: string - default: 'uidadmin,oupeople,dcexample,dcorg' - help: 'user for ldap DNS' - - - name: ldap_dns_password - type: string - default: 'password' - help: 'password for ldap DNS' - - - name: ldap_dns_soa_hostmaster - type: string - default: 'hostmaster@example.org' - help: 'Hostmaster for ldap dns driver Statement of Authority' - - - name: ldap_dns_servers - type: multi - default: 'dns.example.org' - help: 'DNS Servers for ldap dns driver' - - - name: ldap_dns_base_dn - type: string - default: 'ouhosts,dcexample,dcorg' - help: 'Base DN for DNS entries in ldap' - - - name: ldap_dns_soa_refresh - type: string - default: '1800' - help: 'Refresh interval' - - - name: ldap_dns_soa_retry - type: string - default: '3600' - help: 'Retry interval' - - - name: ldap_dns_soa_expiry - type: string - default: '86400' - help: 'Expiry interval' - - - name: ldap_dns_soa_minimum - type: string - default: '7200' - help: 'Minimum interval' - - - name: dhcpbridge_flagfile - type: multi - default: '/etc/nova/nova-dhcpbridge.conf' - help: 'location of flagfiles for dhcpbridge' - - - name: networks_path - type: string - default: '$state_path/networks' - help: 'Location to keep network config files' - - - name: public_interface - type: string - default: 'eth0' - help: 'Interface for public IP addresses' - - - name: network_device_mtu - type: string - default: ~ - help: 'MTU setting for vlan' - - - name: dhcpbridge - type: string - default: '$bindir/nova-dhcpbridge' - help: 'location of nova-dhcpbridge' - - - name: routing_source_ip - type: string - default: '$my_ip' - help: 'Public IP of network host' - - - name: dhcp_lease_time - type: integer - default: 120 - help: 'Lifetime of a DHCP lease in seconds' - - - name: dns_server - type: multi - default: '' - help: 'if set, uses specific dns server for dnsmasq. Canbe specified multiple times.' - - - name: use_network_dns_servers - type: boolean - default: False - help: 'if set, uses the dns1 and dns2 from the network ref.as dns servers.' - - - name: dmz_cidr - type: list - default: '' - help: 'A list of dmz range that should be accepted' - - - name: force_snat_range - type: multi - default: '' - help: 'Traffic to this range will always be snatted to the fallback ip, even if it would normally be bridged out of the node. Can be specified multiple times.' - - - name: dnsmasq_config_file - type: string - default: '' - help: 'Override the default dnsmasq settings with this file' - - - name: linuxnet_interface_driver - type: string - default: 'nova.network.linux_net.LinuxBridgeInterfaceDriver' - help: 'Driver used to create ethernet devices.' - - - name: linuxnet_ovs_integration_bridge - type: string - default: 'br-int' - help: 'Name of Open vSwitch bridge used with linuxnet' - - - name: send_arp_for_ha - type: boolean - default: False - help: 'send gratuitous ARPs for HA setup' - - - name: send_arp_for_ha_count - type: integer - default: 3 - help: 'send this many gratuitous ARPs for HA setup' - - - name: use_single_default_gateway - type: boolean - default: False - help: 'Use single default gateway. Only first nic of vm will get default gateway from dhcp server' - - - name: forward_bridge_interface - type: multi - default: 'all' - help: 'An interface that bridges can forward to. If this is set to all then all traffic will be forwarded. Can be specified multiple times.' - - - name: metadata_host - type: string - default: '$my_ip' - help: 'the ip for the metadata api server' - - - name: metadata_port - type: integer - default: 8775 - help: 'the port for the metadata api port' - - - name: iptables_top_regex - type: string - default: '' - help: 'Regular expression to match iptables rule that should always be on the top.' - - - name: iptables_bottom_regex - type: string - default: '' - help: 'Regular expression to match iptables rule that should always be on the bottom.' - - - name: iptables_drop_action - type: string - default: 'DROP' - help: 'The table that iptables to jump to when a packet is to be dropped.' - - - name: flat_network_bridge - type: string - default: ~ - help: 'Bridge for simple network instances' - - - name: flat_network_dns - type: string - default: '8.8.4.4' - help: 'Dns for simple network' - - - name: flat_injected - type: boolean - default: False - help: 'Whether to attempt to inject network setup into guest' - - - name: flat_interface - type: string - default: ~ - help: 'FlatDhcp will bridge into this interface if set' - - - name: vlan_start - type: integer - default: 100 - help: 'First VLAN for private networks' - - - name: vmware.vlan_interface - type: string - default: 'vmnic0' - help: 'Physical ethernet adapter name for vlan networking' - - - name: num_networks - type: integer - default: 1 - help: 'Number of networks to support' - - - name: vpn_ip - type: string - default: '$my_ip' - help: 'Public IP for the cloudpipe VPN servers' - - - name: vpn_start - type: integer - default: 1000 - help: 'First Vpn port for private networks' - - - name: network_size - type: integer - default: 256 - help: 'Number of addresses in each private subnet' - - - name: fixed_range_v6 - type: string - default: 'fd00::/48' - help: 'Fixed IPv6 address block' - - - name: fixed_range - type: string - default: '' - help: 'Fixed IPv4 address block' - - - name: gateway - type: string - default: ~ - help: 'Default IPv4 gateway' - - - name: gateway_v6 - type: string - default: ~ - help: 'Default IPv6 gateway' - - - name: cnt_vpn_clients - type: integer - default: 0 - help: 'Number of addresses reserved for vpn clients' - - - name: fixed_ip_disassociate_timeout - type: integer - default: 600 - help: 'Seconds after which a deallocated ip is disassociated' - - - name: create_unique_mac_address_attempts - type: integer - default: 5 - help: 'Number of attempts to create unique mac address' - - - name: fake_network - type: boolean - default: False - help: 'If passed, use fake network devices and addresses' - - - name: fake_call - type: boolean - default: False - help: 'If True, skip using the queue and make local calls' - - - name: teardown_unused_network_gateway - type: boolean - default: False - help: 'If True, unused gateway devices' - - - name: force_dhcp_release - type: boolean - default: True - help: 'If True, send a dhcp release on instance termination' - - - name: share_dhcp_address - type: boolean - default: False - help: 'If True in multi_host mode, all compute hosts share the same dhcp address. The same IP address used for DHCP will be added on each nova-network node which is only visible to the vms on the same host.' - - - name: update_dns_entries - type: boolean - default: False - help: 'If True, when a DNS entry must be updated, it sends a fanout cast to all network hosts to update their DNS entries in multi host mode' - - - name: dns_update_periodic_interval - type: integer - default: -1 - help: 'Number of seconds to wait between runs of updates to DNS entries.' - - - name: dhcp_domain - type: string - default: 'novalocal' - help: 'domain to use for building the hostnames' - - - name: l3_lib - type: string - default: 'nova.network.l3.LinuxNetL3' - help: 'Indicates underlying L3 management library' - - - name: neutron_url - type: string - default: 'http://127.0.0.1:9696' - help: 'URL for connecting to neutron' - - - name: neutron_url_timeout - type: integer - default: 30 - help: 'timeout value for connecting to neutron in seconds' - - - name: neutron_admin_username - type: string - default: ~ - help: 'username for connecting to neutron in admin context' - - - name: neutron_admin_password - type: string - default: ~ - help: 'password for connecting to neutron in admin context' - - - name: neutron_admin_tenant_name - type: string - default: ~ - help: 'tenant name for connecting to neutron in admin context' - - - name: neutron_region_name - type: string - default: ~ - help: 'region name for connecting to neutron in admin context' - - - name: neutron_admin_auth_url - type: string - default: 'http://localhost:5000/v2.0' - help: 'auth url for connecting to neutron in admin context' - - - name: neutron_api_insecure - type: boolean - default: False - help: 'if set, ignore any SSL validation issues' - - - name: neutron_auth_strategy - type: string - default: 'keystone' - help: 'auth strategy for connecting to neutron in admin context' - - - name: neutron_ovs_bridge - type: string - default: 'br-int' - help: 'Name of Integration Bridge used by Open vSwitch' - - - name: neutron_extension_sync_interval - type: integer - default: 600 - help: 'Number of seconds before querying neutron for extensions' - - - name: neutron_ca_certificates_file - type: string - default: ~ - help: 'Location of ca certicates file to use for neutronclient requests.' - - - name: dhcp_options_enabled - type: boolean - default: False - help: 'Use per-port DHCP options with Neutron' - - - name: network_topic - type: string - default: 'network' - help: 'the topic network nodes listen on' - - - name: multi_host - type: boolean - default: False - help: 'Default value for multi_host in networks. Also, if set, some rpc network calls will be sent directly to host.' - - - name: security_group_api - type: string - default: 'nova' - help: 'The full class name of the security API class' - - - name: buckets_path - type: string - default: '$state_path/buckets' - help: 'path to s3 buckets' - - - name: s3_listen - type: string - default: '0.0.0.0' - help: 'IP address for S3 API to listen' - - - name: s3_listen_port - type: integer - default: 3333 - help: 'port for s3 api to listen' - - - name: sqlite_db - type: string - default: 'nova.sqlite' - help: 'the filename to use with sqlite' - - - name: sqlite_synchronous - type: boolean - default: True - help: 'If true, use synchronous mode for sqlite' - - - name: backdoor_port - type: string - default: ~ - help: "Enable eventlet backdoor. Acceptable values are 0, and :, where 0 results in listening on a random tcp port number, results in listening on the specified port number and not enabling backdoorif it is in use and : results in listening on the smallest unused port number within the specified range of port numbers. The chosen port is displayed in the service's log file." - - - name: disable_process_locking - type: boolean - default: False - help: 'Whether to disable inter-process locks' - - - name: lock_path - type: string - default: ~ - help: 'Directory to use for lock files.' - - - name: debug - type: boolean - default: False - help: 'Print debugging output' - - - name: verbose - type: boolean - default: False - help: 'Print more verbose output' - - - name: use_stderr - type: boolean - default: True - help: 'Log output to standard error' - - - name: logging_context_format_string - type: string - 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' - - - name: logging_default_format_string - type: string - default: '%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s' - help: 'format string to use for log messages without context' - - - name: logging_debug_format_suffix - type: string - default: '%(funcName)s %(pathname)s:%(lineno)d' - help: 'data to append to log format when level is DEBUG' - - - name: logging_exception_prefix - type: string - default: '%(asctime)s.%(msecs)03d %(process)d TRACE %(name)s %(instance)s' - help: 'prefix each line of exception output with this format' - - - name: default_log_levels - type: list - default: 'amqplibWARN,sqlalchemyWARN,botoWARN,sudsINFO,keystoneINFO,eventlet.wsgi.serverWARN' - help: 'list of logger=LEVEL pairs' - - - name: publish_errors - type: boolean - default: False - help: 'publish error events' - - - name: fatal_deprecations - type: boolean - default: False - help: 'make deprecations fatal' - - - name: instance_format - type: string - default: '"[instance: %(uuid)s] "' - help: 'If an instance is passed with the log message, format it like this' - - - name: instance_uuid_format - type: string - default: '"[instance: %(uuid)s] "' - help: 'If an instance UUID is passed with the log message, format it like this' - - - name: log_config - type: string - default: ~ - help: 'If this option is specified, the logging configuration file specified is used and overrides any other logging options specified. Please see the Python logging module documentation for details on logging configuration files.' - - - name: log_format - type: string - default: ~ - help: 'DEPRECATED. A logging.Formatter log message format string which may use any of the available logging.LogRecord attributes. This option is deprecated. Please use logging_context_format_string and logging_default_format_string instead.' - - - name: log_date_format - type: string - default: '%Y-%m-%d %H:%M:%S' - help: 'Format string for %%(asctime)s in log records. Default: %(default)s' - - - name: log_file - type: string - default: ~ - help: '(Optional) Name of log file to output to. If no default is set, logging will go to stdout.' - - - name: log_dir - type: string - default: ~ - help: '(Optional) The base directory used for relative --log-file paths' - - - name: use_syslog - type: boolean - default: False - help: 'Use syslog for logging.' - - - name: syslog_log_facility - type: string - default: 'LOG_USER' - help: 'syslog facility to receive log lines' - - - name: memcached_servers - type: list - default: ~ - help: 'Memcached servers or None for in process cache.' - - - name: notification_driver - type: multi - default: '' - help: 'Driver or drivers to handle sending notifications' - - - name: default_notification_level - type: string - default: 'INFO' - help: 'Default notification level for outgoing notifications' - - - name: default_publisher_id - type: string - default: ~ - help: 'Default publisher_id for outgoing notifications' - - - name: notification_topics - type: list - default: 'notifications' - help: 'AMQP topic used for OpenStack notifications' - - - name: run_external_periodic_tasks - type: boolean - default: True - help: 'Some periodic tasks can be run in a separate process. Should we run them here?' - - - name: rpc_backend - type: string - default: 'nova.openstack.common.rpc.impl_kombu' - help: 'The messaging module to use, defaults to kombu.' - - - name: rpc_thread_pool_size - type: integer - default: 64 - help: 'Size of RPC thread pool' - - - name: rpc_conn_pool_size - type: integer - default: 30 - help: 'Size of RPC connection pool' - - - name: rpc_response_timeout - type: integer - default: 60 - help: 'Seconds to wait for a response from call or multicall' - - - name: rpc_cast_timeout - type: integer - default: 30 - help: 'Seconds to wait before a cast expires' - - - name: allowed_rpc_exception_modules - type: list - default: 'nova.exception,cinder.exception,exceptions' - help: 'Modules of exceptions that are permitted to be recreatedupon receiving exception data from an rpc call.' - - - name: fake_rabbit - type: boolean - default: False - help: 'If passed, use a fake RabbitMQ provider' - - - name: control_exchange - type: string - default: 'openstack' - help: 'AMQP exchange to connect to if using RabbitMQ or Qpid' - - - name: amqp_durable_queues - type: boolean - default: False - help: 'Use durable queues in amqp.' - - - name: amqp_auto_delete - type: boolean - default: False - help: 'Auto-delete queues in amqp.' - - - name: kombu_ssl_version - type: string - default: '' - help: 'SSL version to use' - - - name: kombu_ssl_keyfile - type: string - default: '' - help: 'SSL key file' - - - name: kombu_ssl_certfile - type: string - default: '' - help: 'SSL cert file' - - - name: kombu_ssl_ca_certs - type: string - default: '' - help: 'SSL certification authority file' - - - name: rabbit_host - type: string - default: 'localhost' - help: 'The RabbitMQ broker address where a single node is used' - - - name: rabbit_port - type: integer - default: 5672 - help: 'The RabbitMQ broker port where a single node is used' - - - name: rabbit_hosts - type: list - default: '$rabbit_host:$rabbit_port' - help: 'RabbitMQ HA cluster host:port pairs' - - - name: rabbit_use_ssl - type: boolean - default: False - help: 'connect over SSL for RabbitMQ' - - - name: rabbit_userid - type: string - default: 'guest' - help: 'the RabbitMQ userid' - - - name: rabbit_password - type: string - default: 'guest' - help: 'the RabbitMQ password' - - - name: rabbit_virtual_host - type: string - default: '/' - help: 'the RabbitMQ virtual host' - - - name: rabbit_retry_interval - type: integer - default: 1 - help: 'how frequently to retry connecting with RabbitMQ' - - - name: rabbit_retry_backoff - type: integer - default: 2 - help: 'how long to backoff for between retries when connecting to RabbitMQ' - - - name: rabbit_max_retries - type: integer - default: 0 - help: 'maximum retries with trying to connect to RabbitMQ' - - - name: rabbit_ha_queues - type: boolean - default: False - help: 'use H/A queues in RabbitMQ' - - - name: qpid_hostname - type: string - default: 'localhost' - help: 'Qpid broker hostname' - - - name: qpid_port - type: integer - default: 5672 - help: 'Qpid broker port' - - - name: qpid_hosts - type: list - default: '$qpid_hostname:$qpid_port' - help: 'Qpid HA cluster host:port pairs' - - - name: qpid_username - type: string - default: '' - help: 'Username for qpid connection' - - - name: qpid_password - type: string - default: '' - help: 'Password for qpid connection' - - - name: qpid_sasl_mechanisms - type: string - default: '' - help: 'Space separated list of SASL mechanisms to use for auth' - - - name: qpid_heartbeat - type: integer - default: 60 - help: 'Seconds between connection keepalive heartbeats' - - - name: qpid_protocol - type: string - default: 'tcp' - help: "Transport to use, either 'tcp' or 'ssl'" - - - name: qpid_tcp_nodelay - type: boolean - default: True - help: 'Disable Nagle algorithm' - - - name: qpid_topology_version - type: integer - default: 1 - help: 'The qpid topology version to use. Version 1 is what was originally used by impl_qpid. Version 2 includes some backwards-incompatible changes that allow broker federation to work. Users should update to version 2 when they are able to take everything down, as it requires a clean break.' - - - name: rpc_zmq_bind_address - type: string - default: '*' - help: 'ZeroMQ bind address. Should be a wildcard' - - - name: rpc_zmq_matchmaker - type: string - default: 'nova.openstack.common.rpc.matchmaker.MatchMakerLocalhost' - help: 'MatchMaker driver' - - - name: rpc_zmq_port - type: integer - default: 9501 - help: 'ZeroMQ receiver listening port' - - - name: rpc_zmq_contexts - type: integer - default: 1 - help: 'Number of ZeroMQ contexts, defaults to 1' - - - name: rpc_zmq_topic_backlog - type: integer - default: ~ - help: 'Maximum number of ingress messages to locally buffer per topic. Default is unlimited.' - - - name: rpc_zmq_ipc_dir - type: string - default: '/var/run/openstack' - help: 'Directory for holding IPC sockets' - - - name: rpc_zmq_host - type: string - default: 'nova' - help: "Name of this node. Must be a valid hostname, FQDN, or IP address. Must match 'host' option, if running nova." - - - name: matchmaker_heartbeat_freq - type: integer - default: 300 - help: 'Heartbeat frequency' - - - name: matchmaker_heartbeat_ttl - type: integer - default: 600 - help: 'Heartbeat time-to-live.' - - - name: pci_alias - type: multi - default: '' - help: "An alias for a PCI passthrough device requirement. This allows users to specify the alias in the extra_spec for a flavor, without needing to repeat all the PCI property requirements. For example: pci_alias = { 'name': 'QuicAssist', 'product_id': '0443', 'vendor_id': '8086', 'device_type': 'ACCEL' } defines an alias for the Intel QuickAssist card." - - - name: pci_passthrough_whitelist - type: multi - default: '' - help: "White list of PCI devices available to VMs. For example: pci_passthrough_whitelist = [{'vendor_id': '8086', 'product_id': '0443'}]" - - - name: scheduler_host_manager - type: string - default: 'nova.scheduler.host_manager.HostManager' - help: 'The scheduler host manager class to use' - - - name: scheduler_max_attempts - type: integer - default: 3 - help: 'Maximum number of attempts to schedule an instance' - - - name: scheduler_host_subset_size - type: integer - default: 1 - help: 'New instances will be scheduled on a host chosen randomly from a subset of the N best hosts. This property defines the subset size that a host is chosen from. A value of 1 chooses the first host returned by the weighing functions. This value must be at least 1. Any value less than 1 will be ignored, and 1 will be used instead' - - - name: cpu_allocation_ratio - type: float - default: 16.0 - help: 'Virtual CPU to physical CPU allocation ratio which affects all CPU filters. This configuration specifies a global ratio for CoreFilter. For AggregateCoreFilter, it will fall back to this configuration value if no per-aggregate setting found.' - - - name: disk_allocation_ratio - type: float - default: 1.0 - help: 'virtual disk to physical disk allocation ratio' - - - name: max_io_ops_per_host - type: integer - default: 8 - help: 'Ignore hosts that have too many builds/resizes/snaps/migrations' - - - name: isolated_images - type: list - default: '' - help: 'Images to run on isolated host' - - - name: isolated_hosts - type: list - default: '' - help: 'Host reserved for specific images' - - - name: restrict_isolated_hosts_to_isolated_images - type: boolean - default: True - help: 'Whether to force isolated hosts to run only isolated images' - - - name: max_instances_per_host - type: integer - default: 50 - help: 'Ignore hosts that have too many instances' - - - name: ram_allocation_ratio - type: float - default: 1.5 - help: 'Virtual ram to physical ram allocation ratio which affects all ram filters. This configuration specifies a global ratio for RamFilter. For AggregateRamFilter, it will fall back to this configuration value if no per-aggregate setting found.' - - - name: scheduler_available_filters - type: multi - default: 'nova.scheduler.filters.all_filters' - help: "Filter classes available to the scheduler which may be specified more than once. An entry of 'nova.scheduler.filters.standard_filters' maps to all filters included with nova." - - - name: scheduler_default_filters - type: list - default: 'RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter' - help: 'Which filter class names to use for filtering hosts when not specified in the request.' - - - name: cells.scheduler_weight_classes - type: list - default: 'nova.cells.weights.all_weighers' - help: "Weigher classes the cells scheduler should use. An entry of 'nova.cells.weights.all_weighers' maps to all cell weighers included with nova_2013_1_3." - - - name: scheduler_driver - type: string - default: 'nova.scheduler.filter_scheduler.FilterScheduler' - help: 'Default driver to use for the scheduler' - - - name: scheduler_topic - type: string - default: 'scheduler' - help: 'the topic scheduler nodes listen on' - - - name: scheduler_json_config_location - type: string - default: '' - help: 'Absolute path to scheduler configuration JSON file.' - - - name: cells.ram_weight_multiplier - type: float - default: 10.0 - help: 'Multiplier used for weighing ram. Negative numbers mean to stack vs spread.' - - - name: servicegroup_driver - type: string - default: 'db' - help: 'The driver for servicegroup service' - - - name: config_drive_format - type: string - default: 'iso9660' - help: 'Config drive format. One of iso9660' - - - name: config_drive_tempdir - type: string - default: ~ - help: 'Where to put temporary files associated with config drive creation' - - - name: force_config_drive - type: string - default: ~ - help: 'Set to force injection to take place on a config drive' - - - name: mkisofs_cmd - type: string - default: 'genisoimage' - help: 'Name and optionally path of the tool used for ISO image creation' - - - name: baremetal.injected_network_template - type: string - default: '$pybasedir/nova/virt/baremetal/interfaces.template' - help: 'Template file for injected network' - - - name: virt_mkfs - type: string - default: 'windowsmkfs.ntfs --force --fast --label %(fs_label)s %(target)s' - - - name: resize_fs_using_block_device - type: boolean - default: True - help: 'Attempt to resize the filesystem by accessing the image over a block device. This is done by the host and may not be necessary if the image contains a recent version of cloud- init. Possible mechanisms require the nbd driver' - - - name: timeout_nbd - type: integer - default: 10 - help: 'time to wait for a NBD device coming up' - - - name: docker_registry_default_port - type: integer - default: 5042 - help: 'Default TCP port to find the docker-registry container' - - - name: compute_driver - type: string - default: ~ - help: 'Driver to use for controlling virtualization. Options include: libvirt.LibvirtDriver, xenapi.XenAPIDriver, fake.FakeDriver, baremetal.BareMetalDriver, vmwareapi.VMwareESXDriver, vmwareapi.VMwareVCDriver' - - - name: default_ephemeral_format - type: string - default: ~ - help: 'The default format an ephemeral_volume will be formatted with on creation.' - - - name: preallocate_images - type: string - default: 'none' - help: "VM image preallocation mode: 'none' => no storage provisioning is done up front, 'space' => storage is fully allocated at instance start" - - - name: use_cow_images - type: boolean - default: True - help: 'Whether to use cow images' - - - name: firewall_driver - type: string - default: ~ - help: 'Firewall driver' - - - name: allow_same_net_traffic - type: boolean - default: True - help: 'Whether to allow network traffic from same network' - - - name: force_raw_images - type: boolean - default: True - help: 'Force backing images to raw format' - - - name: rescue_image_id - type: string - default: ~ - help: 'Rescue ami image' - - - name: rescue_kernel_id - type: string - default: ~ - help: 'Rescue aki image' - - - name: rescue_ramdisk_id - type: string - default: ~ - help: 'Rescue ari image' - - - name: libvirt_type - type: string - default: 'kvm' - help: 'Libvirt domain type' - - - name: libvirt_uri - type: string - default: '' - help: 'Override the default libvirt URI' - - - name: libvirt_inject_password - type: boolean - default: False - help: 'Inject the admin password at boot time, without an agent.' - - - name: libvirt_inject_key - type: boolean - default: True - help: 'Inject the ssh public key at boot time' - - - name: libvirt_inject_partition - type: integer - default: 1 - help: 'The partition to inject to : -2 => disable, -1 => inspect' - - - name: use_usb_tablet - type: boolean - default: True - help: 'Sync virtual and real mouse cursors in Windows VMs' - - - name: live_migration_uri - type: string - default: 'qemu+tcp://%s/system' - help: 'Migration target URI' - - - name: live_migration_flag - type: string - default: 'VIR_MIGRATE_UNDEFINE_SOURCE, VIR_MIGRATE_PEER2PEER' - help: 'Migration flags to be set for live migration' - - - name: block_migration_flag - type: string - default: 'VIR_MIGRATE_UNDEFINE_SOURCE, VIR_MIGRATE_PEER2PEER, VIR_MIGRATE_NON_SHARED_INC' - help: 'Migration flags to be set for block migration' - - - name: live_migration_bandwidth - type: integer - default: 0 - help: 'Maximum bandwidth to be used during migration, in Mbps' - - - name: snapshot_image_format - type: string - default: ~ - help: 'Snapshot image format' - - - name: libvirt_vif_driver - type: string - default: 'nova.virt.libvirt.vif.LibvirtGenericVIFDriver' - help: 'The libvirt VIF driver to configure the VIFs.' - - - name: libvirt_volume_drivers - type: list - default: 'iscsinova.virt.libvirt.volume.LibvirtISCSIVolumeDriver,isernova.virt.libvirt.volume.LibvirtISERVolumeDriver,localnova.virt.libvirt.volume.LibvirtVolumeDriver,fakenova.virt.libvirt.volume.LibvirtFakeVolumeDriver,rbdnova.virt.libvirt.volume.LibvirtNetVolumeDriver,sheepdognova.virt.libvirt.volume.LibvirtNetVolumeDriver,nfsnova.virt.libvirt.volume.LibvirtNFSVolumeDriver,aoenova.virt.libvirt.volume.LibvirtAOEVolumeDriver,glusterfsnova.virt.libvirt.volume.LibvirtGlusterfsVolumeDriver,fibre_channelnova.virt.libvirt.volume.LibvirtFibreChannelVolumeDriver,scalitynova.virt.libvirt.volume.LibvirtScalityVolumeDriver' - help: 'Libvirt handlers for remote volumes.' - - - name: libvirt_disk_prefix - type: string - default: ~ - help: 'Override the default disk prefix for the devices attached to a server, which is dependent on libvirt_type.' - - - name: libvirt_wait_soft_reboot_seconds - type: integer - default: 120 - help: 'Number of seconds to wait for instance to shut down after soft reboot request is made. We fall back to hard reboot if instance does not shutdown within this window.' - - - name: libvirt_nonblocking - type: boolean - default: True - help: 'Use a separated OS thread pool to realize non-blocking libvirt calls' - - - name: libvirt_cpu_mode - type: string - default: ~ - help: "Set to 'host-model' to clone the host CPU feature flags; to 'host-passthrough' to use the host CPU model exactly; to 'custom' to use a named CPU model; to 'none' to not set any CPU model. If libvirt_type='kvm|qemu', it will default to 'host-model', otherwise it will default to 'none'" - - - name: libvirt_cpu_model - type: string - default: ~ - help: 'Set to a named libvirt CPU model' - - - name: libvirt_snapshots_directory - type: string - default: '$instances_path/snapshots' - help: 'Location where libvirt driver will store snapshots before uploading them to image service' - - - name: xen_hvmloader_path - type: string - default: '/usr/lib/xen/boot/hvmloader' - help: 'Location where the Xen hvmloader is kept' - - - name: disk_cachemodes - type: list - default: '' - help: "Specific cachemodes to use for different disk types e.g: ['file=directsync','block=none']" - - - name: vcpu_pin_set - type: string - default: ~ - help: "Which pcpus can be used by vcpus of instance e.g: '4-12,^8,15'" - - - name: libvirt_images_type - type: string - default: 'default' - help: 'VM Images format. Acceptable values are: raw, qcow2, lvm,rbd, default. If default is specified, then use_cow_images flag is used instead of this one.' - - - name: libvirt_images_volume_group - type: string - default: ~ - help: 'LVM Volume Group that is used for VM images, when you specify libvirt_images_type=lvm.' - - - name: libvirt_sparse_logical_volumes - type: boolean - default: False - help: 'Create sparse logical volumes' - - - name: libvirt_lvm_snapshot_size - type: integer - default: 1000 - help: 'The amount of storage' - - - name: libvirt_images_rbd_pool - type: string - default: 'rbd' - help: 'the RADOS pool in which rbd volumes are stored' - - - name: libvirt_images_rbd_ceph_conf - type: string - default: '' - help: 'path to the ceph configuration file to use' - - - name: base_dir_name - type: string - default: '_base' - help: 'Where cached images are stored under $instances_path.This is NOT the full path - just a folder name.For per-compute-host cached images, set to _base_$my_ip' - - - name: image_info_filename_pattern - type: string - default: '$instances_path/$base_dir_name/%(image)s.info' - help: 'Allows image information files to be stored in non-standard locations' - - - name: remove_unused_base_images - type: boolean - default: True - help: 'Should unused base images be removed?' - - - name: remove_unused_kernels - type: boolean - default: False - help: 'Should unused kernel images be removed? This is only safe to enable if all compute nodes have been updated to support this option. This will enabled by default in future.' - - - name: remove_unused_resized_minimum_age_seconds - type: integer - default: 3600 - help: 'Unused resized base images younger than this will not be removed' - - - name: remove_unused_original_minimum_age_seconds - type: integer - default: 86400 - help: 'Unused unresized base images younger than this will not be removed' - - - name: checksum_base_images - type: boolean - default: False - help: 'Write a checksum for files in _base to disk' - - - name: checksum_interval_seconds - type: integer - default: 3600 - help: 'How frequently to checksum base images' - - - name: libvirt_snapshot_compression - type: boolean - default: False - help: 'Compress snapshot images when possible. This currently applies exclusively to qcow2 images' - - - name: libvirt_ovs_bridge - type: string - default: 'br-int' - help: 'Name of Integration Bridge used by Open vSwitch' - - - name: libvirt_use_virtio_for_bridges - type: boolean - default: True - help: 'Use virtio for bridge interfaces with KVM/QEMU' - - - name: num_iscsi_scan_tries - type: integer - default: 3 - help: 'number of times to rescan iSCSI target to find volume' - - - name: num_iser_scan_tries - type: integer - default: 3 - help: 'number of times to rescan iSER target to find volume' - - - name: rbd_user - type: string - default: ~ - help: 'the RADOS client name for accessing rbd volumes' - - - name: rbd_secret_uuid - type: string - default: ~ - help: 'the libvirt uuid of the secret for the rbd_uservolumes' - - - name: nfs_mount_point_base - type: string - default: '$state_path/mnt' - help: 'Dir where the nfs volume is mounted on the compute node' - - - name: nfs_mount_options - type: string - default: ~ - help: 'Mount options passed to the nfs client. See section of the nfs man page for details' - - - name: num_aoe_discover_tries - type: integer - default: 3 - help: 'number of times to rediscover AoE target to find volume' - - - name: glusterfs_mount_point_base - type: string - default: '$state_path/mnt' - help: 'Dir where the glusterfs volume is mounted on the compute node' - - - name: libvirt_iscsi_use_multipath - type: boolean - default: False - help: 'use multipath connection of the iSCSI volume' - - - name: libvirt_iser_use_multipath - type: boolean - default: False - help: 'use multipath connection of the iSER volume' - - - name: scality_sofs_config - type: string - default: ~ - help: 'Path or URL to Scality SOFS configuration file' - - - name: scality_sofs_mount_point - type: string - default: '$state_path/scality' - help: 'Base dir where Scality SOFS shall be mounted' - - - name: qemu_allowed_storage_drivers - type: list - default: '' - help: 'Protocols listed here will be accessed directly from QEMU. Currently supported protocols: [gluster]' - - - name: powervm_mgr_type - type: string - default: 'ivm' - help: 'PowerVM manager type' - - - name: powervm_mgr - type: string - default: ~ - help: 'PowerVM manager host or ip' - - - name: powervm_mgr_user - type: string - default: ~ - help: 'PowerVM manager user name' - - - name: powervm_mgr_passwd - type: string - default: ~ - help: 'PowerVM manager user password' - - - name: powervm_img_remote_path - type: string - default: '/home/padmin' - help: 'PowerVM image remote path where images will be moved. Make sure this path can fit your biggest image in glance' - - - name: powervm_img_local_path - type: string - default: '/tmp' - help: 'Local directory to download glance images to. Make sure this path can fit your biggest image in glance' - - - name: agent_timeout - type: integer - default: 30 - help: 'number of seconds to wait for agent reply' - - - name: agent_version_timeout - type: integer - default: 300 - help: 'number of seconds to wait for agent to be fully operational' - - - name: agent_resetnetwork_timeout - type: integer - default: 60 - help: 'number of seconds to wait for agent reply to resetnetwork request' - - - name: xenapi_agent_path - type: string - default: 'usr/sbin/xe-update-networking' - help: 'Specifies the path in which the xenapi guest agent should be located. If the agent is present, network configuration is not injected into the image. Used if compute_driver=xenapi.XenAPIDriver and flat_injected=True' - - - name: xenapi_disable_agent - type: boolean - default: False - help: 'Disables the use of the XenAPI agent in any image regardless of what image properties are present. ' - - - name: xenapi_use_agent_default - type: boolean - default: False - help: "Determines if the xenapi agent should be used when the image used does not contain a hint to declare if the agent is present or not. The hint is a glance property 'xenapi_use_agent' that has the value 'true' or 'false'. Note that waiting for the agent when it is not present will significantly increase server boot times." - - - name: xenapi_connection_url - type: string - default: ~ - help: 'URL for connection to XenServer/Xen Cloud Platform. A special value of unix://local can be used to connect to the local unix socket. Required if compute_driver=xenapi.XenAPIDriver' - - - name: xenapi_connection_username - type: string - default: 'root' - help: 'Username for connection to XenServer/Xen Cloud Platform. Used only if compute_driver=xenapi.XenAPIDriver' - - - name: xenapi_connection_password - type: string - default: ~ - help: 'Password for connection to XenServer/Xen Cloud Platform. Used only if compute_driver=xenapi.XenAPIDriver' - - - name: xenapi_connection_concurrent - type: integer - default: 5 - help: 'Maximum number of concurrent XenAPI connections. Used only if compute_driver=xenapi.XenAPIDriver' - - - name: xenapi_vhd_coalesce_poll_interval - type: float - default: 5.0 - help: 'The interval used for polling of coalescing vhds. Used only if compute_driver=xenapi.XenAPIDriver' - - - name: xenapi_check_host - type: boolean - default: True - help: 'Ensure compute service is running on host XenAPI connects to.' - - - name: xenapi_vhd_coalesce_max_attempts - type: integer - default: 5 - help: 'Max number of times to poll for VHD to coalesce. Used only if compute_driver=xenapi.XenAPIDriver' - - - name: xenapi_sr_base_path - type: string - default: '/var/run/sr-mount' - help: 'Base path to the storage repository' - - - name: target_host - type: string - default: ~ - help: 'iSCSI Target Host' - - - name: target_port - type: string - default: '3260' - help: 'iSCSI Target Port, 3260 Default' - - - name: iqn_prefix - type: string - default: 'iqn.2010-10.org.openstack' - help: 'IQN Prefix' - - - name: xenapi_remap_vbd_dev - type: boolean - default: False - help: 'Used to enable the remapping of VBD dev' - - - name: xenapi_remap_vbd_dev_prefix - type: string - default: 'sd' - help: 'Specify prefix to remap VBD dev to' - - - name: xenapi_login_timeout - type: integer - default: 10 - help: 'Timeout in seconds for XenAPI login.' - - - name: xenapi_torrent_base_url - type: string - default: ~ - help: 'Base URL for torrent files.' - - - name: xenapi_torrent_seed_chance - type: float - default: 1.0 - help: 'Probability that peer will become a seeder.' - - - name: xenapi_torrent_seed_duration - type: integer - default: 3600 - help: 'Number of seconds after downloading an image via BitTorrent that it should be seeded for other peers.' - - - name: xenapi_torrent_max_last_accessed - type: integer - default: 86400 - help: 'Cached torrent files not accessed within this number of seconds can be reaped' - - - name: xenapi_torrent_listen_port_start - type: integer - default: 6881 - help: 'Beginning of port range to listen on' - - - name: xenapi_torrent_listen_port_end - type: integer - default: 6891 - help: 'End of port range to listen on' - - - name: xenapi_torrent_download_stall_cutoff - type: integer - default: 600 - help: 'Number of seconds a download can remain at the same progress percentage w/o being considered a stall' - - - name: xenapi_torrent_max_seeder_processes_per_host - type: integer - default: 1 - help: 'Maximum number of seeder processes to run concurrently within a given dom0.' - - - name: use_join_force - type: boolean - default: True - help: 'To use for hosts with different CPUs' - - - name: xenapi_ovs_integration_bridge - type: string - default: 'xapi1' - help: 'Name of Integration Bridge used by Open vSwitch' - - - name: cache_images - type: string - default: 'all' - help: 'Cache glance images locally. `all` will cache all images, `some` will only cache images that have the image_property `cache_in_nova=True`, and `none` turns off caching entirely' - - - name: xenapi_image_compression_level - type: integer - default: ~ - help: 'Compression level for images, e.g., 9 for gzip -9. Range is 1-9, 9 being most compressed but most CPU intensive on dom0.' - - - name: default_os_type - type: string - default: 'linux' - help: 'Default OS type' - - - name: block_device_creation_timeout - type: integer - default: 10 - help: 'Time to wait for a block device to be created' - - - name: max_kernel_ramdisk_size - type: integer - default: 16777216 - help: 'Maximum size in bytes of kernel or ramdisk images' - - - name: sr_matching_filter - type: string - default: 'default-sr:true' - help: 'Filter for finding the SR to be used to install guest instances on. To use the Local Storage in default XenServer/XCP installations set this flag to other-config :i18n-key=local-storage. To select an SR with a different matching criteria, you could set it to other- config:my_favorite_sr=true. On the other hand, to fall back on the Default SR, as displayed by XenCenter, set this flag to: default-sr:true' - - - name: xenapi_sparse_copy - type: boolean - default: True - help: 'Whether to use sparse_copy for copying data on a resize down' - - - name: xenapi_num_vbd_unplug_retries - type: integer - default: 10 - help: 'Maximum number of retries to unplug VBD' - - - name: xenapi_torrent_images - type: string - default: 'none' - help: 'Whether or not to download images via Bit Torrent' - - - name: xenapi_ipxe_network_name - type: string - default: ~ - help: 'Name of network to use for booting iPXE ISOs' - - - name: xenapi_ipxe_boot_menu_url - type: string - default: ~ - help: 'URL to the iPXE boot menu' - - - name: xenapi_ipxe_mkisofs_cmd - type: string - default: 'mkisofs' - help: 'Name and optionally path of the tool used for ISO image creation' - - - name: xenapi_running_timeout - type: integer - default: 60 - help: 'number of seconds to wait for instance to go to running state' - - - name: xenapi_vif_driver - type: string - default: 'nova.virt.xenapi.vif.XenAPIBridgeDriver' - help: 'The XenAPI VIF driver using XenServer Network APIs.' - - - name: xenapi_image_upload_handler - type: string - default: 'nova.virt.xenapi.image.glance.GlanceStore' - help: 'Dom0 plugin driver used to handle image uploads.' - - - name: novncproxy_base_url - type: string - default: 'http://127.0.0.1:6080/vnc_auto.html' - help: "location of vnc console proxy, in the form 'http://127.0.0.1:6080/vnc_auto.html'" - - - name: xvpvncproxy_base_url - type: string - default: 'http://127.0.0.1:6081/console' - help: "location of nova xvp vnc console proxy, in the form 'http://127.0.0.1:6081/console'" - - - name: vncserver_listen - type: string - default: '127.0.0.1' - help: 'IP address on which instance vncservers should listen' - - - name: vncserver_proxyclient_address - type: string - default: '127.0.0.1' - help: 'the address to which proxy clients' - - - name: vnc_enabled - type: boolean - default: True - help: 'enable vnc related features' - - - name: vnc_keymap - type: string - default: 'en-us' - help: 'keymap for vnc' - - - name: xvpvncproxy_port - type: integer - default: 6081 - help: 'Port that the XCP VNC proxy should bind to' - - - name: xvpvncproxy_host - type: string - default: '0.0.0.0' - help: 'Address that the XCP VNC proxy should bind to' - - - name: volume_api_class - type: string - default: 'nova.volume.cinder.API' - help: 'The full class name of the volume API class to use' - - - name: cinder_catalog_info - type: string - default: 'volume:cinder:publicURL' - help: 'Info to match when looking for cinder in the service catalog. Format is : separated values of the form: ::' - - - name: cinder_endpoint_template - type: string - default: ~ - help: 'Override service catalog lookup with template for cinder endpoint e.g. http://localhost:8776/v1/%(project_id)s' - - - name: os_region_name - type: string - default: ~ - help: 'region name of this node' - - - name: cinder_ca_certificates_file - type: string - default: ~ - help: 'Location of ca certicates file to use for cinder client requests.' - - - name: cinder_http_retries - type: integer - default: 3 - help: 'Number of cinderclient retries on failed http calls' - - - name: cinder_api_insecure - type: boolean - default: False - help: 'Allow to perform insecure SSL requests to cinder' - - - name: cinder_cross_az_attach - type: boolean - default: True - help: 'Allow attach between instance and volume in different availability zones.' - - - name: baremetal.sql_connection - type: string - default: 'sqlite:///$state_path/baremetal_$sqlite_db' - help: 'The SQLAlchemy connection string used to connect to the bare-metal database' - - - name: hyperv.instances_path_share - type: string - default: '' - help: "The name of a Windows share name mapped to the 'instances_path' dir and used by the resize feature to copy files to the target host. If left blank, an administrative share will be used, looking for the same 'instances_path' used locally" - - - name: hyperv.force_hyperv_utils_v1 - type: boolean - default: False - help: 'Force V1 WMI utility classes' - - - name: hyperv.force_volumeutils_v1 - type: boolean - default: False - help: 'Force V1 volume utility class' - - - name: hyperv.vswitch_name - type: string - default: ~ - help: 'External virtual switch Name, if not provided, the first external virtual switch is used' - - - name: hyperv.limit_cpu_features - type: boolean - default: False - help: 'Required for live migration among hosts with different CPU features' - - - name: hyperv.config_drive_inject_password - type: boolean - default: False - help: 'Sets the admin password in the config drive image' - - - name: hyperv.qemu_img_cmd - type: string - default: 'qemu-img.exe' - help: 'qemu-img is used to convert between different image types' - - - name: hyperv.config_drive_cdrom - type: boolean - default: False - help: 'Attaches the Config Drive image as a cdrom drive instead of a disk drive' - - - name: hyperv.enable_instance_metrics_collection - type: boolean - default: False - help: "Enables metrics collections for an instance by using Hyper-V's metric APIs. Collected data can by retrieved by other apps and services, e.g.: Ceilometer. Requires Hyper-V / Windows Server 2012 and above" - - - name: hyperv.dynamic_memory_ratio - type: float - default: 1.0 - help: 'Enables dynamic memory allocation' - - - name: hyperv.volume_attach_retry_count - type: integer - default: 10 - help: 'The number of times to retry to attach a volume' - - - name: hyperv.volume_attach_retry_interval - type: integer - default: 5 - help: 'Interval between volume attachment attempts, in seconds' - - - name: zookeeper.address - type: string - default: ~ - help: 'The ZooKeeper addresses for servicegroup service in the format of host1:port,host2:port,host3:port' - - - name: zookeeper.recv_timeout - type: integer - default: 4000 - help: 'recv_timeout parameter for the zk session' - - - name: zookeeper.sg_prefix - type: string - default: '/servicegroups' - help: 'The prefix used in ZooKeeper to store ephemeral nodes' - - - name: zookeeper.sg_retry_interval - type: integer - default: 5 - help: 'Number of seconds to wait until retrying to join the session' - - - name: spice.enabled - type: boolean - default: False - help: 'enable spice related features' - - - name: osapi_v3.extensions_blacklist - type: list - default: '' - help: 'A list of v3 API extensions to never load. Specify the extension aliases here.' - - - name: osapi_v3.extensions_whitelist - type: list - default: '' - help: 'If the list is not empty then a v3 API extension will only be loaded if it exists in this list. Specify the extension aliases here.' - - - name: conductor.use_local - type: boolean - default: False - help: 'Perform nova-conductor operations locally' - - - name: cells.topic - type: string - default: 'cells' - help: 'the topic cells nodes listen on' - - - name: cells.manager - type: string - default: 'nova.cells.manager.CellsManager' - help: 'Manager for cells' - - - name: conductor.workers - type: integer - default: ~ - help: 'Number of workers for OpenStack Conductor service' - - - name: keymgr.api_class - type: string - default: 'nova.keymgr.conf_key_mgr.ConfKeyManager' - help: 'The full class name of the key manager API class' - - - name: keymgr.fixed_key - type: string - default: ~ - help: 'Fixed key returned by key manager, specified in hex' - - - name: baremetal.driver - type: string - default: 'nova.virt.baremetal.pxe.PXE' - help: 'Baremetal driver back-end' - - - name: cells.instance_updated_at_threshold - type: integer - default: 3600 - help: 'Number of seconds after an instance was updated or deleted to continue to update cells' - - - name: cells.instance_update_num_instances - type: integer - default: 1 - help: 'Number of instances to update per periodic task run' - - - name: cells.max_hop_count - type: integer - default: 10 - help: 'Maximum number of hops for cells routing.' - - - name: upgrade_levels.scheduler - type: string - default: ~ - help: 'Set a version cap for messages sent to scheduler services' - - - name: cells.enable - type: boolean - default: False - help: 'Enable cell functionality' - - - name: cells.name - type: string - default: 'nova' - help: 'name of this cell' - - - name: cells.capabilities - type: list - default: 'hypervisorxenserver;kvm,oslinux;windows' - help: 'Key/Multi-value list with the capabilities of the cell' - - - name: cells.call_timeout - type: integer - default: 60 - help: 'Seconds to wait for response from a call to a cell.' - - - name: cells.reserve_percent - type: float - default: 10.0 - help: 'Percentage of cell capacity to hold in reserve. Affects both memory and disk utilization' - - - name: cells.cell_type - type: string - default: ~ - help: 'Type of cell: api or compute' - - - name: cells.mute_child_interval - type: integer - default: 300 - help: 'Number of seconds after which a lack of capability and capacity updates signals the child cell is to be treated as a mute.' - - - name: cells.bandwidth_update_interval - type: integer - default: 600 - help: 'Seconds between bandwidth updates for cells.' - - - name: cells.rpc_driver_queue_base - type: string - default: 'cells.intercell' - help: 'Base queue name to use when communicating between cells. Various topics by message type will be appended to this.' - - - name: cells.scheduler_filter_classes - type: list - default: 'nova.cells.filters.all_filters' - help: "Filter classes the cells scheduler should use. An entry of 'nova.cells.filters.all_filters' maps to all cells filters included with nova_2013_1_3." - - - name: cells.scheduler_retries - type: integer - default: 10 - help: 'How many retries when no cells are available.' - - - name: cells.scheduler_retry_delay - type: integer - default: 2 - help: 'How often to retry in seconds when no cells are available.' - - - name: cells.db_check_interval - type: integer - default: 60 - help: 'Seconds between getting fresh cell info from db.' - - - name: cells.cells_config - type: string - default: ~ - help: 'Configuration file from which to read cells configuration. If given, overrides reading cells from the database.' - - - name: cells.mute_weight_multiplier - type: float - default: -10.0 - help: 'Multiplier used to weigh mute children. ' - - - name: cells.mute_weight_value - type: float - default: 1000.0 - help: 'Weight value assigned to mute children. ' - - - name: database.backend - type: string - default: 'sqlalchemy' - help: 'The backend to use for db' - - - name: database.use_tpool - type: boolean - default: False - help: 'Enable the experimental use of thread pooling for all DB API calls' - - - name: database.connection - type: string - default: 'sqlite:////nova/openstack/common/db/$sqlite_db' - help: 'The SQLAlchemy connection string used to connect to the database' - - - name: database.slave_connection - type: string - default: '' - help: 'The SQLAlchemy connection string used to connect to the slave database' - - - name: database.idle_timeout - type: integer - default: 3600 - help: 'timeout before idle sql connections are reaped' - - - name: database.min_pool_size - type: integer - default: 1 - help: 'Minimum number of SQL connections to keep open in a pool' - - - name: database.max_pool_size - type: integer - default: ~ - help: 'Maximum number of SQL connections to keep open in a pool' - - - name: database.max_retries - type: integer - default: 10 - help: 'maximum db connection retries during startup.' - - - name: database.retry_interval - type: integer - default: 10 - help: 'interval between retries of opening a sql connection' - - - name: database.max_overflow - type: integer - default: ~ - help: 'If set, use this value for max_overflow with sqlalchemy' - - - name: database.connection_debug - type: integer - default: 0 - help: 'Verbosity of SQL debugging information. 0=None, 100=Everything' - - - name: database.connection_trace - type: boolean - default: False - help: 'Add python stack traces to SQL as comment strings' - - - name: database.pool_timeout - type: integer - default: ~ - help: 'If set, use this value for pool_timeout with sqlalchemy' - - - name: image_file_url.filesystems - type: list - default: '' - help: 'A list of filesystems that will be configured in this file under the sections image_file_url:' - - - name: baremetal.db_backend - type: string - default: 'sqlalchemy' - help: 'The backend to use for bare-metal database' - - - name: baremetal.inject_password - type: boolean - default: True - help: 'Whether baremetal compute injects password or not' - - - name: baremetal.vif_driver - type: string - default: 'nova.virt.baremetal.vif_driver.BareMetalVIFDriver' - help: 'Baremetal VIF driver.' - - - name: baremetal.volume_driver - type: string - default: 'nova.virt.baremetal.volume_driver.LibvirtVolumeDriver' - help: 'Baremetal volume driver.' - - - name: baremetal.instance_type_extra_specs - type: list - default: '' - help: "a list of additional capabilities corresponding to instance_type_extra_specs for this compute host to advertise. Valid entries are name=value, pairsFor example, 'key1:val1, key2:val2'" - - - name: baremetal.power_manager - type: string - default: 'nova.virt.baremetal.ipmi.IPMI' - help: 'Baremetal power management method' - - - name: baremetal.tftp_root - type: string - default: '/tftpboot' - help: "Baremetal compute node's tftp root path" - - - name: baremetal.terminal - type: string - default: 'shellinaboxd' - help: 'path to baremetal terminal program' - - - name: baremetal.terminal_cert_dir - type: string - default: ~ - help: 'path to baremetal terminal SSL cert(PEM)' - - - name: baremetal.terminal_pid_dir - type: string - default: '$state_path/baremetal/console' - help: 'path to directory stores pidfiles of baremetal_terminal' - - - name: baremetal.ipmi_power_retry - type: integer - default: 5 - help: 'maximal number of retries for IPMI operations' - - - name: baremetal.deploy_kernel - type: string - default: ~ - help: 'Default kernel image ID used in deployment phase' - - - name: baremetal.deploy_ramdisk - type: string - default: ~ - help: 'Default ramdisk image ID used in deployment phase' - - - name: baremetal.net_config_template - type: string - default: '$pybasedir/nova/virt/baremetal/net-dhcp.ubuntu.template' - help: 'Template file for injected network config' - - - name: baremetal.pxe_append_params - type: string - default: ~ - help: 'additional append parameters for baremetal PXE boot' - - - name: baremetal.pxe_config_template - type: string - default: '$pybasedir/nova/virt/baremetal/pxe_config.template' - help: 'Template file for PXE configuration' - - - name: baremetal.pxe_deploy_timeout - type: integer - default: 0 - help: 'Timeout for PXE deployments. Default: 0' - - - name: baremetal.pxe_network_config - type: boolean - default: False - help: 'If set, pass the network configuration details to the initramfs via cmdline.' - - - name: baremetal.pxe_bootfile_name - type: string - default: 'pxelinux.0' - help: 'This gets passed to Neutron as the bootfile dhcp parameter when the dhcp_options_enabled is set.' - - - name: baremetal.tile_pdu_ip - type: string - default: '10.0.100.1' - help: 'ip address of tilera pdu' - - - name: baremetal.tile_pdu_mgr - type: string - default: '/tftpboot/pdu_mgr' - help: 'management script for tilera pdu' - - - name: baremetal.tile_pdu_off - type: integer - default: 2 - help: 'power status of tilera PDU is OFF' - - - name: baremetal.tile_pdu_on - type: integer - default: 1 - help: 'power status of tilera PDU is ON' - - - name: baremetal.tile_pdu_status - type: integer - default: 9 - help: 'power status of tilera PDU' - - - name: baremetal.tile_power_wait - type: integer - default: 9 - help: 'wait time in seconds until check the result after tilera power operations' - - - name: baremetal.virtual_power_ssh_host - type: string - default: '' - help: 'ip or name to virtual power host' - - - name: baremetal.virtual_power_ssh_port - type: integer - default: 22 - help: 'Port to use for ssh to virtual power host' - - - name: baremetal.virtual_power_type - type: string - default: 'virsh' - help: 'base command to use for virtual power(vbox,virsh)' - - - name: baremetal.virtual_power_host_user - type: string - default: '' - help: 'user to execute virtual power commands as' - - - name: baremetal.virtual_power_host_pass - type: string - default: '' - help: 'password for virtual power host_user' - - - name: baremetal.virtual_power_host_key - type: string - default: ~ - help: 'ssh key for virtual power host_user' - - - name: baremetal.use_unsafe_iscsi - type: boolean - default: False - help: 'Do not set this out of dev/test environments. If a node does not have a fixed PXE IP address, volumes are exported with globally opened ACL' - - - name: baremetal.iscsi_iqn_prefix - type: string - default: 'iqn.2010-10.org.openstack.baremetal' - help: 'iSCSI IQN prefix used in baremetal volume connections.' - - - name: rpc_notifier2.topics - type: list - default: 'notifications' - help: 'AMQP topic(s) used for OpenStack notifications' - - - name: matchmaker_redis.port - type: integer - default: 6379 - help: 'Use this port to connect to redis host.' - - - name: matchmaker_redis.password - type: string - default: ~ - help: 'Password for Redis server.' - - - name: ssl.cert_file - type: string - default: ~ - help: 'Certificate file to use when starting the server securely' - - - name: trusted_computing.attestation_server - type: string - default: ~ - help: 'attestation server http' - - - name: trusted_computing.attestation_server_ca_file - type: string - default: ~ - help: 'attestation server Cert file for Identity verification' - - - name: trusted_computing.attestation_port - type: string - default: '8443' - help: 'attestation server port' - - - name: trusted_computing.attestation_api_url - type: string - default: '/OpenAttestationWebServices/V1.0' - help: 'attestation web API URL' - - - name: trusted_computing.attestation_auth_blob - type: string - default: ~ - help: 'attestation authorization blob - must change' - - - name: trusted_computing.attestation_auth_timeout - type: integer - default: 60 - help: 'Attestation status cache valid period length' - - - name: upgrade_levels.baseapi - type: string - default: ~ - help: 'Set a version cap for messages sent to the base api in any service' - - - name: upgrade_levels.intercell - type: string - default: ~ - help: 'Set a version cap for messages sent between cells services' - - - name: upgrade_levels.cells - type: string - default: ~ - help: 'Set a version cap for messages sent to local cells services' - - - name: upgrade_levels.compute - type: string - default: ~ - help: 'Set a version cap for messages sent to compute services' - - - name: upgrade_levels.conductor - type: string - default: ~ - help: 'Set a version cap for messages sent to conductor services' - - - name: upgrade_levels.console - type: string - default: ~ - help: 'Set a version cap for messages sent to console services' - - - name: upgrade_levels.consoleauth - type: string - default: ~ - help: 'Set a version cap for messages sent to consoleauth services' - - - name: upgrade_levels.network - type: string - default: ~ - help: 'Set a version cap for messages sent to network services' - - - name: matchmaker_ring.ringfile - type: string - default: '/etc/oslo/matchmaker_ring.json' - help: 'Matchmaker ring file' - - - name: vmware.host_ip - type: string - default: ~ - help: 'URL for connection to VMware ESX/VC host. Required if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver.' - - - name: vmware.host_username - type: string - default: ~ - help: 'Username for connection to VMware ESX/VC host. Used only if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver.' - - - name: vmware.host_password - type: string - default: ~ - help: 'Password for connection to VMware ESX/VC host. Used only if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver.' - - - name: vmware.cluster_name - type: multi - default: ~ - help: 'Name of a VMware Cluster ComputeResource. Used only if compute_driver is vmwareapi.VMwareVCDriver.' - - - name: vmware.datastore_regex - type: string - default: ~ - help: 'Regex to match the name of a datastore. Used only if compute_driver is vmwareapi.VMwareVCDriver.' - - - name: vmware.task_poll_interval - type: float - default: 5.0 - help: 'The interval used for polling of remote tasks. Used only if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver.' - - - name: vmware.api_retry_count - type: integer - default: 10 - help: 'The number of times we retry on failures, e.g., socket error, etc. Used only if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver.' - - - name: vmware.vnc_port - type: integer - default: 5900 - help: 'VNC starting port' - - - name: vmware.vnc_port_total - type: integer - default: 10000 - help: 'Total number of VNC ports' - - - name: vmware.vnc_password - type: string - default: ~ - help: 'VNC password' - - - name: vmware.use_linked_clone - type: boolean - default: True - help: 'Whether to use linked clone' - - - name: vmware.wsdl_location - type: string - default: ~ - help: 'Optional VIM Service WSDL Location e.g http:///vimService.wsdl. Optional over-ride to default location for bug work-arounds' - - - name: vmware.maximum_objects - type: integer - default: 100 - help: 'The maximum number of ObjectContent data objects that should be returned in a single result. A positive value will cause the operation to suspend the retrieval when the count of objects reaches the specified maximum. The server may still limit the count to something less than the configured value. Any remaining objects may be retrieved with additional requests.' - - - name: vmware.integration_bridge - type: string - default: 'br-int' - help: 'Name of Integration Bridge' - - - name: spice.html5proxy_base_url - type: string - default: 'http://127.0.0.1:6082/spice_auto.html' - help: "location of spice html5 console proxy, in the form 'http://127.0.0.1:6082/spice_auto.html'" - - - name: spice.server_listen - type: string - default: '127.0.0.1' - help: 'IP address on which instance spice server should listen' - - - name: spice.server_proxyclient_address - type: string - default: '127.0.0.1' - help: 'the address to which proxy clients' - - - name: spice.agent_enabled - type: boolean - default: True - help: 'enable spice guest agent support' - - - name: filter:authtoken.keymap - type: string - default: '127.0.0.1' - help: 'keymap for spice' - diff --git a/rubick/schemas/nova/2013.1.4.yml b/rubick/schemas/nova/2013.1.4.yml deleted file mode 100644 index 29c4f58..0000000 --- a/rubick/schemas/nova/2013.1.4.yml +++ /dev/null @@ -1,2888 +0,0 @@ -project: nova -version: '2013.1.4' -parameters: - - - name: internal_service_availability_zone - type: string - default: 'internal' - help: 'availability_zone to show internal services under' - - - name: default_availability_zone - type: string - default: 'nova' - help: 'default compute node availability_zone' - - - name: ca_file - type: string - default: 'cacert.pem' - help: 'Filename of root CA' - - - name: key_file - type: string - default: 'private/cakey.pem' - help: 'Filename of private key' - - - name: crl_file - type: string - default: 'crl.pem' - help: 'Filename of root Certificate Revocation List' - - - name: keys_path - type: string - default: '$state_path/keys' - help: 'Where we keep our keys' - - - name: ca_path - type: string - default: '$state_path/CA' - help: 'Where we keep our root CA' - - - name: use_project_ca - type: boolean - default: False - help: 'Should we use a CA for each project?' - - - name: user_cert_subject - type: string - default: '/CUS/STCalifornia/OOpenStack/OUNovaDev/CN%.16s-%.16s-%s' - help: 'Subject for certificate for users, %s for project, user, timestamp' - - - name: project_cert_subject - type: string - default: '/CUS/STCalifornia/OOpenStack/OUNovaDev/CNproject-ca-%.16s-%s' - help: 'Subject for certificate for projects, %s for project, timestamp' - - - name: fatal_exception_format_errors - type: boolean - default: False - help: 'make exception message format errors fatal' - - - name: run_external_periodic_tasks - type: boolean - default: True - help: 'Some periodic tasks can be run in a separate process. Should we run them here?' - - - name: my_ip - type: string - default: '10.0.0.1' - help: 'ip address of this host' - - - name: host - type: string - default: 'nova' - help: 'Name of this node. This can be an opaque identifier. It is not necessarily a hostname, FQDN, or IP address. However, the node name must be valid within an AMQP key, and if using ZeroMQ, a valid hostname, FQDN, or IP address' - - - name: use_ipv6 - type: boolean - default: False - help: 'use ipv6' - - - name: notify_on_any_change - type: boolean - default: False - help: 'If set, send compute.instance.update notifications on instance state changes. Valid values are False for no notifications, True for notifications on any instance changes.' - - - name: notify_api_faults - type: boolean - default: False - help: 'If set, send api.fault notifications on caught exceptions in the API service.' - - - name: notify_on_state_change - type: string - default: ~ - help: "If set, send compute.instance.update notifications on instance state changes. Valid values are None for no notifications, 'vm_state' for notifications on VM state changes, or 'vm_and_task_state' for notifications on VM and task state changes." - - - name: pybasedir - type: string - default: '/usr/lib/python/site-packages' - help: 'Directory where the nova python module is installed' - - - name: bindir - type: string - default: '$pybasedir/bin' - help: 'Directory where nova binaries are installed' - - - name: state_path - type: string - default: '$pybasedir' - help: "Top-level directory for maintaining nova's state" - - - name: policy_file - type: string - default: 'policy.json' - help: 'JSON file representing policy' - - - name: policy_default_rule - type: string - default: 'default' - help: 'Rule checked when requested rule is not found' - - - name: quota_instances - type: integer - default: 10 - help: 'number of instances allowed per project' - - - name: quota_cores - type: integer - default: 20 - help: 'number of instance cores allowed per project' - - - name: quota_ram - type: integer - default: 51200 - help: 'megabytes of instance ram allowed per project' - - - name: quota_floating_ips - type: integer - default: 10 - help: 'number of floating ips allowed per project' - - - name: quota_metadata_items - type: integer - default: 128 - help: 'number of metadata items allowed per instance' - - - name: quota_injected_files - type: integer - default: 5 - help: 'number of injected files allowed' - - - name: quota_injected_file_content_bytes - type: integer - default: 10240 - help: 'number of bytes allowed per injected file' - - - name: quota_injected_file_path_bytes - type: integer - default: 255 - help: 'number of bytes allowed per injected file path' - - - name: quota_security_groups - type: integer - default: 10 - help: 'number of security groups per project' - - - name: quota_security_group_rules - type: integer - default: 20 - help: 'number of security rules per security group' - - - name: quota_key_pairs - type: integer - default: 100 - help: 'number of key pairs per user' - - - name: reservation_expire - type: integer - default: 86400 - help: 'number of seconds until a reservation expires' - - - name: until_refresh - type: integer - default: 0 - help: 'count of reservations until usage is refreshed' - - - name: max_age - type: integer - default: 0 - help: 'number of seconds between subsequent usage refreshes' - - - name: quota_driver - type: string - default: 'nova.quota.DbQuotaDriver' - help: 'default driver to use for quota checks' - - - name: report_interval - type: integer - default: 10 - help: 'seconds between nodes reporting state to datastore' - - - name: periodic_enable - type: boolean - default: True - help: 'enable periodic tasks' - - - name: periodic_fuzzy_delay - type: integer - default: 60 - help: 'range of seconds to randomly delay when starting the periodic task scheduler to reduce stampeding.' - - - name: enabled_apis - type: list - default: ['ec2', 'osapi_compute', 'metadata'] - help: 'a list of APIs to enable by default' - - - name: enabled_ssl_apis - type: list - default: [] - help: 'a list of APIs with enabled SSL' - - - name: ec2_listen - type: string - default: '0.0.0.0' - help: 'IP address for EC2 API to listen' - - - name: ec2_listen_port - type: port - default: 8773 - help: 'port for ec2 api to listen' - - - name: ec2_workers - type: integer - default: ~ - help: 'Number of workers for EC2 API service' - - - name: osapi_compute_listen - type: string - default: '0.0.0.0' - help: 'IP address for OpenStack API to listen' - - - name: osapi_compute_listen_port - type: port - default: 8774 - help: 'list port for osapi compute' - - - name: osapi_compute_workers - type: integer - default: ~ - help: 'Number of workers for OpenStack API service' - - - name: metadata_manager - type: string - default: 'nova.api.manager.MetadataManager' - help: 'OpenStack metadata service manager' - - - name: metadata_listen - type: string - default: '0.0.0.0' - help: 'IP address for metadata api to listen' - - - name: metadata_listen_port - type: port - default: 8775 - help: 'port for metadata api to listen' - - - name: metadata_workers - type: integer - default: ~ - help: 'Number of workers for metadata service' - - - name: compute_manager - type: string - default: 'nova.compute.manager.ComputeManager' - help: 'full class name for the Manager for compute' - - - name: console_manager - type: string - default: 'nova.console.manager.ConsoleProxyManager' - help: 'full class name for the Manager for console proxy' - - - name: cert_manager - type: string - default: 'nova.cert.manager.CertManager' - help: 'full class name for the Manager for cert' - - - name: network_manager - type: string - default: 'nova.network.manager.VlanManager' - help: 'full class name for the Manager for network' - - - name: scheduler_manager - type: string - default: 'nova.scheduler.manager.SchedulerManager' - help: 'full class name for the Manager for scheduler' - - - name: service_down_time - type: integer - default: 60 - help: 'maximum time since last check-in for up service' - - - name: sqlite_clean_db - type: string - default: 'clean.sqlite' - help: 'File name of clean sqlite db' - - - name: monkey_patch - type: boolean - default: False - help: 'Whether to log monkey patching' - - - name: monkey_patch_modules - type: list - default: ['nova.api.ec2.cloud:nova.openstack.common.notifier.api.notify_decorator', 'nova.compute.api:nova.openstack.common.notifier.api.notify_decorator'] - help: 'List of modules/decorators to monkey patch' - - - name: password_length - type: integer - default: 12 - help: 'Length of generated instance admin passwords' - - - name: disable_process_locking - type: boolean - default: False - help: 'Whether to disable inter-process locks' - - - name: instance_usage_audit_period - type: string - default: 'month' - help: 'time period to generate instance usages for. Time period must be hour, day, month or year' - - - name: rootwrap_config - type: string - default: '/etc/nova/rootwrap.conf' - help: 'Path to the rootwrap configuration file to use for running commands as root' - - - name: tempdir - type: string - default: ~ - help: 'Explicitly specify the temporary working directory' - - - name: api_paste_config - type: string - default: 'api-paste.ini' - help: 'File name for the paste.deploy config for nova-api' - - - name: wsgi_log_format - type: string - default: '%(client_ip)s "%(request_line)s" status: %(status_code)s len: %(body_length)s time: %(wall_seconds).7f' - help: 'A python format string that is used as the template to generate log lines. The following values can be formatted into it: client_ip, date_time, request_line, status_code, body_length, wall_seconds.' - - - name: ssl_ca_file - type: string - default: ~ - help: 'CA certificate file to use to verify connecting clients' - - - name: ssl_cert_file - type: string - default: ~ - help: 'SSL certificate of API server' - - - name: ssl_key_file - type: string - default: ~ - help: 'SSL private key of API server' - - - name: tcp_keepidle - type: integer - default: 600 - help: 'Sets the value of TCP_KEEPIDLE in seconds for each server socket. Not supported on OS X.' - - - name: api_rate_limit - type: boolean - default: True - help: 'whether to rate limit the api' - - - name: auth_strategy - type: string - default: 'noauth' - help: 'The strategy to use for auth: noauth or keystone.' - - - name: use_forwarded_for - type: boolean - default: False - help: 'Treat X-Forwarded-For as the canonical remote address. Only enable this if you have a sanitizing proxy.' - - - name: lockout_attempts - type: integer - default: 5 - help: 'Number of failed auths before lockout.' - - - name: lockout_minutes - type: integer - default: 15 - help: 'Number of minutes to lockout if triggered.' - - - name: lockout_window - type: integer - default: 15 - help: 'Number of minutes for lockout window.' - - - name: keystone_ec2_url - type: string - default: 'http://localhost:5000/v2.0/ec2tokens' - help: 'URL to get token from ec2 request.' - - - name: ec2_private_dns_show_ip - type: boolean - default: False - help: 'Return the IP address as private dns hostname in describe instances' - - - name: ec2_strict_validation - type: boolean - default: True - help: 'Validate security group names according to EC2 specification' - - - name: ec2_timestamp_expiry - type: integer - default: 300 - help: 'Time in seconds before ec2 timestamp expires' - - - name: ec2_host - type: host - default: '$my_ip' - help: 'the ip of the ec2 api server' - - - name: ec2_dmz_host - type: host - default: '$my_ip' - help: 'the internal ip of the ec2 api server' - - - name: ec2_port - type: port - default: 8773 - help: 'the port of the ec2 api server' - - - name: ec2_scheme - type: string - default: 'http' - help: 'the protocol to use when connecting to the ec2 api server' - - - name: ec2_path - type: string - default: '/services/Cloud' - help: 'the path prefix used to call the ec2 api server' - - - name: region_list - type: list - default: [] - help: 'list of region=fqdn pairs separated by commas' - - - name: config_drive_skip_versions - type: string - default: '1.0 2007-01-19 2007-03-01 2007-08-29 2007-10-10 2007-12-15 2008-02-01 2008-09-01' - help: 'List of metadata versions to skip placing into the config drive' - - - name: service_quantum_metadata_proxy - type: boolean - default: False - help: 'Set flag to indicate Quantum will proxy metadata requests and resolve instance ids.' - - - name: quantum_metadata_proxy_shared_secret - type: string - default: '' - help: 'Shared secret to validate proxies Quantum metadata requests' - - - name: osapi_max_limit - type: integer - default: 1000 - help: 'the maximum number of items returned in a single response from a collection resource' - - - name: osapi_compute_link_prefix - type: string - default: ~ - help: 'Base URL that will be presented to users in links to the OpenStack Compute API' - - - name: osapi_glance_link_prefix - type: string - default: ~ - help: 'Base URL that will be presented to users in links to glance resources' - - - name: allow_instance_snapshots - type: boolean - default: True - help: 'Permit instance snapshot operations.' - - - name: osapi_compute_ext_list - type: list - default: [] - help: 'Specify list of extensions to load when using osapi_compute_extension option with nova.api.openstack.compute.contrib.select_extensions' - - - name: fping_path - type: string - default: '/usr/sbin/fping' - help: 'Full path to fping.' - - - name: osapi_hide_server_address_states - type: list - default: ['building'] - help: 'List of instance states that should hide network info' - - - name: enable_network_quota - type: boolean - default: False - help: 'Enables or disables quotaing of tenant networks' - - - name: use_quantum_default_nets - type: boolean - default: False - help: 'Control for checking for default networks' - - - name: quantum_default_tenant_id - type: string - default: 'default' - help: 'Default tenant id when creating quantum networks' - - - name: osapi_compute_extension - type: multi - default: 'nova.api.openstack.compute.contrib.standard_extensions' - help: 'osapi compute extension to load' - - - name: enable_instance_password - type: boolean - default: True - help: 'Allows use of instance password during server creation' - - - name: osapi_max_request_body_size - type: integer - default: 114688 - help: 'the maximum body size per each osapi request(bytes)' - - - name: cert_topic - type: string - default: 'cert' - help: 'the topic cert nodes listen on' - - - name: vpn_image_id - type: string - default: '0' - help: 'image id used when starting up a cloudpipe vpn server' - - - name: vpn_instance_type - type: string - default: 'm1.tiny' - help: 'Instance type for vpn instances' - - - name: boot_script_template - type: string - default: '$pybasedir/nova/cloudpipe/bootscript.template' - help: 'Template for cloudpipe instance boot script' - - - name: dmz_net - type: network - default: '10.0.0.0' - help: 'Network to push into openvpn config' - - - name: dmz_mask - type: network_mask - default: '255.255.255.0' - help: 'Netmask to push into openvpn config' - - - name: vpn_key_suffix - type: string - default: '-vpn' - help: 'Suffix to add to project name for vpn key and secgroups' - - - name: memcached_servers - type: list - default: ~ - help: 'Memcached servers or None for in process cache.' - - - name: compute_api_class - type: string - default: 'nova.compute.api.API' - help: 'The full class name of the compute API class to use' - - - name: allow_resize_to_same_host - type: boolean - default: False - help: 'Allow destination machine to match source for resize. Useful when testing in single-host environments.' - - - name: default_schedule_zone - type: string - default: ~ - help: "availability zone to use when user doesn't specify one" - - - name: non_inheritable_image_properties - type: list - default: ['cache_in_nova', 'bittorrent'] - help: 'These are image properties which a snapshot should not inherit from an instance' - - - name: null_kernel - type: string - default: 'nokernel' - help: 'kernel image that indicates not to use a kernel, but to use a raw disk image instead' - - - name: multi_instance_display_name_template - type: string - default: '%(name)s-%(uuid)s' - help: "When creating multiple instances with a single request using the os-multiple-create API extension, this template will be used to build the display name for each instance. The benefit is that the instances end up with different hostnames. To restore legacy behavior of every instance having the same name, set this option to '%(name)s'. Valid keys for the template are: name, uuid, count." - - - name: default_instance_type - type: string - default: 'm1.small' - help: 'default instance type to use, testing only' - - - name: console_host - type: string - default: 'nova' - help: 'Console proxy host to use to connect to instances on this host.' - - - name: default_access_ip_network_name - type: string - default: ~ - help: 'Name of network to use to set access ips for instances' - - - name: defer_iptables_apply - type: boolean - default: False - help: 'Whether to batch up the application of IPTables rules during a host restart and apply all at the end of the init phase' - - - name: instances_path - type: string - default: '$state_path/instances' - help: 'where instances are stored on disk' - - - name: instance_usage_audit - type: boolean - default: False - help: 'Generate periodic compute.instance.exists notifications' - - - name: live_migration_retry_count - type: integer - default: 30 - help: 'Number of 1 second retries needed in live_migration' - - - name: resume_guests_state_on_host_boot - type: boolean - default: False - help: 'Whether to start guests that were running before the host rebooted' - - - name: bandwidth_poll_interval - type: integer - default: 600 - help: 'interval to pull bandwidth usage info' - - - name: heal_instance_info_cache_interval - type: integer - default: 60 - help: 'Number of seconds between instance info_cache self healing updates' - - - name: host_state_interval - type: integer - default: 120 - help: 'Interval in seconds for querying the host status' - - - name: image_cache_manager_interval - type: integer - default: 2400 - help: 'Number of seconds to wait between runs of the image cache manager' - - - name: reclaim_instance_interval - type: integer - default: 0 - help: 'Interval in seconds for reclaiming deleted instances' - - - name: volume_usage_poll_interval - type: integer - default: 0 - help: 'Interval in seconds for gathering volume usages' - - - name: running_deleted_instance_action - type: string - default: 'log' - help: "Action to take if a running deleted instance is detected.Valid options are 'noop', 'log' and 'reap'. Set to 'noop' to disable." - - - name: running_deleted_instance_poll_interval - type: integer - default: 1800 - help: 'Number of seconds to wait between runs of the cleanup task.' - - - name: running_deleted_instance_timeout - type: integer - default: 0 - help: 'Number of seconds after being deleted when a running instance should be considered eligible for cleanup.' - - - name: reboot_timeout - type: integer - default: 0 - help: 'Automatically hard reboot an instance if it has been stuck in a rebooting state longer than N seconds. Set to 0 to disable.' - - - name: instance_build_timeout - type: integer - default: 0 - help: 'Amount of time in seconds an instance can be in BUILD before going into ERROR status.Set to 0 to disable.' - - - name: rescue_timeout - type: integer - default: 0 - help: 'Automatically unrescue an instance after N seconds. Set to 0 to disable.' - - - name: resize_confirm_window - type: integer - default: 0 - help: 'Automatically confirm resizes after N seconds. Set to 0 to disable.' - - - name: reserved_host_disk_mb - type: integer - default: 0 - help: 'Amount of disk in MB to reserve for the host' - - - name: reserved_host_memory_mb - type: integer - default: 512 - help: 'Amount of memory in MB to reserve for the host' - - - name: compute_stats_class - type: string - default: 'nova.compute.stats.Stats' - help: 'Class that will manage stats for the local compute host' - - - name: compute_topic - type: string - default: 'compute' - help: 'the topic compute nodes listen on' - - - name: console_driver - type: string - default: 'nova.console.xvp.XVPConsoleProxy' - help: 'Driver to use for the console proxy' - - - name: stub_compute - type: boolean - default: False - help: 'Stub calls to compute worker for tests' - - - name: console_public_hostname - type: string - default: 'nova' - help: 'Publicly visible name for this console host' - - - name: console_topic - type: string - default: 'console' - help: 'the topic console proxy nodes listen on' - - - name: console_vmrc_port - type: port - default: 443 - help: 'port for VMware VMRC connections' - - - name: console_vmrc_error_retries - type: integer - default: 10 - help: 'number of retries for retrieving VMRC information' - - - name: console_xvp_conf_template - type: string - default: '$pybasedir/nova/console/xvp.conf.template' - help: 'XVP conf template' - - - name: console_xvp_conf - type: string - default: '/etc/xvp.conf' - help: 'generated XVP conf file' - - - name: console_xvp_pid - type: string - default: '/var/run/xvp.pid' - help: 'XVP master process pid file' - - - name: console_xvp_log - type: string - default: '/var/log/xvp.log' - help: 'XVP log file' - - - name: console_xvp_multiplex_port - type: port - default: 5900 - help: 'port for XVP to multiplex VNC connections on' - - - name: consoleauth_topic - type: string - default: 'consoleauth' - help: 'the topic console auth proxy nodes listen on' - - - name: console_token_ttl - type: integer - default: 600 - help: 'How many seconds before deleting tokens' - - - name: consoleauth_manager - type: string - default: 'nova.consoleauth.manager.ConsoleAuthManager' - help: 'Manager for console auth' - - - name: enable_new_services - type: boolean - default: True - help: 'Services to be added to the available pool on create' - - - name: instance_name_template - type: string - default: 'instance-%08x' - help: 'Template string to be used to generate instance names' - - - name: snapshot_name_template - type: string - default: 'snapshot-%s' - help: 'Template string to be used to generate snapshot names' - - - name: db_driver - type: string - default: 'nova.db' - help: 'driver to use for database access' - - - name: osapi_compute_unique_server_name_scope - type: string - default: '' - help: "When set, compute API will consider duplicate hostnames invalid within the specified scope, regardless of case. Should be empty, 'project' or 'global'." - - - name: glance_host - type: string - default: '$my_ip' - help: 'default glance hostname or ip' - - - name: glance_port - type: port - default: 9292 - help: 'default glance port' - - - name: glance_protocol - type: string - default: 'http' - help: 'Default protocol to use when connecting to glance. Set to https for SSL.' - - - name: glance_api_servers - type: list - default: ['$glance_host:$glance_port'] - help: 'A list of the glance api servers available to nova. Prefix with https:// for ssl-based glance api servers.' - - - name: glance_api_insecure - type: boolean - default: False - help: 'Allow to perform insecure SSL' - - - name: glance_num_retries - type: integer - default: 0 - help: 'Number retries when downloading an image from glance' - - - name: allowed_direct_url_schemes - type: list - default: [] - help: 'A list of url scheme that can be downloaded directly via the direct_url. Currently supported schemes: [file].' - - - name: image_decryption_dir - type: string - default: '/tmp' - help: 'parent dir for tempdir used for image decryption' - - - name: s3_host - type: string - default: '$my_ip' - help: 'hostname or ip for openstack to use when accessing the s3 api' - - - name: s3_port - type: port - default: 3333 - help: 'port used when accessing the s3 api' - - - name: s3_access_key - type: string - default: 'notchecked' - help: 'access key to use for s3 server for images' - - - name: s3_secret_key - type: string - default: 'notchecked' - help: 'secret key to use for s3 server for images' - - - name: s3_use_ssl - type: boolean - default: False - help: 'whether to use ssl when talking to s3' - - - name: s3_affix_tenant - type: boolean - default: False - help: 'whether to affix the tenant id to the access key when downloading from s3' - - - name: ipv6_backend - type: string - default: 'rfc2462' - help: 'Backend to use for IPv6 generation' - - - name: network_api_class - type: string - default: 'nova.network.api.API' - help: 'The full class name of the network API class to use' - - - name: network_driver - type: string - default: 'nova.network.linux_net' - help: 'Driver to use for network creation' - - - name: default_floating_pool - type: string - default: 'nova' - help: 'Default pool for floating ips' - - - name: auto_assign_floating_ip - type: boolean - default: False - help: 'Autoassigning floating ip to VM' - - - name: floating_ip_dns_manager - type: string - default: 'nova.network.noop_dns_driver.NoopDNSDriver' - help: 'full class name for the DNS Manager for floating IPs' - - - name: instance_dns_manager - type: string - default: 'nova.network.noop_dns_driver.NoopDNSDriver' - help: 'full class name for the DNS Manager for instance IPs' - - - name: instance_dns_domain - type: string - default: '' - help: 'full class name for the DNS Zone for instance IPs' - - - name: ldap_dns_url - type: string - default: 'ldap://ldap.example.com:389' - help: 'URL for ldap server which will store dns entries' - - - name: ldap_dns_user - type: string - default: 'uidadmin,oupeople,dcexample,dcorg' - help: 'user for ldap DNS' - - - name: ldap_dns_password - type: string - default: 'password' - help: 'password for ldap DNS' - - - name: ldap_dns_soa_hostmaster - type: string - default: 'hostmaster@example.org' - help: 'Hostmaster for ldap dns driver Statement of Authority' - - - name: ldap_dns_servers - type: multi - default: 'dns.example.org' - help: 'DNS Servers for ldap dns driver' - - - name: ldap_dns_base_dn - type: string - default: 'ouhosts,dcexample,dcorg' - help: 'Base DN for DNS entries in ldap' - - - name: ldap_dns_soa_refresh - type: integer - default: 1800 - help: 'Refresh interval' - - - name: ldap_dns_soa_retry - type: integer - default: 3600 - help: 'Retry interval' - - - name: ldap_dns_soa_expiry - type: integer - default: 86400 - help: 'Expiry interval' - - - name: ldap_dns_soa_minimum - type: integer - default: 7200 - help: 'Minimum interval' - - - name: dhcpbridge_flagfile - type: multi - default: '/etc/nova/nova-dhcpbridge.conf' - help: 'location of flagfiles for dhcpbridge' - - - name: networks_path - type: string - default: '$state_path/networks' - help: 'Location to keep network config files' - - - name: public_interface - type: string - default: 'eth0' - help: 'Interface for public IP addresses' - - - name: network_device_mtu - type: string - default: ~ - help: 'MTU setting for vlan' - - - name: dhcpbridge - type: string - default: '$bindir/nova-dhcpbridge' - help: 'location of nova-dhcpbridge' - - - name: routing_source_ip - type: string - default: '$my_ip' - help: 'Public IP of network host' - - - name: dhcp_lease_time - type: integer - default: 120 - help: 'Lifetime of a DHCP lease in seconds' - - - name: dns_server - type: multi - default: '' - help: 'if set, uses specific dns server for dnsmasq. Canbe specified multiple times.' - - - name: use_network_dns_servers - type: boolean - default: False - help: 'if set, uses the dns1 and dns2 from the network ref.as dns servers.' - - - name: dmz_cidr - type: list - default: [] - help: 'A list of dmz range that should be accepted' - - - name: force_snat_range - type: multi - default: '' - help: 'Traffic to this range will always be snatted to the fallback ip, even if it would normally be bridged out of the node. Can be specified multiple times.' - - - name: dnsmasq_config_file - type: string - default: '' - help: 'Override the default dnsmasq settings with this file' - - - name: linuxnet_interface_driver - type: string - default: 'nova.network.linux_net.LinuxBridgeInterfaceDriver' - help: 'Driver used to create ethernet devices.' - - - name: linuxnet_ovs_integration_bridge - type: string - default: 'br-int' - help: 'Name of Open vSwitch bridge used with linuxnet' - - - name: send_arp_for_ha - type: boolean - default: False - help: 'send gratuitous ARPs for HA setup' - - - name: send_arp_for_ha_count - type: integer - default: 3 - help: 'send this many gratuitous ARPs for HA setup' - - - name: use_single_default_gateway - type: boolean - default: False - help: 'Use single default gateway. Only first nic of vm will get default gateway from dhcp server' - - - name: forward_bridge_interface - type: multi - default: 'all' - help: 'An interface that bridges can forward to. If this is set to all then all traffic will be forwarded. Can be specified multiple times.' - - - name: metadata_host - type: string - default: '$my_ip' - help: 'the ip for the metadata api server' - - - name: metadata_port - type: port - default: 8775 - help: 'the port for the metadata api port' - - - name: iptables_top_regex - type: string - default: '' - help: 'Regular expression to match iptables rule that shouldalways be on the top.' - - - name: iptables_bottom_regex - type: string - default: '' - help: 'Regular expression to match iptables rule that shouldalways be on the bottom.' - - - name: flat_network_bridge - type: string - default: ~ - help: 'Bridge for simple network instances' - - - name: flat_network_dns - type: string - default: '8.8.4.4' - help: 'Dns for simple network' - - - name: flat_injected - type: boolean - default: False - help: 'Whether to attempt to inject network setup into guest' - - - name: flat_interface - type: string - default: ~ - help: 'FlatDhcp will bridge into this interface if set' - - - name: vlan_start - type: integer - default: 100 - help: 'First VLAN for private networks' - - - name: vlan_interface - type: string - default: ~ - help: 'vlans will bridge into this interface if set' - - - name: num_networks - type: integer - default: 1 - help: 'Number of networks to support' - - - name: vpn_ip - type: string - default: '$my_ip' - help: 'Public IP for the cloudpipe VPN servers' - - - name: vpn_start - type: integer - default: 1000 - help: 'First Vpn port for private networks' - - - name: network_size - type: integer - default: 256 - help: 'Number of addresses in each private subnet' - - - name: fixed_range - type: string - default: '10.0.0.0/8' - help: 'Fixed IP address block' - - - name: fixed_range_v6 - type: string - default: 'fd00::/48' - help: 'Fixed IPv6 address block' - - - name: gateway - type: string - default: ~ - help: 'Default IPv4 gateway' - - - name: gateway_v6 - type: string - default: ~ - help: 'Default IPv6 gateway' - - - name: cnt_vpn_clients - type: integer - default: 0 - help: 'Number of addresses reserved for vpn clients' - - - name: fixed_ip_disassociate_timeout - type: integer - default: 600 - help: 'Seconds after which a deallocated ip is disassociated' - - - name: create_unique_mac_address_attempts - type: integer - default: 5 - help: 'Number of attempts to create unique mac address' - - - name: fake_network - type: boolean - default: False - help: 'If passed, use fake network devices and addresses' - - - name: fake_call - type: boolean - default: False - help: 'If True, skip using the queue and make local calls' - - - name: teardown_unused_network_gateway - type: boolean - default: False - help: 'If True, unused gateway devices' - - - name: force_dhcp_release - type: boolean - default: False - help: 'If True, send a dhcp release on instance termination' - - - name: share_dhcp_address - type: boolean - default: False - help: 'If True in multi_host mode, all compute hosts share the same dhcp address.' - - - name: update_dns_entries - type: boolean - default: False - help: 'If True, when a DNS entry must be updated, it sends a fanout cast to all network hosts to update their DNS entries in multi host mode' - - - name: dns_update_periodic_interval - type: integer - default: -1 - help: 'Number of seconds to wait between runs of updates to DNS entries.' - - - name: dhcp_domain - type: string - default: 'novalocal' - help: 'domain to use for building the hostnames' - - - name: l3_lib - type: string - default: 'nova.network.l3.LinuxNetL3' - help: 'Indicates underlying L3 management library' - - - name: quantum_url - type: string - default: 'http://127.0.0.1:9696' - help: 'URL for connecting to quantum' - - - name: quantum_url_timeout - type: integer - default: 30 - help: 'timeout value for connecting to quantum in seconds' - - - name: quantum_admin_username - type: string - default: ~ - help: 'username for connecting to quantum in admin context' - - - name: quantum_admin_password - type: string - default: ~ - help: 'password for connecting to quantum in admin context' - - - name: quantum_admin_tenant_name - type: string - default: ~ - help: 'tenant name for connecting to quantum in admin context' - - - name: quantum_region_name - type: string - default: ~ - help: 'region name for connecting to quantum in admin context' - - - name: quantum_admin_auth_url - type: string - default: 'http://localhost:5000/v2.0' - help: 'auth url for connecting to quantum in admin context' - - - name: quantum_api_insecure - type: boolean - default: False - help: 'if set, ignore any SSL validation issues' - - - name: quantum_auth_strategy - type: string - default: 'keystone' - help: 'auth strategy for connecting to quantum in admin context' - - - name: quantum_ovs_bridge - type: string - default: 'br-int' - help: 'Name of Integration Bridge used by Open vSwitch' - - - name: quantum_extension_sync_interval - type: integer - default: 600 - help: 'Number of seconds before querying quantum for extensions' - - - name: network_topic - type: string - default: 'network' - help: 'the topic network nodes listen on' - - - name: multi_host - type: boolean - default: False - help: 'Default value for multi_host in networks. Also, if set, some rpc network calls will be sent directly to host.' - - - name: security_group_api - type: string - default: 'nova' - help: 'The full class name of the security API class' - - - name: security_group_handler - type: string - default: 'nova.network.sg.NullSecurityGroupHandler' - help: 'The full class name of the security group handler class' - - - name: queues - type: multi - default: '' - help: 'Queues to delete' - - - name: delete_exchange - type: boolean - default: False - help: 'delete nova exchange too.' - - - name: record - type: boolean - default: False - help: 'Record sessions to FILE.[session_number]' - - - name: daemon - type: boolean - default: False - help: 'Become a daemon' - - - name: ssl_only - type: boolean - default: False - help: 'Disallow non-encrypted connections' - - - name: source_is_ipv6 - type: boolean - default: False - help: 'Source is ipv6' - - - name: cert - type: string - default: 'self.pem' - help: 'SSL certificate file' - - - name: key - type: string - default: ~ - help: 'SSL key file' - - - name: web - type: string - default: '/usr/share/novnc' - help: 'Run webserver on same port. Serve files from DIR.' - - - name: novncproxy_host - type: string - default: '0.0.0.0' - help: 'Host on which to listen for incoming requests' - - - name: novncproxy_port - type: port - default: 6080 - help: 'Port on which to listen for incoming requests' - - - name: buckets_path - type: string - default: '$state_path/buckets' - help: 'path to s3 buckets' - - - name: s3_listen - type: string - default: '0.0.0.0' - help: 'IP address for S3 API to listen' - - - name: s3_listen_port - type: port - default: 3333 - help: 'port for s3 api to listen' - - - name: baremetal.db_backend - type: string - default: 'sqlalchemy' - help: 'The backend to use for bare-metal database' - - - name: dbapi_use_tpool - type: boolean - default: False - help: 'Enable the experimental use of thread pooling for all DB API calls' - - - name: baremetal.sql_connection - type: string - default: 'sqlite:///$state_path/baremetal_$sqlite_db' - help: 'The SQLAlchemy connection string used to connect to the bare-metal database' - - - name: sqlite_db - type: string - default: 'nova.sqlite' - help: 'the filename to use with sqlite' - - - name: sql_idle_timeout - type: integer - default: 3600 - help: 'timeout before idle sql connections are reaped' - - - name: sqlite_synchronous - type: boolean - default: True - help: 'If passed, use synchronous mode for sqlite' - - - name: sql_min_pool_size - type: integer - default: 1 - help: 'Minimum number of SQL connections to keep open in a pool' - - - name: sql_max_pool_size - type: integer - default: 5 - help: 'Maximum number of SQL connections to keep open in a pool' - - - name: sql_max_retries - type: integer - default: 10 - help: 'maximum db connection retries during startup.' - - - name: sql_retry_interval - type: integer - default: 10 - help: 'interval between retries of opening a sql connection' - - - name: sql_max_overflow - type: integer - default: ~ - help: 'If set, use this value for max_overflow with sqlalchemy' - - - name: sql_connection_debug - type: integer - default: 0 - help: 'Verbosity of SQL debugging information. 0=None, 100=Everything' - - - name: sql_connection_trace - type: boolean - default: False - help: 'Add python stack traces to SQL as comment strings' - - - name: backdoor_port - type: port - default: ~ - help: 'port for eventlet backdoor to listen' - - - name: lock_path - type: string - default: ~ - help: 'Directory to use for lock files. Default to a temp directory' - - - name: debug - type: boolean - default: False - help: 'Print debugging output' - - - name: verbose - type: boolean - default: False - help: 'Print more verbose output' - - - name: use_stderr - type: boolean - default: True - help: 'Log output to standard error' - - - name: logfile_mode - type: string - default: 420 - help: 'Default file mode used when creating log files' - - - name: logging_context_format_string - type: string - default: '%(asctime)s.%(msecs)03d %(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' - - - name: logging_default_format_string - type: string - default: '%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s' - help: 'format string to use for log messages without context' - - - name: logging_debug_format_suffix - type: string - default: '%(funcName)s %(pathname)s:%(lineno)d' - help: 'data to append to log format when level is DEBUG' - - - name: logging_exception_prefix - type: string - default: '%(asctime)s.%(msecs)03d %(process)d TRACE %(name)s %(instance)s' - help: 'prefix each line of exception output with this format' - - - name: default_log_levels - type: list - default: ['amqplibWARN', 'sqlalchemyWARN', 'botoWARN', 'sudsINFO', 'keystoneINFO', 'eventlet.wsgi.serverWARN'] - help: 'list of logger=LEVEL pairs' - - - name: publish_errors - type: boolean - default: False - help: 'publish error events' - - - name: fatal_deprecations - type: boolean - default: False - help: 'make deprecations fatal' - - - name: instance_format - type: string - default: '"[instance: %(uuid)s] "' - help: 'If an instance is passed with the log message, format it like this' - - - name: instance_uuid_format - type: string - default: '"[instance: %(uuid)s] "' - help: 'If an instance UUID is passed with the log message, format it like this' - - - name: log_config - type: string - default: ~ - help: 'If this option is specified, the logging configuration file specified is used and overrides any other logging options specified. Please see the Python logging module documentation for details on logging configuration files.' - - - name: log_format - type: string - default: '%(asctime)s %(levelname)8s [%(name)s] %(message)s' - help: 'A logging.Formatter log message format string which may use any of the available logging.LogRecord attributes. Default: %(default)s' - - - name: log_date_format - type: string - default: '%Y-%m-%d %H:%M:%S' - help: 'Format string for %%(asctime)s in log records. Default: %(default)s' - - - name: log_file - type: string - default: ~ - help: '(Optional) Name of log file to output to. If not set, logging will go to stdout.' - - - name: log_dir - type: string - default: ~ - help: '(Optional) The directory to keep log files in' - - - name: use_syslog - type: boolean - default: False - help: 'Use syslog for logging.' - - - name: syslog_log_facility - type: string - default: 'LOG_USER' - help: 'syslog facility to receive log lines' - - - name: notification_driver - type: multi - default: '' - help: 'Driver or drivers to handle sending notifications' - - - name: default_notification_level - type: string - default: 'INFO' - help: 'Default notification level for outgoing notifications' - - - name: default_publisher_id - type: string - default: '$host' - help: 'Default publisher_id for outgoing notifications' - - - name: notification_topics - type: list - default: ['notifications'] - help: 'AMQP topic used for openstack notifications' - - - name: rpc_backend - type: string - default: 'nova.openstack.common.rpc.impl_kombu' - help: 'The messaging module to use, defaults to kombu.' - - - name: rpc_thread_pool_size - type: integer - default: 64 - help: 'Size of RPC thread pool' - - - name: rpc_conn_pool_size - type: integer - default: 30 - help: 'Size of RPC connection pool' - - - name: rpc_response_timeout - type: integer - default: 60 - help: 'Seconds to wait for a response from call or multicall' - - - name: rpc_cast_timeout - type: integer - default: 30 - help: 'Seconds to wait before a cast expires' - - - name: allowed_rpc_exception_modules - type: list - default: ['nova.openstack.common.exception', 'nova.exception', 'cinder.exception,exceptions'] - help: 'Modules of exceptions that are permitted to be recreatedupon receiving exception data from an rpc call.' - - - name: fake_rabbit - type: boolean - default: False - help: 'If passed, use a fake RabbitMQ provider' - - - name: control_exchange - type: string - default: 'openstack' - help: 'AMQP exchange to connect to if using RabbitMQ or Qpid' - - - name: amqp_rpc_single_reply_queue - type: boolean - default: False - help: 'Enable a fast single reply queue if using AMQP based RPC like RabbitMQ or Qpid.' - - - name: kombu_ssl_version - type: string - default: '' - help: 'SSL version to use' - - - name: kombu_ssl_keyfile - type: string - default: '' - help: 'SSL key file' - - - name: kombu_ssl_certfile - type: string - default: '' - help: 'SSL cert file' - - - name: kombu_ssl_ca_certs - type: string - default: '' - help: 'SSL certification authority file' - - - name: rabbit_host - type: string - default: 'localhost' - help: 'The RabbitMQ broker address where a single node is used' - - - name: rabbit_port - type: port - default: 5672 - help: 'The RabbitMQ broker port where a single node is used' - - - name: rabbit_hosts - type: list - default: ['$rabbit_host:$rabbit_port'] - help: 'RabbitMQ HA cluster host:port pairs' - - - name: rabbit_use_ssl - type: boolean - default: False - help: 'connect over SSL for RabbitMQ' - - - name: rabbit_userid - type: string - default: 'guest' - help: 'the RabbitMQ userid' - - - name: rabbit_password - type: string - default: 'guest' - help: 'the RabbitMQ password' - - - name: rabbit_virtual_host - type: string - default: '/' - help: 'the RabbitMQ virtual host' - - - name: rabbit_retry_interval - type: integer - default: 1 - help: 'how frequently to retry connecting with RabbitMQ' - - - name: rabbit_retry_backoff - type: integer - default: 2 - help: 'how long to backoff for between retries when connecting to RabbitMQ' - - - name: rabbit_max_retries - type: integer - default: 0 - help: 'maximum retries with trying to connect to RabbitMQ' - - - name: rabbit_durable_queues - type: boolean - default: False - help: 'use durable queues in RabbitMQ' - - - name: rabbit_ha_queues - type: boolean - default: False - help: 'use H/A queues in RabbitMQ' - - - name: qpid_hostname - type: string - default: 'localhost' - help: 'Qpid broker hostname' - - - name: qpid_port - type: port - default: 5672 - help: 'Qpid broker port' - - - name: qpid_hosts - type: list - default: ['$qpid_hostname:$qpid_port'] - help: 'Qpid HA cluster host:port pairs' - - - name: qpid_username - type: string - default: '' - help: 'Username for qpid connection' - - - name: qpid_password - type: string - default: '' - help: 'Password for qpid connection' - - - name: qpid_sasl_mechanisms - type: string - default: '' - help: 'Space separated list of SASL mechanisms to use for auth' - - - name: qpid_heartbeat - type: integer - default: 60 - help: 'Seconds between connection keepalive heartbeats' - - - name: qpid_protocol - type: string - default: 'tcp' - help: "Transport to use, either 'tcp' or 'ssl'" - - - name: qpid_tcp_nodelay - type: boolean - default: True - help: 'Disable Nagle algorithm' - - - name: rpc_zmq_bind_address - type: string - default: '*' - help: 'ZeroMQ bind address. Should be a wildcard' - - - name: rpc_zmq_matchmaker - type: string - default: 'nova.openstack.common.rpc.matchmaker.MatchMakerLocalhost' - help: 'MatchMaker driver' - - - name: rpc_zmq_port - type: port - default: 9501 - help: 'ZeroMQ receiver listening port' - - - name: rpc_zmq_contexts - type: integer - default: 1 - help: 'Number of ZeroMQ contexts, defaults to 1' - - - name: rpc_zmq_topic_backlog - type: integer - default: ~ - help: 'Maximum number of ingress messages to locally buffer per topic. Default is unlimited.' - - - name: rpc_zmq_ipc_dir - type: string - default: '/var/run/openstack' - help: 'Directory for holding IPC sockets' - - - name: rpc_zmq_host - type: string - default: 'sorcha' - help: "Name of this node. Must be a valid hostname, FQDN, or IP address. Must match 'host' option, if running Nova." - - - name: matchmaker_ringfile - type: string - default: '/etc/nova/matchmaker_ring.json' - help: 'Matchmaker ring file' - - - name: scheduler_host_manager - type: string - default: 'nova.scheduler.host_manager.HostManager' - help: 'The scheduler host manager class to use' - - - name: scheduler_max_attempts - type: integer - default: 3 - help: 'Maximum number of attempts to schedule an instance' - - - name: scheduler_host_subset_size - type: integer - default: 1 - help: 'New instances will be scheduled on a host chosen randomly from a subset of the N best hosts. This property defines the subset size that a host is chosen from. A value of 1 chooses the first host returned by the weighing functions. This value must be at least 1. Any value less than 1 will be ignored, and 1 will be used instead' - - - name: cpu_allocation_ratio - type: floating point - default: '16.0' - help: 'Virtual CPU to Physical CPU allocation ratio' - - - name: disk_allocation_ratio - type: floating point - default: '1.0' - help: 'virtual disk to physical disk allocation ratio' - - - name: max_io_ops_per_host - type: integer - default: 8 - help: 'Ignore hosts that have too many builds/resizes/snaps/migrations' - - - name: isolated_images - type: list - default: [] - help: 'Images to run on isolated host' - - - name: isolated_hosts - type: list - default: [] - help: 'Host reserved for specific images' - - - name: max_instances_per_host - type: integer - default: 50 - help: 'Ignore hosts that have too many instances' - - - name: ram_allocation_ratio - type: floating point - default: '1.5' - help: 'virtual ram to physical ram allocation ratio' - - - name: scheduler_available_filters - type: multi - default: 'nova.scheduler.filters.all_filters' - help: "Filter classes available to the scheduler which may be specified more than once. An entry of 'nova.scheduler.filters.standard_filters' maps to all filters included with nova." - - - name: scheduler_default_filters - type: list - default: ['RetryFilter', 'AvailabilityZoneFilter', 'RamFilter', 'ComputeFilter', 'ComputeCapabilitiesFilter', 'ImagePropertiesFilter'] - help: 'Which filter class names to use for filtering hosts when not specified in the request.' - - - name: scheduler_weight_classes - type: list - default: ['nova.scheduler.weights.all_weighers'] - help: 'Which weight class names to use for weighing hosts' - - - name: scheduler_driver - type: string - default: 'nova.scheduler.filter_scheduler.FilterScheduler' - help: 'Default driver to use for the scheduler' - - - name: compute_scheduler_driver - type: string - default: 'nova.scheduler.filter_scheduler.FilterScheduler' - help: 'Driver to use for scheduling compute calls' - - - name: default_scheduler_driver - type: string - default: 'nova.scheduler.chance.ChanceScheduler' - help: 'Default driver to use for scheduling calls' - - - name: scheduler_topic - type: string - default: 'scheduler' - help: 'the topic scheduler nodes listen on' - - - name: scheduler_json_config_location - type: string - default: '' - help: 'Absolute path to scheduler configuration JSON file.' - - - name: least_cost_functions - type: list - default: ~ - help: 'Which cost functions the LeastCostScheduler should use' - - - name: noop_cost_fn_weight - type: floating point - default: '1.0' - help: 'How much weight to give the noop cost function' - - - name: compute_fill_first_cost_fn_weight - type: floating point - default: ~ - help: 'How much weight to give the fill-first cost function. A negative value will reverse behavior: e.g. spread-first' - - - name: ram_weight_multiplier - type: floating point - default: '1.0' - help: 'Multiplier used for weighing ram. Negative numbers mean to stack vs spread.' - - - name: servicegroup_driver - type: string - default: 'db' - help: 'The driver for servicegroup service' - - - name: config_drive_format - type: string - default: 'iso9660' - help: 'Config drive format. One of iso9660' - - - name: config_drive_tempdir - type: string - default: ~ - help: 'Where to put temporary files associated with config drive creation' - - - name: force_config_drive - type: string - default: ~ - help: 'Set to force injection to take place on a config drive' - - - name: mkisofs_cmd - type: string - default: 'genisoimage' - help: 'Name and optionally path of the tool used for ISO image creation' - - - name: baremetal.injected_network_template - type: string - default: '$pybasedir/nova/virt/baremetal/interfaces.template' - help: 'Template file for injected network' - - - name: virt_mkfs - type: string - default: 'windowsmkfs.ntfs --force --fast --label %(fs_label)s %(target)s' - - - name: timeout_nbd - type: integer - default: 10 - help: 'time to wait for a NBD device coming up' - - - name: compute_driver - type: string - default: ~ - help: 'Driver to use for controlling virtualization. Options include: libvirt.LibvirtDriver, xenapi.XenAPIDriver, fake.FakeDriver, baremetal.BareMetalDriver, vmwareapi.VMWareESXDriver' - - - name: default_ephemeral_format - type: string - default: ~ - help: 'The default format an ephemeral_volume will be formatted with on creation.' - - - name: preallocate_images - type: string - default: 'none' - help: "VM image preallocation mode: 'none' => no storage provisioning is done up front, 'space' => storage is fully allocated at instance start" - - - name: use_cow_images - type: boolean - default: True - help: 'Whether to use cow images' - - - name: firewall_driver - type: string - default: ~ - help: 'Firewall driver' - - - name: allow_same_net_traffic - type: boolean - default: True - help: 'Whether to allow network traffic from same network' - - - name: vswitch_name - type: string - default: ~ - help: 'External virtual switch Name, if not provided, the first external virtual switch is used' - - - name: limit_cpu_features - type: boolean - default: False - help: 'Required for live migration among hosts with different CPU features' - - - name: config_drive_inject_password - type: boolean - default: False - help: 'Sets the admin password in the config drive image' - - - name: qemu_img_cmd - type: string - default: 'qemu-img.exe' - help: 'qemu-img is used to convert between different image types' - - - name: config_drive_cdrom - type: boolean - default: False - help: 'Attaches the Config Drive image as a cdrom drive instead of a disk drive' - - - name: hyperv_attaching_volume_retry_count - type: integer - default: 10 - help: 'The number of times we retry on attaching volume ' - - - name: hyperv_wait_between_attach_retry - type: integer - default: 5 - help: 'The seconds to wait between an volume attachment attempt' - - - name: force_volumeutils_v1 - type: boolean - default: False - help: 'Force volumeutils v1' - - - name: force_raw_images - type: boolean - default: True - help: 'Force backing images to raw format' - - - name: rescue_image_id - type: string - default: ~ - help: 'Rescue ami image' - - - name: rescue_kernel_id - type: string - default: ~ - help: 'Rescue aki image' - - - name: rescue_ramdisk_id - type: string - default: ~ - help: 'Rescue ari image' - - - name: libvirt_type - type: string - default: 'kvm' - help: 'Libvirt domain type' - - - name: libvirt_uri - type: string - default: '' - help: 'Override the default libvirt URI' - - - name: libvirt_inject_password - type: boolean - default: False - help: 'Inject the admin password at boot time, without an agent.' - - - name: libvirt_inject_key - type: boolean - default: True - help: 'Inject the ssh public key at boot time' - - - name: libvirt_inject_partition - type: integer - default: 1 - help: 'The partition to inject to : -2 => disable, -1 => inspect' - - - name: use_usb_tablet - type: boolean - default: True - help: 'Sync virtual and real mouse cursors in Windows VMs' - - - name: live_migration_uri - type: string - default: 'qemu+tcp://%s/system' - help: 'Migration target URI' - - - name: live_migration_flag - type: string - default: 'VIR_MIGRATE_UNDEFINE_SOURCE, VIR_MIGRATE_PEER2PEER' - help: 'Migration flags to be set for live migration' - - - name: block_migration_flag - type: string - default: 'VIR_MIGRATE_UNDEFINE_SOURCE, VIR_MIGRATE_PEER2PEER, VIR_MIGRATE_NON_SHARED_INC' - help: 'Migration flags to be set for block migration' - - - name: live_migration_bandwidth - type: integer - default: 0 - help: 'Maximum bandwidth to be used during migration, in Mbps' - - - name: snapshot_image_format - type: string - default: ~ - help: 'Snapshot image format' - - - name: libvirt_vif_driver - type: string - default: 'nova.virt.libvirt.vif.LibvirtGenericVIFDriver' - help: 'The libvirt VIF driver to configure the VIFs.' - - - name: libvirt_volume_drivers - type: list - default: ['iscsinova.virt.libvirt.volume.LibvirtISCSIVolumeDriver', 'localnova.virt.libvirt.volume.LibvirtVolumeDriver', 'fakenova.virt.libvirt.volume.LibvirtFakeVolumeDriver', 'rbdnova.virt.libvirt.volume.LibvirtNetVolumeDriver', 'sheepdognova.virt.libvirt.volume.LibvirtNetVolumeDriver', 'nfsnova.virt.libvirt.volume.LibvirtNFSVolumeDriver', 'aoenova.virt.libvirt.volume.LibvirtAOEVolumeDriver', 'glusterfsnova.virt.libvirt.volume.LibvirtGlusterfsVolumeDriver', 'fibre_channelnova.virt.libvirt.volume.LibvirtFibreChannelVolumeDriver', 'scalitynova.virt.libvirt.volume.LibvirtScalityVolumeDriver'] - help: 'Libvirt handlers for remote volumes.' - - - name: libvirt_disk_prefix - type: string - default: ~ - help: 'Override the default disk prefix for the devices attached to a server, which is dependent on libvirt_type.' - - - name: libvirt_wait_soft_reboot_seconds - type: integer - default: 120 - help: 'Number of seconds to wait for instance to shut down after soft reboot request is made. We fall back to hard reboot if instance does not shutdown within this window.' - - - name: libvirt_nonblocking - type: boolean - default: True - help: 'Use a separated OS thread pool to realize non-blocking libvirt calls' - - - name: libvirt_cpu_mode - type: string - default: ~ - help: "Set to 'host-model' to clone the host CPU feature flags; to 'host-passthrough' to use the host CPU model exactly; to 'custom' to use a named CPU model; to 'none' to not set any CPU model. If libvirt_type='kvm|qemu', it will default to 'host-model', otherwise it will default to 'none'" - - - name: libvirt_cpu_model - type: string - default: ~ - help: 'Set to a named libvirt CPU model' - - - name: libvirt_snapshots_directory - type: string - default: '$instances_path/snapshots' - help: 'Location where libvirt driver will store snapshots before uploading them to image service' - - - name: xen_hvmloader_path - type: string - default: '/usr/lib/xen/boot/hvmloader' - help: 'Location where the Xen hvmloader is kept' - - - name: disk_cachemodes - type: list - default: [] - help: "Specific cachemodes to use for different disk types e.g: ['file=directsync','block=none']" - - - name: libvirt_images_type - type: string - default: 'default' - help: 'VM Images format. Acceptable values are: raw, qcow2, lvm, default. If default is specified, then use_cow_images flag is used instead of this one.' - - - name: libvirt_images_volume_group - type: string - default: ~ - help: 'LVM Volume Group that is used for VM images, when you specify libvirt_images_type=lvm.' - - - name: libvirt_sparse_logical_volumes - type: boolean - default: False - help: 'Create sparse logical volumes' - - - name: libvirt_lvm_snapshot_size - type: integer - default: 1000 - help: 'The amount of storage' - - - name: base_dir_name - type: string - default: '_base' - help: 'Where cached images are stored under $instances_path.This is NOT the full path - just a folder name.For per-compute-host cached images, set to _base_$my_ip' - - - name: image_info_filename_pattern - type: string - default: '$instances_path/$base_dir_name/%(image)s.info' - help: 'Allows image information files to be stored in non-standard locations' - - - name: remove_unused_base_images - type: boolean - default: True - help: 'Should unused base images be removed?' - - - name: remove_unused_kernels - type: boolean - default: False - help: 'Should unused kernel images be removed? This is only safe to enable if all compute nodes have been updated to support this option. This will enabled by default in future.' - - - name: remove_unused_resized_minimum_age_seconds - type: integer - default: 3600 - help: 'Unused resized base images younger than this will not be removed' - - - name: remove_unused_original_minimum_age_seconds - type: integer - default: 86400 - help: 'Unused unresized base images younger than this will not be removed' - - - name: checksum_base_images - type: boolean - default: False - help: 'Write a checksum for files in _base to disk' - - - name: checksum_interval_seconds - type: integer - default: 3600 - help: 'How frequently to checksum base images' - - - name: libvirt_snapshot_compression - type: boolean - default: False - help: 'Compress snapshot images when possible. This currently applies exclusively to qcow2 images' - - - name: libvirt_ovs_bridge - type: string - default: 'br-int' - help: 'Name of Integration Bridge used by Open vSwitch' - - - name: libvirt_use_virtio_for_bridges - type: boolean - default: True - help: 'Use virtio for bridge interfaces with KVM/QEMU' - - - name: num_iscsi_scan_tries - type: integer - default: 3 - help: 'number of times to rescan iSCSI target to find volume' - - - name: rbd_user - type: string - default: ~ - help: 'the RADOS client name for accessing rbd volumes' - - - name: rbd_secret_uuid - type: string - default: ~ - help: 'the libvirt uuid of the secret for the rbd_uservolumes' - - - name: nfs_mount_point_base - type: string - default: '$state_path/mnt' - help: 'Dir where the nfs volume is mounted on the compute node' - - - name: nfs_mount_options - type: string - default: ~ - help: 'Mount options passed to the nfs client. See section of the nfs man page for details' - - - name: num_aoe_discover_tries - type: integer - default: 3 - help: 'number of times to rediscover AoE target to find volume' - - - name: glusterfs_mount_point_base - type: string - default: '$state_path/mnt' - help: 'Dir where the glusterfs volume is mounted on the compute node' - - - name: libvirt_iscsi_use_multipath - type: boolean - default: False - help: 'use multipath connection of the iSCSI volume' - - - name: scality_sofs_config - type: string - default: ~ - help: 'Path or URL to Scality SOFS configuration file' - - - name: scality_sofs_mount_point - type: string - default: '$state_path/scality' - help: 'Base dir where Scality SOFS shall be mounted' - - - name: powervm_mgr_type - type: string - default: 'ivm' - help: 'PowerVM manager type' - - - name: powervm_mgr - type: string - default: ~ - help: 'PowerVM manager host or ip' - - - name: powervm_mgr_user - type: string - default: ~ - help: 'PowerVM manager user name' - - - name: powervm_mgr_passwd - type: string - default: ~ - help: 'PowerVM manager user password' - - - name: powervm_img_remote_path - type: string - default: '/home/padmin' - help: 'PowerVM image remote path where images will be moved. Make sure this path can fit your biggest image in glance' - - - name: powervm_img_local_path - type: string - default: '/tmp' - help: 'Local directory to download glance images to. Make sure this path can fit your biggest image in glance' - - - name: vmwareapi_host_ip - type: string - default: ~ - help: 'URL for connection to VMware ESX/VC host. Required if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver.' - - - name: vmwareapi_host_username - type: string - default: ~ - help: 'Username for connection to VMware ESX/VC host. Used only if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver.' - - - name: vmwareapi_host_password - type: string - default: ~ - help: 'Password for connection to VMware ESX/VC host. Used only if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver.' - - - name: vmwareapi_cluster_name - type: string - default: ~ - help: 'Name of a VMware Cluster ComputeResource. Used only if compute_driver is vmwareapi.VMwareVCDriver.' - - - name: vmwareapi_task_poll_interval - type: floating point - default: '5.0' - help: 'The interval used for polling of remote tasks. Used only if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver.' - - - name: vmwareapi_api_retry_count - type: integer - default: 10 - help: 'The number of times we retry on failures, e.g., socket error, etc. Used only if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver.' - - - name: vnc_port - type: port - default: 5900 - help: 'VNC starting port' - - - name: vnc_port_total - type: integer - default: 10000 - help: 'Total number of VNC ports' - - - name: vnc_password - type: string - default: ~ - help: 'VNC password' - - - name: use_linked_clone - type: boolean - default: True - help: 'Whether to use linked clone' - - - name: vmwareapi_vlan_interface - type: string - default: 'vmnic0' - help: 'Physical ethernet adapter name for vlan networking' - - - name: vmwareapi_wsdl_loc - type: string - default: ~ - help: 'Optional VIM Service WSDL Location e.g http:///vimService.wsdl' - - - name: agent_timeout - type: integer - default: 30 - help: 'number of seconds to wait for agent reply' - - - name: agent_version_timeout - type: integer - default: 300 - help: 'number of seconds to wait for agent to be fully operational' - - - name: agent_resetnetwork_timeout - type: integer - default: 60 - help: 'number of seconds to wait for agent reply to resetnetwork request' - - - name: xenapi_agent_path - type: string - default: 'usr/sbin/xe-update-networking' - help: 'Specifies the path in which the xenapi guest agent should be located. If the agent is present, network configuration is not injected into the image. Used if compute_driver=xenapi.XenAPIDriver and flat_injected=True' - - - name: xenapi_disable_agent - type: boolean - default: False - help: 'Disable XenAPI agent. Reduces the amount of time it takes nova to detect that a VM has started, when that VM does not have the agent installed' - - - name: xenapi_connection_url - type: string - default: ~ - help: 'URL for connection to XenServer/Xen Cloud Platform. Required if compute_driver=xenapi.XenAPIDriver' - - - name: xenapi_connection_username - type: string - default: 'root' - help: 'Username for connection to XenServer/Xen Cloud Platform. Used only if compute_driver=xenapi.XenAPIDriver' - - - name: xenapi_connection_password - type: string - default: ~ - help: 'Password for connection to XenServer/Xen Cloud Platform. Used only if compute_driver=xenapi.XenAPIDriver' - - - name: xenapi_connection_concurrent - type: integer - default: 5 - help: 'Maximum number of concurrent XenAPI connections. Used only if compute_driver=xenapi.XenAPIDriver' - - - name: xenapi_vhd_coalesce_poll_interval - type: floating point - default: '5.0' - help: 'The interval used for polling of coalescing vhds. Used only if compute_driver=xenapi.XenAPIDriver' - - - name: xenapi_check_host - type: boolean - default: True - help: 'Ensure compute service is running on host XenAPI connects to.' - - - name: xenapi_vhd_coalesce_max_attempts - type: integer - default: 5 - help: 'Max number of times to poll for VHD to coalesce. Used only if compute_driver=xenapi.XenAPIDriver' - - - name: xenapi_sr_base_path - type: string - default: '/var/run/sr-mount' - help: 'Base path to the storage repository' - - - name: target_host - type: string - default: ~ - help: 'iSCSI Target Host' - - - name: target_port - type: port - default: 3260 - help: 'iSCSI Target Port, 3260 Default' - - - name: iqn_prefix - type: string - default: 'iqn.2010-10.org.openstack' - help: 'IQN Prefix' - - - name: xenapi_remap_vbd_dev - type: boolean - default: False - help: 'Used to enable the remapping of VBD dev' - - - name: xenapi_remap_vbd_dev_prefix - type: string - default: 'sd' - help: 'Specify prefix to remap VBD dev to' - - - name: xenapi_login_timeout - type: integer - default: 10 - help: 'Timeout in seconds for XenAPI login.' - - - name: use_join_force - type: boolean - default: True - help: 'To use for hosts with different CPUs' - - - name: xenapi_ovs_integration_bridge - type: string - default: 'xapi1' - help: 'Name of Integration Bridge used by Open vSwitch' - - - name: cache_images - type: string - default: 'all' - help: 'Cache glance images locally. `all` will cache all images, `some` will only cache images that have the image_property `cache_in_nova=True`, and `none` turns off caching entirely' - - - name: default_os_type - type: string - default: 'linux' - help: 'Default OS type' - - - name: block_device_creation_timeout - type: integer - default: 10 - help: 'Time to wait for a block device to be created' - - - name: max_kernel_ramdisk_size - type: integer - default: 16777216 - help: 'Maximum size in bytes of kernel or ramdisk images' - - - name: sr_matching_filter - type: string - default: 'other-config:i18n-keylocal-storage' - help: 'Filter for finding the SR to be used to install guest instances on. The default value is the Local Storage in default XenServer/XCP installations. To select an SR with a different matching criteria, you could set it to other- config:my_favorite_sr=true. On the other hand, to fall back on the Default SR, as displayed by XenCenter, set this flag to: default-sr:true' - - - name: xenapi_sparse_copy - type: boolean - default: True - help: 'Whether to use sparse_copy for copying data on a resize down' - - - name: xenapi_num_vbd_unplug_retries - type: integer - default: 10 - help: 'Maximum number of retries to unplug VBD' - - - name: xenapi_torrent_images - type: string - default: 'none' - help: 'Whether or not to download images via Bit Torrent' - - - name: xenapi_torrent_base_url - type: string - default: ~ - help: 'Base URL for torrent files.' - - - name: xenapi_torrent_seed_chance - type: floating point - default: '1.0' - help: 'Probability that peer will become a seeder.' - - - name: xenapi_torrent_seed_duration - type: integer - default: 3600 - help: 'Number of seconds after downloading an image via BitTorrent that it should be seeded for other peers.' - - - name: xenapi_torrent_max_last_accessed - type: integer - default: 86400 - help: 'Cached torrent files not accessed within this number of seconds can be reaped' - - - name: xenapi_torrent_listen_port_start - type: port - default: 6881 - help: 'Beginning of port range to listen on' - - - name: xenapi_torrent_listen_port_end - type: port - default: 6891 - help: 'End of port range to listen on' - - - name: xenapi_torrent_download_stall_cutoff - type: integer - default: 600 - help: 'Number of seconds a download can remain at the same progress percentage w/o being considered a stall' - - - name: xenapi_torrent_max_seeder_processes_per_host - type: integer - default: 1 - help: 'Maximum number of seeder processes to run concurrently within a given dom0.' - - - name: xenapi_running_timeout - type: integer - default: 60 - help: 'number of seconds to wait for instance to go to running state' - - - name: xenapi_vif_driver - type: string - default: 'nova.virt.xenapi.vif.XenAPIBridgeDriver' - help: 'The XenAPI VIF driver using XenServer Network APIs.' - - - name: xenapi_image_upload_handler - type: string - default: 'nova.virt.xenapi.imageupload.glance.GlanceStore' - help: 'Object Store Driver used to handle image uploads.' - - - name: novncproxy_base_url - type: string - default: 'http://127.0.0.1:6080/vnc_auto.html' - help: "location of vnc console proxy, in the form 'http://127.0.0.1:6080/vnc_auto.html'" - - - name: xvpvncproxy_base_url - type: string - default: 'http://127.0.0.1:6081/console' - help: "location of nova xvp vnc console proxy, in the form 'http://127.0.0.1:6081/console'" - - - name: vncserver_listen - type: string - default: '127.0.0.1' - help: 'IP address on which instance vncservers should listen' - - - name: vncserver_proxyclient_address - type: string - default: '127.0.0.1' - help: 'the address to which proxy clients' - - - name: vnc_enabled - type: boolean - default: True - help: 'enable vnc related features' - - - name: vnc_keymap - type: string - default: 'en-us' - help: 'keymap for vnc' - - - name: xvpvncproxy_port - type: port - default: 6081 - help: 'Port that the XCP VNC proxy should bind to' - - - name: xvpvncproxy_host - type: host - default: '0.0.0.0' - help: 'Address that the XCP VNC proxy should bind to' - - - name: volume_api_class - type: string - default: 'nova.volume.cinder.API' - help: 'The full class name of the volume API class to use' - - - name: cinder_catalog_info - type: string - default: 'volume:cinder:publicURL' - help: 'Info to match when looking for cinder in the service catalog. Format is : separated values of the form: ::' - - - name: cinder_endpoint_template - type: string - default: ~ - help: 'Override service catalog lookup with template for cinder endpoint e.g. http://localhost:8776/v1/%(project_id)s' - - - name: os_region_name - type: string - default: ~ - help: 'region name of this node' - - - name: cinder_http_retries - type: integer - default: 3 - help: 'Number of cinderclient retries on failed http calls' - - - name: cinder_api_insecure - type: boolean - default: False - help: 'Allow to perform insecure SSL requests to cinder' - - - name: cinder_cross_az_attach - type: boolean - default: True - help: 'Allow attach between instance and volume in different availability zones.' - - - name: HYPERV.instances_path_share - type: string - default: '' - help: "The name of a Windows share name mapped to the 'instances_path' dir and used by the resize feature to copy files to the target host. If left blank, an administrative share will be used, looking for the same 'instances_path' used locally" - - - name: conductor.use_local - type: boolean - default: False - help: 'Perform nova-conductor operations locally' - - - name: cells.topic - type: string - default: 'cells' - help: 'the topic cells nodes listen on' - - - name: cells.manager - type: string - default: 'nova.cells.manager.CellsManager' - help: 'Manager for cells' - - - name: baremetal.driver - type: string - default: 'nova.virt.baremetal.pxe.PXE' - help: 'Baremetal driver back-end' - - - name: cells.instance_updated_at_threshold - type: integer - default: 3600 - help: 'Number of seconds after an instance was updated or deleted to continue to update cells' - - - name: cells.instance_update_num_instances - type: integer - default: 1 - help: 'Number of instances to update per periodic task run' - - - name: cells.max_hop_count - type: integer - default: 10 - help: 'Maximum number of hops for cells routing.' - - - name: cells.scheduler - type: string - default: 'nova.cells.scheduler.CellsScheduler' - help: 'Cells scheduler to use' - - - name: cells.enable - type: boolean - default: False - help: 'Enable cell functionality' - - - name: cells.name - type: string - default: 'nova' - help: 'name of this cell' - - - name: cells.capabilities - type: list - default: ['hypervisorxenserver;kvm', 'oslinux;windows'] - help: 'Key/Multi-value list with the capabilities of the cell' - - - name: cells.call_timeout - type: integer - default: 60 - help: 'Seconds to wait for response from a call to a cell.' - - - name: cells.rpc_driver_queue_base - type: string - default: 'cells.intercell' - help: 'Base queue name to use when communicating between cells. Various topics by message type will be appended to this.' - - - name: cells.scheduler_retries - type: integer - default: 10 - help: 'How many retries when no cells are available.' - - - name: cells.scheduler_retry_delay - type: integer - default: 2 - help: 'How often to retry in seconds when no cells are available.' - - - name: cells.db_check_interval - type: integer - default: 60 - help: 'Seconds between getting fresh cell info from db.' - - - name: zookeeper.address - type: string - default: ~ - help: 'The ZooKeeper addresses for servicegroup service in the format of host1:port,host2:port,host3:port' - - - name: zookeeper.recv_timeout - type: integer - default: 4000 - help: 'recv_timeout parameter for the zk session' - - - name: zookeeper.sg_prefix - type: string - default: '/servicegroups' - help: 'The prefix used in ZooKeeper to store ephemeral nodes' - - - name: zookeeper.sg_retry_interval - type: integer - default: 5 - help: 'Number of seconds to wait until retrying to join the session' - - - name: baremetal.inject_password - type: boolean - default: True - help: 'Whether baremetal compute injects password or not' - - - name: baremetal.vif_driver - type: string - default: 'nova.virt.baremetal.vif_driver.BareMetalVIFDriver' - help: 'Baremetal VIF driver.' - - - name: baremetal.volume_driver - type: string - default: 'nova.virt.baremetal.volume_driver.LibvirtVolumeDriver' - help: 'Baremetal volume driver.' - - - name: baremetal.instance_type_extra_specs - type: list - default: [] - help: "a list of additional capabilities corresponding to instance_type_extra_specs for this compute host to advertise. Valid entries are name=value, pairs For example, 'key1:val1, key2:val2'" - - - name: baremetal.power_manager - type: string - default: 'nova.virt.baremetal.ipmi.IPMI' - help: 'Baremetal power management method' - - - name: baremetal.tftp_root - type: string - default: '/tftpboot' - help: "Baremetal compute node's tftp root path" - - - name: baremetal.terminal - type: string - default: 'shellinaboxd' - help: 'path to baremetal terminal program' - - - name: baremetal.terminal_cert_dir - type: string - default: ~ - help: 'path to baremetal terminal SSL cert(PEM)' - - - name: baremetal.terminal_pid_dir - type: string - default: '$state_path/baremetal/console' - help: 'path to directory stores pidfiles of baremetal_terminal' - - - name: baremetal.ipmi_power_retry - type: integer - default: 5 - help: 'maximal number of retries for IPMI operations' - - - name: baremetal.deploy_kernel - type: string - default: ~ - help: 'Default kernel image ID used in deployment phase' - - - name: baremetal.deploy_ramdisk - type: string - default: ~ - help: 'Default ramdisk image ID used in deployment phase' - - - name: baremetal.net_config_template - type: string - default: '$pybasedir/nova/virt/baremetal/net-dhcp.ubuntu.template' - help: 'Template file for injected network config' - - - name: baremetal.pxe_append_params - type: string - default: ~ - help: 'additional append parameters for baremetal PXE boot' - - - name: baremetal.pxe_config_template - type: string - default: '$pybasedir/nova/virt/baremetal/pxe_config.template' - help: 'Template file for PXE configuration' - - - name: baremetal.pxe_deploy_timeout - type: integer - default: 0 - help: 'Timeout for PXE deployments. Default: 0' - - - name: baremetal.virtual_power_ssh_host - type: string - default: '' - help: 'ip or name to virtual power host' - - - name: baremetal.virtual_power_type - type: string - default: 'vbox' - help: 'base command to use for virtual power(vbox,virsh)' - - - name: baremetal.virtual_power_host_user - type: string - default: '' - help: 'user to execute virtual power commands as' - - - name: baremetal.virtual_power_host_pass - type: string - default: '' - help: 'password for virtual power host_user' - - - name: baremetal.use_unsafe_iscsi - type: boolean - default: False - help: 'Do not set this out of dev/test environments. If a node does not have a fixed PXE IP address, volumes are exported with globally opened ACL' - - - name: baremetal.iscsi_iqn_prefix - type: string - default: 'iqn.2010-10.org.openstack.baremetal' - help: 'iSCSI IQN prefix used in baremetal volume connections.' - - - name: rpc_notifier2.topics - type: list - default: ['notifications'] - help: 'AMQP topic(s) used for openstack notifications' - - - name: trusted_computing.attestation_server - type: string - default: ~ - help: 'attestation server http' - - - name: trusted_computing.attestation_server_ca_file - type: string - default: ~ - help: 'attestation server Cert file for Identity verification' - - - name: trusted_computing.attestation_port - type: port - default: 8443 - help: 'attestation server port' - - - name: trusted_computing.attestation_api_url - type: string - default: '/OpenAttestationWebServices/V1.0' - help: 'attestation web API URL' - - - name: trusted_computing.attestation_auth_blob - type: string - default: ~ - help: 'attestation authorization blob - must change' - - - name: trusted_computing.attestation_auth_timeout - type: integer - default: 60 - help: 'Attestation status cache valid period length' - - - name: vmware.integration_bridge - type: string - default: 'br-int' - help: 'Name of Integration Bridge' - - - name: spice.html5proxy_base_url - type: string - default: 'http://127.0.0.1:6082/spice_auto.html' - help: "location of spice html5 console proxy, in the form 'http://127.0.0.1:6082/spice_auto.html'" - - - name: spice.server_listen - type: string - default: '127.0.0.1' - help: 'IP address on which instance spice server should listen' - - - name: spice.server_proxyclient_address - type: string - default: '127.0.0.1' - help: 'the address to which proxy clients' - - - name: spice.enabled - type: boolean - default: False - help: 'enable spice related features' - - - name: spice.agent_enabled - type: boolean - default: True - help: 'enable spice guest agent support' - - - name: spice.keymap - type: string - default: 'en-us' - help: 'keymap for spice' - diff --git a/rubick/schemas/nova/2013.2.0.yml b/rubick/schemas/nova/2013.2.0.yml deleted file mode 100644 index 2779498..0000000 --- a/rubick/schemas/nova/2013.2.0.yml +++ /dev/null @@ -1,3229 +0,0 @@ -project: nova -version: '2013.2.0' -parameters: - - - name: internal_service_availability_zone - type: string - default: 'internal' - help: 'availability_zone to show internal services under ' - - - name: default_availability_zone - type: string - default: 'nova' - help: 'default compute node availability_zone ' - - - name: ssl.ca_file - type: string - default: ~ - help: 'CA certificate file to use to verify connecting clients ' - - - name: ssl.key_file - type: string - default: ~ - help: 'Private key file to use when starting the server securely ' - - - name: crl_file - type: string - default: 'crl.pem' - help: 'Filename of root Certificate Revocation List ' - - - name: keys_path - type: string - default: '$state_path/keys' - help: 'Where we keep our keys ' - - - name: ca_path - type: string - default: '$state_path/CA' - help: 'Where we keep our root CA ' - - - name: use_project_ca - type: boolean - default: False - help: 'Should we use a CA for each project? ' - - - name: user_cert_subject - type: string - default: '/C=US/ST=California/O=OpenStack/OU=NovaDev/CN=%.16s-%.16s-%s' - help: 'Subject for certificate for users, %s for project, user, timestamp ' - - - name: project_cert_subject - type: string - default: '/C=US/ST=California/O=OpenStack/OU=NovaDev/CN=project-ca-%.16s-%s' - help: 'Subject for certificate for projects, %s for project, timestamp ' - - - name: fatal_exception_format_errors - type: boolean - default: False - help: 'make exception message format errors fatal ' - - - name: my_ip - type: string - default: '10.0.0.1' - help: 'ip address of this host ' - - - name: matchmaker_redis.host - type: string - default: '127.0.0.1' - help: 'Host to locate redis ' - - - name: use_ipv6 - type: boolean - default: False - help: 'use ipv6 ' - - - name: notify_on_state_change - type: string - default: ~ - help: "If set, send compute.instance.update notifications on instance state changes. Valid values are None for no notifications, 'vm_state' for notifications on VM state changes, or 'vm_and_task_state' for notifications on VM and task state changes. " - - - name: notify_api_faults - type: boolean - default: False - help: 'If set, send api.fault notifications on caught exceptions in the API service. ' - - - name: pybasedir - type: string - default: '/usr/lib/python/site-packages' - help: 'Directory where the nova python module is installed ' - - - name: bindir - type: string - default: '/usr/local/bin' - help: 'Directory where nova binaries are installed ' - - - name: state_path - type: string - default: '$pybasedir' - help: "Top-level directory for maintaining nova's state " - - - name: policy_file - type: string - default: 'policy.json' - help: 'JSON file representing policy ' - - - name: policy_default_rule - type: string - default: 'default' - help: 'Rule checked when requested rule is not found ' - - - name: quota_instances - type: integer - default: 10 - help: 'number of instances allowed per project ' - - - name: quota_cores - type: integer - default: 20 - help: 'number of instance cores allowed per project ' - - - name: quota_ram - type: integer - default: 51200 - help: 'megabytes of instance ram allowed per project ' - - - name: quota_floating_ips - type: integer - default: 10 - help: 'number of floating ips allowed per project ' - - - name: quota_fixed_ips - type: integer - default: -1 - help: 'number of fixed ips allowed per project (this should be at least the number of instances allowed) ' - - - name: quota_metadata_items - type: integer - default: 128 - help: 'number of metadata items allowed per instance ' - - - name: quota_injected_files - type: integer - default: 5 - help: 'number of injected files allowed ' - - - name: quota_injected_file_content_bytes - type: integer - default: 10240 - help: 'number of bytes allowed per injected file ' - - - name: quota_injected_file_path_bytes - type: integer - default: 255 - help: 'number of bytes allowed per injected file path ' - - - name: quota_security_groups - type: integer - default: 10 - help: 'number of security groups per project ' - - - name: quota_security_group_rules - type: integer - default: 20 - help: 'number of security rules per security group ' - - - name: quota_key_pairs - type: integer - default: 100 - help: 'number of key pairs per user ' - - - name: reservation_expire - type: integer - default: 86400 - help: 'number of seconds until a reservation expires ' - - - name: until_refresh - type: integer - default: 0 - help: 'count of reservations until usage is refreshed ' - - - name: max_age - type: integer - default: 0 - help: 'number of seconds between subsequent usage refreshes ' - - - name: quota_driver - type: string - default: 'nova.quota.DbQuotaDriver' - help: 'default driver to use for quota checks ' - - - name: report_interval - type: integer - default: 10 - help: 'seconds between nodes reporting state to datastore ' - - - name: periodic_enable - type: boolean - default: True - help: 'enable periodic tasks ' - - - name: periodic_fuzzy_delay - type: integer - default: 60 - help: 'range of seconds to randomly delay when starting the periodic task scheduler to reduce stampeding. (Disable by setting to 0) ' - - - name: enabled_apis - type: string_list - default: ['ec2', 'osapi_compute', 'metadata'] - help: 'a list of APIs to enable by default ' - - - name: enabled_ssl_apis - type: string_list - default: [] - help: 'a list of APIs with enabled SSL ' - - - name: ec2_listen - type: host - default: '0.0.0.0' - help: 'IP address for EC2 API to listen ' - - - name: ec2_listen_port - type: port - default: 8773 - help: 'port for ec2 api to listen ' - - - name: ec2_workers - type: integer - default: ~ - help: 'Number of workers for EC2 API service ' - - - name: osapi_compute_listen - type: host - default: '0.0.0.0' - help: 'IP address for OpenStack API to listen ' - - - name: osapi_compute_listen_port - type: port - default: 8774 - help: 'list port for osapi compute ' - - - name: osapi_compute_workers - type: integer - default: ~ - help: 'Number of workers for OpenStack API service ' - - - name: metadata_manager - type: string - default: 'nova.api.manager.MetadataManager' - help: 'OpenStack metadata service manager ' - - - name: metadata_listen - type: host - default: '0.0.0.0' - help: 'IP address for metadata api to listen ' - - - name: metadata_listen_port - type: port - default: 8775 - help: 'port for metadata api to listen ' - - - name: metadata_workers - type: integer - default: ~ - help: 'Number of workers for metadata service ' - - - name: compute_manager - type: string - default: 'nova.compute.manager.ComputeManager' - help: 'full class name for the Manager for compute ' - - - name: console_manager - type: string - default: 'nova.console.manager.ConsoleProxyManager' - help: 'full class name for the Manager for console proxy ' - - - name: cert_manager - type: string - default: 'nova.cert.manager.CertManager' - help: 'full class name for the Manager for cert ' - - - name: network_manager - type: string - default: 'nova.network.manager.VlanManager' - help: 'full class name for the Manager for network ' - - - name: scheduler_manager - type: string - default: 'nova.scheduler.manager.SchedulerManager' - help: 'full class name for the Manager for scheduler ' - - - name: service_down_time - type: integer - default: 60 - help: 'maximum time since last check-in for up service ' - - - name: sqlite_clean_db - type: string - default: 'clean.sqlite' - help: 'File name of clean sqlite db ' - - - name: monkey_patch - type: boolean - default: False - help: 'Whether to log monkey patching ' - - - name: monkey_patch_modules - type: string_list - default: ['nova.api.ec2.cloud:nova.notifications.notify_decorator', 'nova.compute.api:nova.notifications.notify_decorator'] - help: 'List of modules/decorators to monkey patch ' - - - name: password_length - type: integer - default: 12 - help: 'Length of generated instance admin passwords ' - - - name: instance_usage_audit_period - type: string - default: 'month' - help: 'time period to generate instance usages for. Time period must be hour, day, month or year ' - - - name: rootwrap_config - type: string - default: '/etc/nova/rootwrap.conf' - help: 'Path to the rootwrap configuration file to use for running commands as root ' - - - name: tempdir - type: string - default: ~ - help: 'Explicitly specify the temporary working directory ' - - - name: api_paste_config - type: string - default: 'api-paste.ini' - help: 'File name for the paste.deploy config for nova-api ' - - - name: wsgi_log_format - type: string - default: '%(client_ip)s "%(request_line)s" status: %(status_code)s len: %(body_length)s time: %(wall_seconds).7f' - help: 'A python format string that is used as the template to generate log lines. The following values can be formatted into it: client_ip, date_time, request_line, status_code, body_length, wall_seconds. ' - - - name: ssl_ca_file - type: string - default: ~ - help: 'CA certificate file to use to verify connecting clients ' - - - name: ssl_cert_file - type: string - default: ~ - help: 'SSL certificate of API server ' - - - name: ssl_key_file - type: string - default: ~ - help: 'SSL private key of API server ' - - - name: tcp_keepidle - type: integer - default: 600 - help: 'Sets the value of TCP_KEEPIDLE in seconds for each server socket. Not supported on OS X. ' - - - name: api_rate_limit - type: boolean - default: False - help: 'whether to use per-user rate limiting for the api. ' - - - name: auth_strategy - type: string - default: 'noauth' - help: 'The strategy to use for auth: noauth or keystone. ' - - - name: use_forwarded_for - type: boolean - default: False - help: 'Treat X-Forwarded-For as the canonical remote address. Only enable this if you have a sanitizing proxy. ' - - - name: lockout_attempts - type: integer - default: 5 - help: 'Number of failed auths before lockout. ' - - - name: lockout_minutes - type: integer - default: 15 - help: 'Number of minutes to lockout if triggered. ' - - - name: lockout_window - type: integer - default: 15 - help: 'Number of minutes for lockout window. ' - - - name: keystone_ec2_url - type: string - default: 'http://localhost:5000/v2.0/ec2tokens' - help: 'URL to get token from ec2 request. ' - - - name: ec2_private_dns_show_ip - type: boolean - default: False - help: 'Return the IP address as private dns hostname in describe instances ' - - - name: ec2_strict_validation - type: boolean - default: True - help: 'Validate security group names according to EC2 specification ' - - - name: ec2_timestamp_expiry - type: integer - default: 300 - help: 'Time in seconds before ec2 timestamp expires ' - - - name: ec2_host - type: string - default: '$my_ip' - help: 'the ip of the ec2 api server ' - - - name: ec2_dmz_host - type: string - default: '$my_ip' - help: 'the internal ip of the ec2 api server ' - - - name: ec2_port - type: port - default: 8773 - help: 'the port of the ec2 api server ' - - - name: ec2_scheme - type: string - default: 'http' - help: 'the protocol to use when connecting to the ec2 api server (http, https) ' - - - name: ec2_path - type: string - default: '/services/Cloud' - help: 'the path prefix used to call the ec2 api server ' - - - name: region_list - type: string_list - default: [] - help: 'list of region=fqdn pairs separated by commas ' - - - name: config_drive_skip_versions - type: string - default: '1.0 2007-01-19 2007-03-01 2007-08-29 2007-10-10 2007-12-15 2008-02-01 2008-09-01' - help: 'List of metadata versions to skip placing into the config drive ' - - - name: vendordata_driver - type: string - default: 'nova.api.metadata.vendordata_json.JsonFileVendorData' - help: 'Driver to use for vendor data ' - - - name: service_neutron_metadata_proxy - type: boolean - default: False - help: 'Set flag to indicate Neutron will proxy metadata requests and resolve instance ids. ' - - - name: neutron_metadata_proxy_shared_secret - type: string - default: '' - help: 'Shared secret to validate proxies Neutron metadata requests ' - - - name: vendordata_jsonfile_path - type: string - default: ~ - help: 'File to load json formated vendor data from ' - - - name: osapi_max_limit - type: integer - default: 1000 - help: 'the maximum number of items returned in a single response from a collection resource ' - - - name: osapi_compute_link_prefix - type: string - default: ~ - help: 'Base URL that will be presented to users in links to the OpenStack Compute API ' - - - name: osapi_glance_link_prefix - type: string - default: ~ - help: 'Base URL that will be presented to users in links to glance resources ' - - - name: allow_instance_snapshots - type: boolean - default: True - help: 'Permit instance snapshot operations. ' - - - name: osapi_compute_ext_list - type: string_list - default: [] - help: 'Specify list of extensions to load when using osapi_compute_extension option with nova.api.openstack.compute.contrib.select_extensions ' - - - name: fping_path - type: string - default: '/usr/sbin/fping' - help: 'Full path to fping. ' - - - name: enable_network_quota - type: boolean - default: False - help: 'Enables or disables quota checking for tenant networks ' - - - name: use_neutron_default_nets - type: string - default: 'False' - help: 'Control for checking for default networks ' - - - name: neutron_default_tenant_id - type: string - default: 'default' - help: 'Default tenant id when creating neutron networks ' - - - name: osapi_compute_extension - type: string - default: 'nova.api.openstack.compute.contrib.standard_extensions' - help: 'osapi compute extension to load (multi valued)' - - - name: osapi_hide_server_address_states - type: string_list - default: ['building'] - help: 'List of instance states that should hide network info ' - - - name: enable_instance_password - type: boolean - default: True - help: 'Allows use of instance password during server creation ' - - - name: osapi_max_request_body_size - type: integer - default: 114688 - help: 'the maximum body size per each osapi request(bytes) ' - - - name: compute_api_class - type: string - default: 'nova.compute.api.API' - help: 'The full class name of the compute API class to use (deprecated) ' - - - name: cert_topic - type: string - default: 'cert' - help: 'the topic cert nodes listen on ' - - - name: vpn_image_id - type: string - default: '0' - help: 'image id used when starting up a cloudpipe vpn server ' - - - name: vpn_flavor - type: string - default: 'm1.tiny' - help: 'Flavor for vpn instances ' - - - name: boot_script_template - type: string - default: '$pybasedir/nova/cloudpipe/bootscript.template' - help: 'Template for cloudpipe instance boot script ' - - - name: dmz_net - type: string - default: '10.0.0.0' - help: 'Network to push into openvpn config ' - - - name: dmz_mask - type: string - default: '255.255.255.0' - help: 'Netmask to push into openvpn config ' - - - name: vpn_key_suffix - type: string - default: '-vpn' - help: 'Suffix to add to project name for vpn key and secgroups ' - - - name: record - type: boolean - default: False - help: 'Record sessions to FILE.[session_number] ' - - - name: daemon - type: boolean - default: False - help: 'Become a daemon (background process) ' - - - name: ssl_only - type: boolean - default: False - help: 'Disallow non-encrypted connections ' - - - name: source_is_ipv6 - type: boolean - default: False - help: 'Source is ipv6 ' - - - name: upgrade_levels.cert - type: string - default: ~ - help: 'Set a version cap for messages sent to cert services ' - - - name: key - type: string - default: ~ - help: 'SSL key file (if separate from cert) ' - - - name: web - type: string - default: '/usr/share/spice-html5' - help: 'Run webserver on same port. Serve files from DIR. ' - - - name: novncproxy_host - type: host - default: '0.0.0.0' - help: 'Host on which to listen for incoming requests ' - - - name: novncproxy_port - type: port - default: 6080 - help: 'Port on which to listen for incoming requests ' - - - name: spicehtml5proxy_host - type: host - default: '0.0.0.0' - help: 'Host on which to listen for incoming requests ' - - - name: spicehtml5proxy_port - type: port - default: 6082 - help: 'Port on which to listen for incoming requests ' - - - name: allow_resize_to_same_host - type: boolean - default: False - help: 'Allow destination machine to match source for resize. Useful when testing in single-host environments. ' - - - name: allow_migrate_to_same_host - type: boolean - default: False - help: 'Allow migrate machine to the same host. Useful when testing in single-host environments. ' - - - name: default_schedule_zone - type: string - default: ~ - help: "availability zone to use when user doesn't specify one " - - - name: non_inheritable_image_properties - type: string_list - default: ['cache_in_nova', 'bittorrent'] - help: 'These are image properties which a snapshot should not inherit from an instance ' - - - name: null_kernel - type: string - default: 'nokernel' - help: 'kernel image that indicates not to use a kernel, but to use a raw disk image instead ' - - - name: multi_instance_display_name_template - type: string - default: '%(name)s-%(uuid)s' - help: "When creating multiple instances with a single request using the os-multiple-create API extension, this template will be used to build the display name for each instance. The benefit is that the instances end up with different hostnames. To restore legacy behavior of every instance having the same name, set this option to '%(name)s'. Valid keys for the template are: name, uuid, count. " - - - name: max_local_block_devices - type: integer - default: 3 - help: 'Maximum number of devices that will result in a local image being created on the hypervisor node. Setting this to 0 means nova will allow only boot from volume. A negative number means unlimited. ' - - - name: default_flavor - type: string - default: 'm1.small' - help: 'default flavor to use for the EC2 API only. The Nova API does not support a default flavor. ' - - - name: console_host - type: string - default: 'nova' - help: 'Console proxy host to use to connect to instances on this host. ' - - - name: default_access_ip_network_name - type: string - default: ~ - help: 'Name of network to use to set access ips for instances ' - - - name: defer_iptables_apply - type: boolean - default: False - help: 'Whether to batch up the application of IPTables rules during a host restart and apply all at the end of the init phase ' - - - name: instances_path - type: string - default: '$state_path/instances' - help: 'where instances are stored on disk ' - - - name: instance_usage_audit - type: boolean - default: False - help: 'Generate periodic compute.instance.exists notifications ' - - - name: live_migration_retry_count - type: integer - default: 30 - help: 'Number of 1 second retries needed in live_migration ' - - - name: resume_guests_state_on_host_boot - type: boolean - default: False - help: 'Whether to start guests that were running before the host rebooted ' - - - name: network_allocate_retries - type: integer - default: 0 - help: 'Number of times to retry network allocation on failures ' - - - name: maximum_instance_delete_attempts - type: integer - default: 5 - help: "The number of times to attempt to reap an instance's files. " - - - name: bandwidth_poll_interval - type: integer - default: 600 - help: 'interval to pull bandwidth usage info ' - - - name: sync_power_state_interval - type: integer - default: 600 - help: 'interval to sync power states between the database and the hypervisor ' - - - name: heal_instance_info_cache_interval - type: integer - default: 60 - help: 'Number of seconds between instance info_cache self healing updates ' - - - name: host_state_interval - type: integer - default: 120 - help: 'Interval in seconds for querying the host status ' - - - name: image_cache_manager_interval - type: integer - default: 2400 - help: 'Number of seconds to wait between runs of the image cache manager ' - - - name: reclaim_instance_interval - type: integer - default: 0 - help: 'Interval in seconds for reclaiming deleted instances ' - - - name: volume_usage_poll_interval - type: integer - default: 0 - help: 'Interval in seconds for gathering volume usages ' - - - name: shelved_poll_interval - type: integer - default: 3600 - help: 'Interval in seconds for polling shelved instances to offload ' - - - name: shelved_offload_time - type: integer - default: 0 - help: 'Time in seconds before a shelved instance is eligible for removing from a host. -1 never offload, 0 offload when shelved ' - - - name: instance_delete_interval - type: integer - default: 300 - help: 'Interval in seconds for retrying failed instance file deletes ' - - - name: running_deleted_instance_action - type: string - default: 'log' - help: "Action to take if a running deleted instance is detected.Valid options are 'noop', 'log' and 'reap'. Set to 'noop' to disable. " - - - name: running_deleted_instance_poll_interval - type: integer - default: 1800 - help: 'Number of seconds to wait between runs of the cleanup task. ' - - - name: running_deleted_instance_timeout - type: integer - default: 0 - help: 'Number of seconds after being deleted when a running instance should be considered eligible for cleanup. ' - - - name: reboot_timeout - type: integer - default: 0 - help: 'Automatically hard reboot an instance if it has been stuck in a rebooting state longer than N seconds. Set to 0 to disable. ' - - - name: instance_build_timeout - type: integer - default: 0 - help: 'Amount of time in seconds an instance can be in BUILD before going into ERROR status.Set to 0 to disable. ' - - - name: rescue_timeout - type: integer - default: 0 - help: 'Automatically unrescue an instance after N seconds. Set to 0 to disable. ' - - - name: resize_confirm_window - type: integer - default: 0 - help: 'Automatically confirm resizes after N seconds. Set to 0 to disable. ' - - - name: reserved_host_disk_mb - type: integer - default: 0 - help: 'Amount of disk in MB to reserve for the host ' - - - name: reserved_host_memory_mb - type: integer - default: 512 - help: 'Amount of memory in MB to reserve for the host ' - - - name: compute_stats_class - type: string - default: 'nova.compute.stats.Stats' - help: 'Class that will manage stats for the local compute host ' - - - name: compute_topic - type: string - default: 'compute' - help: 'the topic compute nodes listen on ' - - - name: migrate_max_retries - type: integer - default: -1 - help: 'Number of times to retry live-migration before failing. If == -1, try until out of hosts. If == 0, only try once, no retries. ' - - - name: console_driver - type: string - default: 'nova.console.xvp.XVPConsoleProxy' - help: 'Driver to use for the console proxy ' - - - name: stub_compute - type: boolean - default: False - help: 'Stub calls to compute worker for tests ' - - - name: console_public_hostname - type: string - default: 'nova' - help: 'Publicly visible name for this console host ' - - - name: console_topic - type: string - default: 'console' - help: 'the topic console proxy nodes listen on ' - - - name: console_vmrc_port - type: port - default: 443 - help: 'port for VMware VMRC connections ' - - - name: console_vmrc_error_retries - type: integer - default: 10 - help: 'number of retries for retrieving VMRC information ' - - - name: console_xvp_conf_template - type: string - default: '$pybasedir/nova/console/xvp.conf.template' - help: 'XVP conf template ' - - - name: console_xvp_conf - type: string - default: '/etc/xvp.conf' - help: 'generated XVP conf file ' - - - name: console_xvp_pid - type: string - default: '/var/run/xvp.pid' - help: 'XVP master process pid file ' - - - name: console_xvp_log - type: string - default: '/var/log/xvp.log' - help: 'XVP log file ' - - - name: console_xvp_multiplex_port - type: port - default: 5900 - help: 'port for XVP to multiplex VNC connections on ' - - - name: consoleauth_topic - type: string - default: 'consoleauth' - help: 'the topic console auth proxy nodes listen on ' - - - name: console_token_ttl - type: integer - default: 600 - help: 'How many seconds before deleting tokens ' - - - name: consoleauth_manager - type: string - default: 'nova.consoleauth.manager.ConsoleAuthManager' - help: 'Manager for console auth ' - - - name: enable_new_services - type: boolean - default: True - help: 'Services to be added to the available pool on create ' - - - name: instance_name_template - type: string - default: 'instance-%08x' - help: 'Template string to be used to generate instance names ' - - - name: snapshot_name_template - type: string - default: 'snapshot-%s' - help: 'Template string to be used to generate snapshot names ' - - - name: db_driver - type: string - default: 'nova.db' - help: 'driver to use for database access ' - - - name: osapi_compute_unique_server_name_scope - type: string - default: '' - help: "When set, compute API will consider duplicate hostnames invalid within the specified scope, regardless of case. Should be empty, 'project' or 'global'. " - - - name: glance_host - type: string - default: '$my_ip' - help: 'default glance hostname or ip ' - - - name: glance_port - type: port - default: 9292 - help: 'default glance port ' - - - name: glance_protocol - type: string - default: 'http' - help: 'Default protocol to use when connecting to glance. Set to https for SSL. ' - - - name: glance_api_servers - type: string_list - default: ['$glance_host:$glance_port'] - help: 'A list of the glance api servers available to nova. Prefix with https:// for ssl-based glance api servers. ([hostname|ip]:port) ' - - - name: glance_api_insecure - type: boolean - default: False - help: 'Allow to perform insecure SSL (https) requests to glance ' - - - name: glance_num_retries - type: integer - default: 0 - help: 'Number retries when downloading an image from glance ' - - - name: allowed_direct_url_schemes - type: string_list - default: [] - help: 'A list of url scheme that can be downloaded directly via the direct_url. Currently supported schemes: [file]. ' - - - name: image_decryption_dir - type: string - default: '/tmp' - help: 'parent dir for tempdir used for image decryption ' - - - name: s3_host - type: string - default: '$my_ip' - help: 'hostname or ip for OpenStack to use when accessing the s3 api ' - - - name: s3_port - type: port - default: 3333 - help: 'port used when accessing the s3 api ' - - - name: s3_access_key - type: string - default: 'notchecked' - help: 'access key to use for s3 server for images ' - - - name: s3_secret_key - type: string - default: 'notchecked' - help: 'secret key to use for s3 server for images ' - - - name: s3_use_ssl - type: boolean - default: False - help: 'whether to use ssl when talking to s3 ' - - - name: s3_affix_tenant - type: boolean - default: False - help: 'whether to affix the tenant id to the access key when downloading from s3 ' - - - name: ipv6_backend - type: string - default: 'rfc2462' - help: 'Backend to use for IPv6 generation ' - - - name: network_api_class - type: string - default: 'nova.network.api.API' - help: 'The full class name of the network API class to use ' - - - name: network_driver - type: string - default: 'nova.network.linux_net' - help: 'Driver to use for network creation ' - - - name: default_floating_pool - type: string - default: 'nova' - help: 'Default pool for floating ips ' - - - name: auto_assign_floating_ip - type: boolean - default: False - help: 'Autoassigning floating ip to VM ' - - - name: floating_ip_dns_manager - type: string - default: 'nova.network.noop_dns_driver.NoopDNSDriver' - help: 'full class name for the DNS Manager for floating IPs ' - - - name: instance_dns_manager - type: string - default: 'nova.network.noop_dns_driver.NoopDNSDriver' - help: 'full class name for the DNS Manager for instance IPs ' - - - name: instance_dns_domain - type: string - default: '' - help: 'full class name for the DNS Zone for instance IPs ' - - - name: ldap_dns_url - type: string - default: 'ldap://ldap.example.com:389' - help: 'URL for ldap server which will store dns entries ' - - - name: ldap_dns_user - type: string - default: 'uid=admin,ou=people,dc=example,dc=org' - help: 'user for ldap DNS ' - - - name: ldap_dns_password - type: string - default: 'password' - help: 'password for ldap DNS ' - - - name: ldap_dns_soa_hostmaster - type: string - default: 'hostmaster@example.org' - help: 'Hostmaster for ldap dns driver Statement of Authority ' - - - name: ldap_dns_servers - type: string - default: 'dns.example.org' - help: 'DNS Servers for ldap dns driver (multi valued)' - - - name: ldap_dns_base_dn - type: string - default: 'ou=hosts,dc=example,dc=org' - help: 'Base DN for DNS entries in ldap ' - - - name: ldap_dns_soa_refresh - type: string - default: '1800' - help: 'Refresh interval (in seconds) for ldap dns driver Statement of Authority ' - - - name: ldap_dns_soa_retry - type: string - default: '3600' - help: 'Retry interval (in seconds) for ldap dns driver Statement of Authority ' - - - name: ldap_dns_soa_expiry - type: string - default: '86400' - help: 'Expiry interval (in seconds) for ldap dns driver Statement of Authority ' - - - name: ldap_dns_soa_minimum - type: string - default: '7200' - help: 'Minimum interval (in seconds) for ldap dns driver Statement of Authority ' - - - name: dhcpbridge_flagfile - type: string - default: '/etc/nova/nova-dhcpbridge.conf' - help: 'location of flagfiles for dhcpbridge (multi valued)' - - - name: networks_path - type: string - default: '$state_path/networks' - help: 'Location to keep network config files ' - - - name: public_interface - type: string - default: 'eth0' - help: 'Interface for public IP addresses ' - - - name: network_device_mtu - type: string - default: ~ - help: 'MTU setting for vlan ' - - - name: dhcpbridge - type: string - default: '$bindir/nova-dhcpbridge' - help: 'location of nova-dhcpbridge ' - - - name: routing_source_ip - type: string - default: '$my_ip' - help: 'Public IP of network host ' - - - name: dhcp_lease_time - type: integer - default: 120 - help: 'Lifetime of a DHCP lease in seconds ' - - - name: dns_server - type: string - default: '' - help: 'if set, uses specific dns server for dnsmasq. Canbe specified multiple times. (multi valued)' - - - name: use_network_dns_servers - type: boolean - default: False - help: 'if set, uses the dns1 and dns2 from the network ref.as dns servers. ' - - - name: dmz_cidr - type: string_list - default: [] - help: 'A list of dmz range that should be accepted ' - - - name: force_snat_range - type: string - default: '' - help: 'Traffic to this range will always be snatted to the fallback ip, even if it would normally be bridged out of the node. Can be specified multiple times. (multi valued)' - - - name: dnsmasq_config_file - type: string - default: '' - help: 'Override the default dnsmasq settings with this file ' - - - name: linuxnet_interface_driver - type: string - default: 'nova.network.linux_net.LinuxBridgeInterfaceDriver' - help: 'Driver used to create ethernet devices. ' - - - name: linuxnet_ovs_integration_bridge - type: string - default: 'br-int' - help: 'Name of Open vSwitch bridge used with linuxnet ' - - - name: send_arp_for_ha - type: boolean - default: False - help: 'send gratuitous ARPs for HA setup ' - - - name: send_arp_for_ha_count - type: integer - default: 3 - help: 'send this many gratuitous ARPs for HA setup ' - - - name: use_single_default_gateway - type: boolean - default: False - help: 'Use single default gateway. Only first nic of vm will get default gateway from dhcp server ' - - - name: forward_bridge_interface - type: string - default: 'all' - help: 'An interface that bridges can forward to. If this is set to all then all traffic will be forwarded. Can be specified multiple times. (multi valued)' - - - name: metadata_host - type: string - default: '$my_ip' - help: 'the ip for the metadata api server ' - - - name: metadata_port - type: port - default: 8775 - help: 'the port for the metadata api port ' - - - name: iptables_top_regex - type: string - default: '' - help: 'Regular expression to match iptables rule that should always be on the top. ' - - - name: iptables_bottom_regex - type: string - default: '' - help: 'Regular expression to match iptables rule that should always be on the bottom. ' - - - name: iptables_drop_action - type: string - default: 'DROP' - help: 'The table that iptables to jump to when a packet is to be dropped. ' - - - name: flat_network_bridge - type: string - default: ~ - help: 'Bridge for simple network instances ' - - - name: flat_network_dns - type: string - default: '8.8.4.4' - help: 'Dns for simple network ' - - - name: flat_injected - type: boolean - default: False - help: 'Whether to attempt to inject network setup into guest ' - - - name: flat_interface - type: string - default: ~ - help: 'FlatDhcp will bridge into this interface if set ' - - - name: vlan_start - type: integer - default: 100 - help: 'First VLAN for private networks ' - - - name: vmware.vlan_interface - type: string - default: 'vmnic0' - help: 'Physical ethernet adapter name for vlan networking ' - - - name: num_networks - type: integer - default: 1 - help: 'Number of networks to support ' - - - name: vpn_ip - type: string - default: '$my_ip' - help: 'Public IP for the cloudpipe VPN servers ' - - - name: vpn_start - type: integer - default: 1000 - help: 'First Vpn port for private networks ' - - - name: network_size - type: integer - default: 256 - help: 'Number of addresses in each private subnet ' - - - name: fixed_range_v6 - type: string - default: 'fd00::/48' - help: 'Fixed IPv6 address block ' - - - name: gateway - type: string - default: ~ - help: 'Default IPv4 gateway ' - - - name: gateway_v6 - type: string - default: ~ - help: 'Default IPv6 gateway ' - - - name: cnt_vpn_clients - type: integer - default: 0 - help: 'Number of addresses reserved for vpn clients ' - - - name: fixed_ip_disassociate_timeout - type: integer - default: 600 - help: 'Seconds after which a deallocated ip is disassociated ' - - - name: create_unique_mac_address_attempts - type: integer - default: 5 - help: 'Number of attempts to create unique mac address ' - - - name: fake_network - type: boolean - default: False - help: 'If passed, use fake network devices and addresses ' - - - name: fake_call - type: boolean - default: False - help: 'If True, skip using the queue and make local calls ' - - - name: teardown_unused_network_gateway - type: boolean - default: False - help: 'If True, unused gateway devices (VLAN and bridge) are deleted in VLAN network mode with multi hosted networks ' - - - name: force_dhcp_release - type: boolean - default: True - help: 'If True, send a dhcp release on instance termination ' - - - name: share_dhcp_address - type: boolean - default: False - help: 'If True in multi_host mode, all compute hosts share the same dhcp address. The same IP address used for DHCP will be added on each nova-network node which is only visible to the vms on the same host. ' - - - name: update_dns_entries - type: boolean - default: False - help: 'If True, when a DNS entry must be updated, it sends a fanout cast to all network hosts to update their DNS entries in multi host mode ' - - - name: dns_update_periodic_interval - type: integer - default: -1 - help: 'Number of seconds to wait between runs of updates to DNS entries. ' - - - name: dhcp_domain - type: string - default: 'novalocal' - help: 'domain to use for building the hostnames ' - - - name: l3_lib - type: string - default: 'nova.network.l3.LinuxNetL3' - help: 'Indicates underlying L3 management library ' - - - name: neutron_url - type: string - default: 'http://127.0.0.1:9696' - help: 'URL for connecting to neutron ' - - - name: neutron_url_timeout - type: integer - default: 30 - help: 'timeout value for connecting to neutron in seconds ' - - - name: neutron_admin_username - type: string - default: ~ - help: 'username for connecting to neutron in admin context ' - - - name: neutron_admin_password - type: string - default: ~ - help: 'password for connecting to neutron in admin context ' - - - name: neutron_admin_tenant_name - type: string - default: ~ - help: 'tenant name for connecting to neutron in admin context ' - - - name: neutron_region_name - type: string - default: ~ - help: 'region name for connecting to neutron in admin context ' - - - name: neutron_admin_auth_url - type: string - default: 'http://localhost:5000/v2.0' - help: 'auth url for connecting to neutron in admin context ' - - - name: neutron_api_insecure - type: boolean - default: False - help: 'if set, ignore any SSL validation issues ' - - - name: neutron_auth_strategy - type: string - default: 'keystone' - help: 'auth strategy for connecting to neutron in admin context ' - - - name: neutron_ovs_bridge - type: string - default: 'br-int' - help: 'Name of Integration Bridge used by Open vSwitch ' - - - name: neutron_extension_sync_interval - type: integer - default: 600 - help: 'Number of seconds before querying neutron for extensions ' - - - name: neutron_ca_certificates_file - type: string - default: ~ - help: 'Location of ca certificates file to use for neutron client requests. ' - - - name: dhcp_options_enabled - type: boolean - default: False - help: 'Use per-port DHCP options with Neutron ' - - - name: network_topic - type: string - default: 'network' - help: 'the topic network nodes listen on ' - - - name: multi_host - type: boolean - default: False - help: 'Default value for multi_host in networks. Also, if set, some rpc network calls will be sent directly to host. ' - - - name: security_group_api - type: string - default: 'nova' - help: 'The full class name of the security API class ' - - - name: buckets_path - type: string - default: '$state_path/buckets' - help: 'path to s3 buckets ' - - - name: s3_listen - type: host - default: '0.0.0.0' - help: 'IP address for S3 API to listen ' - - - name: s3_listen_port - type: port - default: 3333 - help: 'port for s3 api to listen ' - - - name: sqlite_db - type: string - default: 'nova.sqlite' - help: 'the filename to use with sqlite ' - - - name: sqlite_synchronous - type: boolean - default: True - help: 'If true, use synchronous mode for sqlite ' - - - name: backdoor_port - type: string - default: ~ - help: "Enable eventlet backdoor. Acceptable values are 0, and :, where 0 results in listening on a random tcp port number, results in listening on the specified port number and not enabling backdoorif it is in use and : results in listening on the smallest unused port number within the specified range of port numbers. The chosen port is displayed in the service's log file. " - - - name: disable_process_locking - type: boolean - default: False - help: 'Whether to disable inter-process locks ' - - - name: lock_path - type: string - default: ~ - help: 'Directory to use for lock files. ' - - - name: debug - type: boolean - default: False - help: 'Print debugging output (set logging level to DEBUG instead of default WARNING level). ' - - - name: verbose - type: boolean - default: False - help: 'Print more verbose output (set logging level to INFO instead of default WARNING level). ' - - - name: use_stderr - type: boolean - default: True - help: 'Log output to standard error ' - - - name: logging_context_format_string - type: string - 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 ' - - - name: logging_default_format_string - type: string - default: '%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s' - help: 'format string to use for log messages without context ' - - - name: logging_debug_format_suffix - type: string - default: '%(funcName)s %(pathname)s:%(lineno)d' - help: 'data to append to log format when level is DEBUG ' - - - name: logging_exception_prefix - type: string - default: '%(asctime)s.%(msecs)03d %(process)d TRACE %(name)s %(instance)s' - help: 'prefix each line of exception output with this format ' - - - name: default_log_levels - type: string_list - default: ['amqplib=WARN', 'sqlalchemy=WARN', 'boto=WARN', 'suds=INFO', 'keystone=INFO', 'eventlet.wsgi.server=WARN'] - help: 'list of logger=LEVEL pairs ' - - - name: publish_errors - type: boolean - default: False - help: 'publish error events ' - - - name: fatal_deprecations - type: boolean - default: False - help: 'make deprecations fatal ' - - - name: instance_format - type: string - default: '"[instance: %(uuid)s] "' - help: 'If an instance is passed with the log message, format it like this ' - - - name: instance_uuid_format - type: string - default: '"[instance: %(uuid)s] "' - help: 'If an instance UUID is passed with the log message, format it like this ' - - - name: log_config - type: string - default: ~ - help: 'If this option is specified, the logging configuration file specified is used and overrides any other logging options specified. Please see the Python logging module documentation for details on logging configuration files. ' - - - name: log_format - type: string - default: ~ - help: 'DEPRECATED. A logging.Formatter log message format string which may use any of the available logging.LogRecord attributes. This option is deprecated. Please use logging_context_format_string and logging_default_format_string instead. ' - - - name: log_date_format - type: string - default: '%Y-%m-%d %H:%M:%S' - help: 'Format string for %%(asctime)s in log records. Default: %(default)s ' - - - name: log_file - type: string - default: ~ - help: '(Optional) Name of log file to output to. If no default is set, logging will go to stdout. ' - - - name: log_dir - type: string - default: ~ - help: '(Optional) The base directory used for relative --log-file paths ' - - - name: use_syslog - type: boolean - default: False - help: 'Use syslog for logging. ' - - - name: syslog_log_facility - type: string - default: 'LOG_USER' - help: 'syslog facility to receive log lines ' - - - name: memcached_servers - type: list - default: ~ - help: 'Memcached servers or None for in process cache. ' - - - name: notification_driver - type: string - default: '' - help: 'Driver or drivers to handle sending notifications (multi valued)' - - - name: default_notification_level - type: string - default: 'INFO' - help: 'Default notification level for outgoing notifications ' - - - name: default_publisher_id - type: string - default: ~ - help: 'Default publisher_id for outgoing notifications ' - - - name: notification_topics - type: string_list - default: ['notifications'] - help: 'AMQP topic used for OpenStack notifications ' - - - name: run_external_periodic_tasks - type: boolean - default: True - help: 'Some periodic tasks can be run in a separate process. Should we run them here? ' - - - name: rpc_backend - type: string - default: 'nova.openstack.common.rpc.impl_kombu' - help: 'The messaging module to use, defaults to kombu. ' - - - name: rpc_thread_pool_size - type: integer - default: 64 - help: 'Size of RPC thread pool ' - - - name: rpc_conn_pool_size - type: integer - default: 30 - help: 'Size of RPC connection pool ' - - - name: rpc_response_timeout - type: integer - default: 60 - help: 'Seconds to wait for a response from call or multicall ' - - - name: rpc_cast_timeout - type: integer - default: 30 - help: 'Seconds to wait before a cast expires (TTL). Only supported by impl_zmq. ' - - - name: allowed_rpc_exception_modules - type: string_list - default: ['nova.exception', 'cinder.exception', 'exceptions'] - help: 'Modules of exceptions that are permitted to be recreatedupon receiving exception data from an rpc call. ' - - - name: fake_rabbit - type: boolean - default: False - help: 'If passed, use a fake RabbitMQ provider ' - - - name: control_exchange - type: string - default: 'openstack' - help: 'AMQP exchange to connect to if using RabbitMQ or Qpid ' - - - name: amqp_durable_queues - type: boolean - default: False - help: 'Use durable queues in amqp. ' - - - name: amqp_auto_delete - type: boolean - default: False - help: 'Auto-delete queues in amqp. ' - - - name: kombu_ssl_version - type: string - default: '' - help: 'SSL version to use (valid only if SSL enabled). valid values are TLSv1, SSLv23 and SSLv3. SSLv2 may be available on some distributions ' - - - name: kombu_ssl_keyfile - type: string - default: '' - help: 'SSL key file (valid only if SSL enabled) ' - - - name: kombu_ssl_certfile - type: string - default: '' - help: 'SSL cert file (valid only if SSL enabled) ' - - - name: kombu_ssl_ca_certs - type: string - default: '' - help: 'SSL certification authority file (valid only if SSL enabled) ' - - - name: rabbit_host - type: host - default: 'localhost' - help: 'The RabbitMQ broker address where a single node is used ' - - - name: rabbit_port - type: port - default: 5672 - help: 'The RabbitMQ broker port where a single node is used ' - - - name: rabbit_hosts - type: string_list - default: ['$rabbit_host:$rabbit_port'] - help: 'RabbitMQ HA cluster host:port pairs ' - - - name: rabbit_use_ssl - type: boolean - default: False - help: 'connect over SSL for RabbitMQ ' - - - name: rabbit_userid - type: string - default: 'guest' - help: 'the RabbitMQ userid ' - - - name: rabbit_password - type: string - default: 'guest' - help: 'the RabbitMQ password ' - - - name: rabbit_virtual_host - type: string - default: '/' - help: 'the RabbitMQ virtual host ' - - - name: rabbit_retry_interval - type: integer - default: 1 - help: 'how frequently to retry connecting with RabbitMQ ' - - - name: rabbit_retry_backoff - type: integer - default: 2 - help: 'how long to backoff for between retries when connecting to RabbitMQ ' - - - name: rabbit_max_retries - type: integer - default: 0 - help: 'maximum retries with trying to connect to RabbitMQ (the default of 0 implies an infinite retry count) ' - - - name: rabbit_ha_queues - type: boolean - default: False - help: 'use H/A queues in RabbitMQ (x-ha-policy: all).You need to wipe RabbitMQ database when changing this option. ' - - - name: qpid_hostname - type: string - default: 'localhost' - help: 'Qpid broker hostname ' - - - name: qpid_port - type: port - default: 5672 - help: 'Qpid broker port ' - - - name: qpid_hosts - type: string_list - default: ['$qpid_hostname:$qpid_port'] - help: 'Qpid HA cluster host:port pairs ' - - - name: qpid_username - type: string - default: '' - help: 'Username for qpid connection ' - - - name: qpid_password - type: string - default: '' - help: 'Password for qpid connection ' - - - name: qpid_sasl_mechanisms - type: string - default: '' - help: 'Space separated list of SASL mechanisms to use for auth ' - - - name: qpid_heartbeat - type: integer - default: 60 - help: 'Seconds between connection keepalive heartbeats ' - - - name: qpid_protocol - type: string - default: 'tcp' - help: "Transport to use, either 'tcp' or 'ssl' " - - - name: qpid_tcp_nodelay - type: boolean - default: True - help: 'Disable Nagle algorithm ' - - - name: qpid_topology_version - type: integer - default: 1 - help: 'The qpid topology version to use. Version 1 is what was originally used by impl_qpid. Version 2 includes some backwards-incompatible changes that allow broker federation to work. Users should update to version 2 when they are able to take everything down, as it requires a clean break. ' - - - name: rpc_zmq_bind_address - type: string - default: '*' - help: "ZeroMQ bind address. Should be a wildcard (*), an ethernet interface, or IP. The 'host' option should point or resolve to this address. " - - - name: rpc_zmq_matchmaker - type: string - default: 'nova.openstack.common.rpc.matchmaker.MatchMakerLocalhost' - help: 'MatchMaker driver ' - - - name: rpc_zmq_port - type: port - default: 9501 - help: 'ZeroMQ receiver listening port ' - - - name: rpc_zmq_contexts - type: integer - default: 1 - help: 'Number of ZeroMQ contexts, defaults to 1 ' - - - name: rpc_zmq_topic_backlog - type: integer - default: ~ - help: 'Maximum number of ingress messages to locally buffer per topic. Default is unlimited. ' - - - name: rpc_zmq_ipc_dir - type: string - default: '/var/run/openstack' - help: 'Directory for holding IPC sockets ' - - - name: rpc_zmq_host - type: string - default: 'nova' - help: "Name of this node. Must be a valid hostname, FQDN, or IP address. Must match 'host' option, if running Nova. " - - - name: matchmaker_heartbeat_freq - type: integer - default: 300 - help: 'Heartbeat frequency ' - - - name: matchmaker_heartbeat_ttl - type: integer - default: 600 - help: 'Heartbeat time-to-live. ' - - - name: pci_alias - type: string - default: '' - help: "An alias for a PCI passthrough device requirement. This allows users to specify the alias in the extra_spec for a flavor, without needing to repeat all the PCI property requirements. For example: pci_alias = { 'name': 'QuicAssist', 'product_id': '0443', 'vendor_id': '8086', 'device_type': 'ACCEL' } defines an alias for the Intel QuickAssist card. (multi valued) (multi valued)" - - - name: pci_passthrough_whitelist - type: string - default: '' - help: "White list of PCI devices available to VMs. For example: pci_passthrough_whitelist = [{'vendor_id': '8086', 'product_id': '0443'}] (multi valued)" - - - name: scheduler_host_manager - type: string - default: 'nova.scheduler.host_manager.HostManager' - help: 'The scheduler host manager class to use ' - - - name: scheduler_max_attempts - type: integer - default: 3 - help: 'Maximum number of attempts to schedule an instance ' - - - name: scheduler_host_subset_size - type: integer - default: 1 - help: 'New instances will be scheduled on a host chosen randomly from a subset of the N best hosts. This property defines the subset size that a host is chosen from. A value of 1 chooses the first host returned by the weighing functions. This value must be at least 1. Any value less than 1 will be ignored, and 1 will be used instead ' - - - name: cpu_allocation_ratio - type: float - default: 16.0 - help: 'Virtual CPU to physical CPU allocation ratio which affects all CPU filters. This configuration specifies a global ratio for CoreFilter. For AggregateCoreFilter, it will fall back to this configuration value if no per-aggregate setting found. ' - - - name: disk_allocation_ratio - type: float - default: 1.0 - help: 'virtual disk to physical disk allocation ratio ' - - - name: max_io_ops_per_host - type: integer - default: 8 - help: 'Ignore hosts that have too many builds/resizes/snaps/migrations ' - - - name: isolated_images - type: string_list - default: [] - help: 'Images to run on isolated host ' - - - name: isolated_hosts - type: string_list - default: [] - help: 'Host reserved for specific images ' - - - name: restrict_isolated_hosts_to_isolated_images - type: boolean - default: True - help: 'Whether to force isolated hosts to run only isolated images ' - - - name: max_instances_per_host - type: integer - default: 50 - help: 'Ignore hosts that have too many instances ' - - - name: ram_allocation_ratio - type: float - default: 1.5 - help: 'Virtual ram to physical ram allocation ratio which affects all ram filters. This configuration specifies a global ratio for RamFilter. For AggregateRamFilter, it will fall back to this configuration value if no per-aggregate setting found. ' - - - name: scheduler_available_filters - type: string - default: 'nova.scheduler.filters.all_filters' - help: "Filter classes available to the scheduler which may be specified more than once. An entry of 'nova.scheduler.filters.standard_filters' maps to all filters included with nova. (multi valued)" - - - name: scheduler_default_filters - type: string_list - default: ['RetryFilter', 'AvailabilityZoneFilter', 'RamFilter', 'ComputeFilter', 'ComputeCapabilitiesFilter', 'ImagePropertiesFilter'] - help: 'Which filter class names to use for filtering hosts when not specified in the request. ' - - - name: cells.scheduler_weight_classes - type: string_list - default: ['nova.cells.weights.all_weighers'] - help: "Weigher classes the cells scheduler should use. An entry of 'nova.cells.weights.all_weighers'maps to all cell weighers included with nova. " - - - name: scheduler_driver - type: string - default: 'nova.scheduler.filter_scheduler.FilterScheduler' - help: 'Default driver to use for the scheduler ' - - - name: scheduler_topic - type: string - default: 'scheduler' - help: 'the topic scheduler nodes listen on ' - - - name: scheduler_json_config_location - type: string - default: '' - help: 'Absolute path to scheduler configuration JSON file. ' - - - name: cells.ram_weight_multiplier - type: float - default: 10.0 - help: 'Multiplier used for weighing ram. Negative numbers mean to stack vs spread. ' - - - name: servicegroup_driver - type: string - default: 'db' - help: 'The driver for servicegroup service (valid options are: db, zk, mc) ' - - - name: config_drive_format - type: string - default: 'iso9660' - help: 'Config drive format. One of iso9660 (default) or vfat ' - - - name: config_drive_tempdir - type: string - default: ~ - help: 'Where to put temporary files associated with config drive creation ' - - - name: force_config_drive - type: string - default: ~ - help: 'Set to force injection to take place on a config drive (if set, valid options are: always) ' - - - name: mkisofs_cmd - type: string - default: 'genisoimage' - help: 'Name and optionally path of the tool used for ISO image creation ' - - - name: injected_network_template - type: string - default: '$pybasedir/nova/virt/interfaces.template' - help: 'Template file for injected network ' - - - name: virt_mkfs - type: string - default: 'windows=mkfs.ntfs --force --fast --label %(fs_label)s %(target)s' - help: 'mkfs commands for ephemeral device. The format is = (multi valued)' - - - name: resize_fs_using_block_device - type: boolean - default: False - help: 'Attempt to resize the filesystem by accessing the image over a block device. This is done by the host and may not be necessary if the image contains a recent version of cloud- init. Possible mechanisms require the nbd driver (for qcow and raw), or loop (for raw). ' - - - name: timeout_nbd - type: integer - default: 10 - help: 'time to wait for a NBD device coming up ' - - - name: docker_registry_default_port - type: port - default: 5042 - help: 'Default TCP port to find the docker-registry container ' - - - name: compute_driver - type: string - default: ~ - help: 'Driver to use for controlling virtualization. Options include: libvirt.LibvirtDriver, xenapi.XenAPIDriver, fake.FakeDriver, baremetal.BareMetalDriver, vmwareapi.VMwareESXDriver, vmwareapi.VMwareVCDriver ' - - - name: default_ephemeral_format - type: string - default: ~ - help: 'The default format an ephemeral_volume will be formatted with on creation. ' - - - name: preallocate_images - type: string - default: 'none' - help: "VM image preallocation mode: 'none' => no storage provisioning is done up front, 'space' => storage is fully allocated at instance start " - - - name: use_cow_images - type: boolean - default: True - help: 'Whether to use cow images ' - - - name: firewall_driver - type: string - default: ~ - help: 'Firewall driver (defaults to hypervisor specific iptables driver) ' - - - name: allow_same_net_traffic - type: boolean - default: True - help: 'Whether to allow network traffic from same network ' - - - name: force_raw_images - type: boolean - default: True - help: 'Force backing images to raw format ' - - - name: rescue_image_id - type: string - default: ~ - help: 'Rescue ami image ' - - - name: rescue_kernel_id - type: string - default: ~ - help: 'Rescue aki image ' - - - name: rescue_ramdisk_id - type: string - default: ~ - help: 'Rescue ari image ' - - - name: libvirt_type - type: string - default: 'kvm' - help: 'Libvirt domain type (valid options are: kvm, lxc, qemu, uml, xen) ' - - - name: libvirt_uri - type: string - default: '' - help: 'Override the default libvirt URI (which is dependent on libvirt_type) ' - - - name: libvirt_inject_password - type: boolean - default: False - help: 'Inject the admin password at boot time, without an agent. ' - - - name: libvirt_inject_key - type: boolean - default: True - help: 'Inject the ssh public key at boot time ' - - - name: libvirt_inject_partition - type: integer - default: 1 - help: 'The partition to inject to : -2 => disable, -1 => inspect (libguestfs only), 0 => not partitioned, >0 => partition number ' - - - name: use_usb_tablet - type: boolean - default: True - help: 'Sync virtual and real mouse cursors in Windows VMs ' - - - name: live_migration_uri - type: string - default: 'qemu+tcp://%s/system' - help: "Migration target URI (any included '%s' is replaced with the migration target hostname) " - - - name: live_migration_flag - type: string - default: 'VIR_MIGRATE_UNDEFINE_SOURCE, VIR_MIGRATE_PEER2PEER' - help: 'Migration flags to be set for live migration ' - - - name: block_migration_flag - type: string - default: 'VIR_MIGRATE_UNDEFINE_SOURCE, VIR_MIGRATE_PEER2PEER, VIR_MIGRATE_NON_SHARED_INC' - help: 'Migration flags to be set for block migration ' - - - name: live_migration_bandwidth - type: integer - default: 0 - help: 'Maximum bandwidth to be used during migration, in Mbps ' - - - name: snapshot_image_format - type: string - default: ~ - help: 'Snapshot image format (valid options are : raw, qcow2, vmdk, vdi). Defaults to same as source image ' - - - name: libvirt_vif_driver - type: string - default: 'nova.virt.libvirt.vif.LibvirtGenericVIFDriver' - help: 'The libvirt VIF driver to configure the VIFs. ' - - - name: libvirt_volume_drivers - type: string_list - default: ['iscsi=nova.virt.libvirt.volume.LibvirtISCSIVolumeDriver', 'iser=nova.virt.libvirt.volume.LibvirtISERVolumeDriver', 'local=nova.virt.libvirt.volume.LibvirtVolumeDriver', 'fake=nova.virt.libvirt.volume.LibvirtFakeVolumeDriver', 'rbd=nova.virt.libvirt.volume.LibvirtNetVolumeDriver', 'sheepdog=nova.virt.libvirt.volume.LibvirtNetVolumeDriver', 'nfs=nova.virt.libvirt.volume.LibvirtNFSVolumeDriver', 'aoe=nova.virt.libvirt.volume.LibvirtAOEVolumeDriver', 'glusterfs=nova.virt.libvirt.volume.LibvirtGlusterfsVolumeDriver', 'fibre_channel=nova.virt.libvirt.volume.LibvirtFibreChannelVolumeDriver', 'scality=nova.virt.libvirt.volume.LibvirtScalityVolumeDriver'] - help: 'Libvirt handlers for remote volumes. ' - - - name: libvirt_disk_prefix - type: string - default: ~ - help: 'Override the default disk prefix for the devices attached to a server, which is dependent on libvirt_type. (valid options are: sd, xvd, uvd, vd) ' - - - name: libvirt_wait_soft_reboot_seconds - type: integer - default: 120 - help: 'Number of seconds to wait for instance to shut down after soft reboot request is made. We fall back to hard reboot if instance does not shutdown within this window. ' - - - name: libvirt_nonblocking - type: boolean - default: True - help: 'Use a separated OS thread pool to realize non-blocking libvirt calls ' - - - name: libvirt_cpu_mode - type: string - default: ~ - help: "Set to 'host-model' to clone the host CPU feature flags; to 'host-passthrough' to use the host CPU model exactly; to 'custom' to use a named CPU model; to 'none' to not set any CPU model. If libvirt_type='kvm|qemu', it will default to 'host-model', otherwise it will default to 'none' " - - - name: libvirt_cpu_model - type: string - default: ~ - help: "Set to a named libvirt CPU model (see names listed in /usr/share/libvirt/cpu_map.xml). Only has effect if libvirt_cpu_mode='custom' and libvirt_type='kvm|qemu' " - - - name: libvirt_snapshots_directory - type: string - default: '$instances_path/snapshots' - help: 'Location where libvirt driver will store snapshots before uploading them to image service ' - - - name: xen_hvmloader_path - type: string - default: '/usr/lib/xen/boot/hvmloader' - help: 'Location where the Xen hvmloader is kept ' - - - name: disk_cachemodes - type: string_list - default: [] - help: "Specific cachemodes to use for different disk types e.g: ['file=directsync','block=none'] " - - - name: vcpu_pin_set - type: string - default: ~ - help: "Which pcpus can be used by vcpus of instance e.g: '4-12,^8,15' " - - - name: libvirt_images_type - type: string - default: 'default' - help: 'VM Images format. Acceptable values are: raw, qcow2, lvm,rbd, default. If default is specified, then use_cow_images flag is used instead of this one. ' - - - name: libvirt_images_volume_group - type: string - default: ~ - help: 'LVM Volume Group that is used for VM images, when you specify libvirt_images_type=lvm. ' - - - name: libvirt_sparse_logical_volumes - type: boolean - default: False - help: 'Create sparse logical volumes (with virtualsize) if this flag is set to True. ' - - - name: libvirt_lvm_snapshot_size - type: integer - default: 1000 - help: 'The amount of storage (in megabytes) to allocate for LVM snapshot copy-on-write blocks. ' - - - name: libvirt_images_rbd_pool - type: string - default: 'rbd' - help: 'the RADOS pool in which rbd volumes are stored ' - - - name: libvirt_images_rbd_ceph_conf - type: string - default: '' - help: 'path to the ceph configuration file to use ' - - - name: base_dir_name - type: string - default: '_base' - help: 'Where cached images are stored under $instances_path.This is NOT the full path - just a folder name.For per-compute-host cached images, set to _base_$my_ip ' - - - name: image_info_filename_pattern - type: string - default: '$instances_path/$base_dir_name/%(image)s.info' - help: 'Allows image information files to be stored in non-standard locations ' - - - name: remove_unused_base_images - type: boolean - default: True - help: 'Should unused base images be removed? ' - - - name: remove_unused_kernels - type: boolean - default: False - help: 'Should unused kernel images be removed? This is only safe to enable if all compute nodes have been updated to support this option. This will enabled by default in future. ' - - - name: remove_unused_resized_minimum_age_seconds - type: integer - default: 3600 - help: 'Unused resized base images younger than this will not be removed ' - - - name: remove_unused_original_minimum_age_seconds - type: integer - default: 86400 - help: 'Unused unresized base images younger than this will not be removed ' - - - name: checksum_base_images - type: boolean - default: False - help: 'Write a checksum for files in _base to disk ' - - - name: checksum_interval_seconds - type: integer - default: 3600 - help: 'How frequently to checksum base images ' - - - name: libvirt_snapshot_compression - type: boolean - default: False - help: 'Compress snapshot images when possible. This currently applies exclusively to qcow2 images ' - - - name: libvirt_ovs_bridge - type: string - default: 'br-int' - help: 'Name of Integration Bridge used by Open vSwitch ' - - - name: libvirt_use_virtio_for_bridges - type: boolean - default: True - help: 'Use virtio for bridge interfaces with KVM/QEMU ' - - - name: num_iscsi_scan_tries - type: integer - default: 3 - help: 'number of times to rescan iSCSI target to find volume ' - - - name: num_iser_scan_tries - type: integer - default: 3 - help: 'number of times to rescan iSER target to find volume ' - - - name: rbd_user - type: string - default: ~ - help: 'the RADOS client name for accessing rbd volumes ' - - - name: rbd_secret_uuid - type: string - default: ~ - help: 'the libvirt uuid of the secret for the rbd_uservolumes ' - - - name: nfs_mount_point_base - type: string - default: '$state_path/mnt' - help: 'Dir where the nfs volume is mounted on the compute node ' - - - name: nfs_mount_options - type: string - default: ~ - help: 'Mount options passed to the nfs client. See section of the nfs man page for details ' - - - name: num_aoe_discover_tries - type: integer - default: 3 - help: 'number of times to rediscover AoE target to find volume ' - - - name: glusterfs_mount_point_base - type: string - default: '$state_path/mnt' - help: 'Dir where the glusterfs volume is mounted on the compute node ' - - - name: libvirt_iscsi_use_multipath - type: boolean - default: False - help: 'use multipath connection of the iSCSI volume ' - - - name: libvirt_iser_use_multipath - type: boolean - default: False - help: 'use multipath connection of the iSER volume ' - - - name: scality_sofs_config - type: string - default: ~ - help: 'Path or URL to Scality SOFS configuration file ' - - - name: scality_sofs_mount_point - type: string - default: '$state_path/scality' - help: 'Base dir where Scality SOFS shall be mounted ' - - - name: qemu_allowed_storage_drivers - type: string_list - default: [] - help: 'Protocols listed here will be accessed directly from QEMU. Currently supported protocols: [gluster] ' - - - name: powervm_mgr_type - type: string - default: 'ivm' - help: 'PowerVM manager type (ivm, hmc) ' - - - name: powervm_mgr - type: string - default: ~ - help: 'PowerVM manager host or ip ' - - - name: powervm_mgr_user - type: string - default: ~ - help: 'PowerVM manager user name ' - - - name: powervm_mgr_passwd - type: string - default: ~ - help: 'PowerVM manager user password ' - - - name: powervm_img_remote_path - type: string - default: '/home/padmin' - help: 'PowerVM image remote path where images will be moved. Make sure this path can fit your biggest image in glance ' - - - name: powervm_img_local_path - type: string - default: '/tmp' - help: 'Local directory to download glance images to. Make sure this path can fit your biggest image in glance ' - - - name: agent_timeout - type: integer - default: 30 - help: 'number of seconds to wait for agent reply ' - - - name: agent_version_timeout - type: integer - default: 300 - help: 'number of seconds to wait for agent to be fully operational ' - - - name: agent_resetnetwork_timeout - type: integer - default: 60 - help: 'number of seconds to wait for agent reply to resetnetwork request ' - - - name: xenapi_agent_path - type: string - default: 'usr/sbin/xe-update-networking' - help: 'Specifies the path in which the xenapi guest agent should be located. If the agent is present, network configuration is not injected into the image. Used if compute_driver=xenapi.XenAPIDriver and flat_injected=True ' - - - name: xenapi_disable_agent - type: boolean - default: False - help: 'Disables the use of the XenAPI agent in any image regardless of what image properties are present. ' - - - name: xenapi_use_agent_default - type: boolean - default: False - help: "Determines if the xenapi agent should be used when the image used does not contain a hint to declare if the agent is present or not. The hint is a glance property 'xenapi_use_agent' that has the value 'true' or 'false'. Note that waiting for the agent when it is not present will significantly increase server boot times. " - - - name: xenapi_connection_url - type: string - default: ~ - help: 'URL for connection to XenServer/Xen Cloud Platform. A special value of unix://local can be used to connect to the local unix socket. Required if compute_driver=xenapi.XenAPIDriver ' - - - name: xenapi_connection_username - type: string - default: 'root' - help: 'Username for connection to XenServer/Xen Cloud Platform. Used only if compute_driver=xenapi.XenAPIDriver ' - - - name: xenapi_connection_password - type: string - default: ~ - help: 'Password for connection to XenServer/Xen Cloud Platform. Used only if compute_driver=xenapi.XenAPIDriver ' - - - name: xenapi_connection_concurrent - type: integer - default: 5 - help: 'Maximum number of concurrent XenAPI connections. Used only if compute_driver=xenapi.XenAPIDriver ' - - - name: xenapi_vhd_coalesce_poll_interval - type: float - default: 5.0 - help: 'The interval used for polling of coalescing vhds. Used only if compute_driver=xenapi.XenAPIDriver ' - - - name: xenapi_check_host - type: boolean - default: True - help: 'Ensure compute service is running on host XenAPI connects to. ' - - - name: xenapi_vhd_coalesce_max_attempts - type: integer - default: 5 - help: 'Max number of times to poll for VHD to coalesce. Used only if compute_driver=xenapi.XenAPIDriver ' - - - name: xenapi_sr_base_path - type: string - default: '/var/run/sr-mount' - help: 'Base path to the storage repository ' - - - name: target_host - type: string - default: ~ - help: 'iSCSI Target Host ' - - - name: target_port - type: string - default: '3260' - help: 'iSCSI Target Port, 3260 Default ' - - - name: iqn_prefix - type: string - default: 'iqn.2010-10.org.openstack' - help: 'IQN Prefix ' - - - name: xenapi_remap_vbd_dev - type: boolean - default: False - help: 'Used to enable the remapping of VBD dev (Works around an issue in Ubuntu Maverick) ' - - - name: xenapi_remap_vbd_dev_prefix - type: string - default: 'sd' - help: 'Specify prefix to remap VBD dev to (ex. /dev/xvdb -> /dev/sdb) ' - - - name: xenapi_login_timeout - type: integer - default: 10 - help: 'Timeout in seconds for XenAPI login. ' - - - name: xenapi_torrent_base_url - type: string - default: ~ - help: 'Base URL for torrent files. ' - - - name: xenapi_torrent_seed_chance - type: float - default: 1.0 - help: 'Probability that peer will become a seeder. (1.0 = 100%) ' - - - name: xenapi_torrent_seed_duration - type: integer - default: 3600 - help: 'Number of seconds after downloading an image via BitTorrent that it should be seeded for other peers. ' - - - name: xenapi_torrent_max_last_accessed - type: integer - default: 86400 - help: 'Cached torrent files not accessed within this number of seconds can be reaped ' - - - name: xenapi_torrent_listen_port_start - type: integer - default: 6881 - help: 'Beginning of port range to listen on ' - - - name: xenapi_torrent_listen_port_end - type: integer - default: 6891 - help: 'End of port range to listen on ' - - - name: xenapi_torrent_download_stall_cutoff - type: integer - default: 600 - help: 'Number of seconds a download can remain at the same progress percentage w/o being considered a stall ' - - - name: xenapi_torrent_max_seeder_processes_per_host - type: integer - default: 1 - help: 'Maximum number of seeder processes to run concurrently within a given dom0. (-1 = no limit) ' - - - name: use_join_force - type: boolean - default: True - help: 'To use for hosts with different CPUs ' - - - name: xenapi_ovs_integration_bridge - type: string - default: 'xapi1' - help: 'Name of Integration Bridge used by Open vSwitch ' - - - name: cache_images - type: string - default: 'all' - help: 'Cache glance images locally. `all` will cache all images, `some` will only cache images that have the image_property `cache_in_nova=True`, and `none` turns off caching entirely ' - - - name: xenapi_image_compression_level - type: integer - default: ~ - help: 'Compression level for images, e.g., 9 for gzip -9. Range is 1-9, 9 being most compressed but most CPU intensive on dom0. ' - - - name: default_os_type - type: string - default: 'linux' - help: 'Default OS type ' - - - name: block_device_creation_timeout - type: integer - default: 10 - help: 'Time to wait for a block device to be created ' - - - name: max_kernel_ramdisk_size - type: integer - default: 16777216 - help: 'Maximum size in bytes of kernel or ramdisk images ' - - - name: sr_matching_filter - type: string - default: 'default-sr:true' - help: 'Filter for finding the SR to be used to install guest instances on. To use the Local Storage in default XenServer/XCP installations set this flag to other-config :i18n-key=local-storage. To select an SR with a different matching criteria, you could set it to other- config:my_favorite_sr=true. On the other hand, to fall back on the Default SR, as displayed by XenCenter, set this flag to: default-sr:true ' - - - name: xenapi_sparse_copy - type: boolean - default: True - help: "Whether to use sparse_copy for copying data on a resize down (False will use standard dd). This speeds up resizes down considerably since large runs of zeros won't have to be rsynced " - - - name: xenapi_num_vbd_unplug_retries - type: integer - default: 10 - help: 'Maximum number of retries to unplug VBD ' - - - name: xenapi_torrent_images - type: string - default: 'none' - help: 'Whether or not to download images via Bit Torrent (all|some|none). ' - - - name: xenapi_ipxe_network_name - type: string - default: ~ - help: 'Name of network to use for booting iPXE ISOs ' - - - name: xenapi_ipxe_boot_menu_url - type: string - default: ~ - help: 'URL to the iPXE boot menu ' - - - name: xenapi_ipxe_mkisofs_cmd - type: string - default: 'mkisofs' - help: 'Name and optionally path of the tool used for ISO image creation ' - - - name: xenapi_running_timeout - type: integer - default: 60 - help: 'number of seconds to wait for instance to go to running state ' - - - name: xenapi_vif_driver - type: string - default: 'nova.virt.xenapi.vif.XenAPIBridgeDriver' - help: 'The XenAPI VIF driver using XenServer Network APIs. ' - - - name: xenapi_image_upload_handler - type: string - default: 'nova.virt.xenapi.image.glance.GlanceStore' - help: 'Dom0 plugin driver used to handle image uploads. ' - - - name: novncproxy_base_url - type: string - default: 'http://127.0.0.1:6080/vnc_auto.html' - help: "location of vnc console proxy, in the form 'http://127.0.0.1:6080/vnc_auto.html' " - - - name: xvpvncproxy_base_url - type: string - default: 'http://127.0.0.1:6081/console' - help: "location of nova xvp vnc console proxy, in the form 'http://127.0.0.1:6081/console' " - - - name: vncserver_listen - type: host - default: '127.0.0.1' - help: 'IP address on which instance vncservers should listen ' - - - name: vncserver_proxyclient_address - type: string - default: '127.0.0.1' - help: 'the address to which proxy clients (like nova-xvpvncproxy) should connect ' - - - name: vnc_enabled - type: boolean - default: True - help: 'enable vnc related features ' - - - name: vnc_keymap - type: string - default: 'en-us' - help: 'keymap for vnc ' - - - name: xvpvncproxy_port - type: port - default: 6081 - help: 'Port that the XCP VNC proxy should bind to ' - - - name: xvpvncproxy_host - type: host - default: '0.0.0.0' - help: 'Address that the XCP VNC proxy should bind to ' - - - name: volume_api_class - type: string - default: 'nova.volume.cinder.API' - help: 'The full class name of the volume API class to use ' - - - name: cinder_catalog_info - type: string - default: 'volume:cinder:publicURL' - help: 'Info to match when looking for cinder in the service catalog. Format is : separated values of the form: :: ' - - - name: cinder_endpoint_template - type: string - default: ~ - help: 'Override service catalog lookup with template for cinder endpoint e.g. http://localhost:8776/v1/%(project_id)s ' - - - name: os_region_name - type: string - default: ~ - help: 'region name of this node ' - - - name: cinder_ca_certificates_file - type: string - default: ~ - help: 'Location of ca certificates file to use for cinder client requests. ' - - - name: cinder_http_retries - type: integer - default: 3 - help: 'Number of cinderclient retries on failed http calls ' - - - name: cinder_api_insecure - type: boolean - default: False - help: 'Allow to perform insecure SSL requests to cinder ' - - - name: cinder_cross_az_attach - type: boolean - default: True - help: 'Allow attach between instance and volume in different availability zones. ' - - - name: hyperv.instances_path_share - type: string - default: '' - help: "The name of a Windows share name mapped to the 'instances_path' dir and used by the resize feature to copy files to the target host. If left blank, an administrative share will be used, looking for the same 'instances_path' used locally " - - - name: hyperv.force_hyperv_utils_v1 - type: boolean - default: False - help: 'Force V1 WMI utility classes ' - - - name: hyperv.force_volumeutils_v1 - type: boolean - default: False - help: 'Force V1 volume utility class ' - - - name: hyperv.vswitch_name - type: string - default: ~ - help: 'External virtual switch Name, if not provided, the first external virtual switch is used ' - - - name: hyperv.limit_cpu_features - type: boolean - default: False - help: 'Required for live migration among hosts with different CPU features ' - - - name: hyperv.config_drive_inject_password - type: boolean - default: False - help: 'Sets the admin password in the config drive image ' - - - name: hyperv.qemu_img_cmd - type: string - default: 'qemu-img.exe' - help: 'qemu-img is used to convert between different image types ' - - - name: hyperv.config_drive_cdrom - type: boolean - default: False - help: 'Attaches the Config Drive image as a cdrom drive instead of a disk drive ' - - - name: hyperv.enable_instance_metrics_collection - type: boolean - default: False - help: "Enables metrics collections for an instance by using Hyper-V's metric APIs. Collected data can by retrieved by other apps and services, e.g.: Ceilometer. Requires Hyper-V / Windows Server 2012 and above " - - - name: hyperv.dynamic_memory_ratio - type: float - default: 1.0 - help: 'Enables dynamic memory allocation (ballooning) when set to a value greater than 1. The value expresses the ratio between the total RAM assigned to an instance and its startup RAM amount. For example a ratio of 2.0 for an instance with 1024MB of RAM implies 512MB of RAM allocated at startup ' - - - name: hyperv.volume_attach_retry_count - type: integer - default: 10 - help: 'The number of times to retry to attach a volume ' - - - name: hyperv.volume_attach_retry_interval - type: integer - default: 5 - help: 'Interval between volume attachment attempts, in seconds ' - - - name: zookeeper.address - type: string - default: ~ - help: 'The ZooKeeper addresses for servicegroup service in the format of host1:port,host2:port,host3:port ' - - - name: zookeeper.recv_timeout - type: integer - default: 4000 - help: 'recv_timeout parameter for the zk session ' - - - name: zookeeper.sg_prefix - type: string - default: '/servicegroups' - help: 'The prefix used in ZooKeeper to store ephemeral nodes ' - - - name: zookeeper.sg_retry_interval - type: integer - default: 5 - help: 'Number of seconds to wait until retrying to join the session ' - - - name: spice.enabled - type: boolean - default: False - help: 'enable spice related features ' - - - name: osapi_v3.extensions_blacklist - type: string_list - default: [] - help: 'A list of v3 API extensions to never load. Specify the extension aliases here. ' - - - name: osapi_v3.extensions_whitelist - type: string_list - default: [] - help: 'If the list is not empty then a v3 API extension will only be loaded if it exists in this list. Specify the extension aliases here. ' - - - name: conductor.use_local - type: boolean - default: False - help: 'Perform nova-conductor operations locally ' - - - name: cells.topic - type: string - default: 'cells' - help: 'the topic cells nodes listen on ' - - - name: cells.manager - type: string - default: 'nova.cells.manager.CellsManager' - help: 'Manager for cells ' - - - name: conductor.workers - type: integer - default: ~ - help: 'Number of workers for OpenStack Conductor service ' - - - name: keymgr.api_class - type: string - default: 'nova.keymgr.conf_key_mgr.ConfKeyManager' - help: 'The full class name of the key manager API class ' - - - name: keymgr.fixed_key - type: string - default: ~ - help: 'Fixed key returned by key manager, specified in hex ' - - - name: baremetal.driver - type: string - default: 'nova.virt.baremetal.pxe.PXE' - help: 'Baremetal driver back-end (pxe or tilera) ' - - - name: cells.instance_updated_at_threshold - type: integer - default: 3600 - help: 'Number of seconds after an instance was updated or deleted to continue to update cells ' - - - name: cells.instance_update_num_instances - type: integer - default: 1 - help: 'Number of instances to update per periodic task run ' - - - name: cells.max_hop_count - type: integer - default: 10 - help: 'Maximum number of hops for cells routing. ' - - - name: upgrade_levels.scheduler - type: string - default: ~ - help: 'Set a version cap for messages sent to scheduler services ' - - - name: cells.enable - type: boolean - default: False - help: 'Enable cell functionality ' - - - name: cells.name - type: string - default: 'nova' - help: 'name of this cell ' - - - name: cells.capabilities - type: string_list - default: ['hypervisor=xenserver;kvm', 'os=linux;windows'] - help: 'Key/Multi-value list with the capabilities of the cell ' - - - name: cells.call_timeout - type: integer - default: 60 - help: 'Seconds to wait for response from a call to a cell. ' - - - name: cells.reserve_percent - type: float - default: 10.0 - help: 'Percentage of cell capacity to hold in reserve. Affects both memory and disk utilization ' - - - name: cells.cell_type - type: string - default: ~ - help: 'Type of cell: api or compute ' - - - name: cells.mute_child_interval - type: integer - default: 300 - help: 'Number of seconds after which a lack of capability and capacity updates signals the child cell is to be treated as a mute. ' - - - name: cells.bandwidth_update_interval - type: integer - default: 600 - help: 'Seconds between bandwidth updates for cells. ' - - - name: cells.rpc_driver_queue_base - type: string - default: 'cells.intercell' - help: 'Base queue name to use when communicating between cells. Various topics by message type will be appended to this. ' - - - name: cells.scheduler_filter_classes - type: string_list - default: ['nova.cells.filters.all_filters'] - help: "Filter classes the cells scheduler should use. An entry of 'nova.cells.filters.all_filters'maps to all cells filters included with nova. " - - - name: cells.scheduler_retries - type: integer - default: 10 - help: 'How many retries when no cells are available. ' - - - name: cells.scheduler_retry_delay - type: integer - default: 2 - help: 'How often to retry in seconds when no cells are available. ' - - - name: cells.db_check_interval - type: integer - default: 60 - help: 'Seconds between getting fresh cell info from db. ' - - - name: cells.cells_config - type: string - default: ~ - help: 'Configuration file from which to read cells configuration. If given, overrides reading cells from the database. ' - - - name: cells.mute_weight_multiplier - type: float - default: -10.0 - help: 'Multiplier used to weigh mute children. (The value should be negative.) ' - - - name: cells.mute_weight_value - type: float - default: 1000.0 - help: 'Weight value assigned to mute children. (The value should be positive.) ' - - - name: database.backend - type: string - default: 'sqlalchemy' - help: 'The backend to use for db ' - - - name: database.use_tpool - type: boolean - default: False - help: 'Enable the experimental use of thread pooling for all DB API calls ' - - - name: database.connection - type: string - default: 'sqlite:////nova/openstack/common/db/$sqlite_db' - help: 'The SQLAlchemy connection string used to connect to the database ' - - - name: database.slave_connection - type: string - default: '' - help: 'The SQLAlchemy connection string used to connect to the slave database ' - - - name: database.idle_timeout - type: integer - default: 3600 - help: 'timeout before idle sql connections are reaped ' - - - name: database.min_pool_size - type: integer - default: 1 - help: 'Minimum number of SQL connections to keep open in a pool ' - - - name: database.max_pool_size - type: integer - default: ~ - help: 'Maximum number of SQL connections to keep open in a pool ' - - - name: database.max_retries - type: integer - default: 10 - help: 'maximum db connection retries during startup. (setting -1 implies an infinite retry count) ' - - - name: database.retry_interval - type: integer - default: 10 - help: 'interval between retries of opening a sql connection ' - - - name: database.max_overflow - type: integer - default: ~ - help: 'If set, use this value for max_overflow with sqlalchemy ' - - - name: database.connection_debug - type: integer - default: 0 - help: 'Verbosity of SQL debugging information. 0=None, 100=Everything ' - - - name: database.connection_trace - type: boolean - default: False - help: 'Add python stack traces to SQL as comment strings ' - - - name: database.pool_timeout - type: integer - default: ~ - help: 'If set, use this value for pool_timeout with sqlalchemy ' - - - name: image_file_url.filesystems - type: string_list - default: [] - help: 'A list of filesystems that will be configured in this file under the sections image_file_url: ' - - - name: baremetal.db_backend - type: string - default: 'sqlalchemy' - help: 'The backend to use for bare-metal database ' - - - name: baremetal.sql_connection - type: string - default: 'sqlite:///$state_path/baremetal_$sqlite_db' - help: 'The SQLAlchemy connection string used to connect to the bare-metal database ' - - - name: baremetal.vif_driver - type: string - default: 'nova.virt.baremetal.vif_driver.BareMetalVIFDriver' - help: 'Baremetal VIF driver. ' - - - name: baremetal.volume_driver - type: string - default: 'nova.virt.baremetal.volume_driver.LibvirtVolumeDriver' - help: 'Baremetal volume driver. ' - - - name: baremetal.instance_type_extra_specs - type: string_list - default: [] - help: "a list of additional capabilities corresponding to instance_type_extra_specs for this compute host to advertise. Valid entries are name=value, pairs For example, 'key1:val1, key2:val2' " - - - name: baremetal.power_manager - type: string - default: 'nova.virt.baremetal.ipmi.IPMI' - help: 'Baremetal power management method ' - - - name: baremetal.tftp_root - type: string - default: '/tftpboot' - help: "Baremetal compute node's tftp root path " - - - name: baremetal.terminal - type: string - default: 'shellinaboxd' - help: 'path to baremetal terminal program ' - - - name: baremetal.terminal_cert_dir - type: string - default: ~ - help: 'path to baremetal terminal SSL cert(PEM) ' - - - name: baremetal.terminal_pid_dir - type: string - default: '$state_path/baremetal/console' - help: 'path to directory stores pidfiles of baremetal_terminal ' - - - name: baremetal.ipmi_power_retry - type: integer - default: 10 - help: 'maximal number of retries for IPMI operations ' - - - name: baremetal.deploy_kernel - type: string - default: ~ - help: 'Default kernel image ID used in deployment phase ' - - - name: baremetal.deploy_ramdisk - type: string - default: ~ - help: 'Default ramdisk image ID used in deployment phase ' - - - name: baremetal.net_config_template - type: string - default: '$pybasedir/nova/virt/baremetal/net-dhcp.ubuntu.template' - help: 'Template file for injected network config ' - - - name: baremetal.pxe_append_params - type: string - default: 'nofb nomodeset vga=normal' - help: 'additional append parameters for baremetal PXE boot ' - - - name: baremetal.pxe_config_template - type: string - default: '$pybasedir/nova/virt/baremetal/pxe_config.template' - help: 'Template file for PXE configuration ' - - - name: baremetal.pxe_deploy_timeout - type: integer - default: 0 - help: 'Timeout for PXE deployments. Default: 0 (unlimited) ' - - - name: baremetal.pxe_network_config - type: boolean - default: False - help: 'If set, pass the network configuration details to the initramfs via cmdline. ' - - - name: baremetal.pxe_bootfile_name - type: string - default: 'pxelinux.0' - help: 'This gets passed to Neutron as the bootfile dhcp parameter when the dhcp_options_enabled is set. ' - - - name: baremetal.tile_pdu_ip - type: string - default: '10.0.100.1' - help: 'ip address of tilera pdu ' - - - name: baremetal.tile_pdu_mgr - type: string - default: '/tftpboot/pdu_mgr' - help: 'management script for tilera pdu ' - - - name: baremetal.tile_pdu_off - type: integer - default: 2 - help: 'power status of tilera PDU is OFF ' - - - name: baremetal.tile_pdu_on - type: integer - default: 1 - help: 'power status of tilera PDU is ON ' - - - name: baremetal.tile_pdu_status - type: integer - default: 9 - help: 'power status of tilera PDU ' - - - name: baremetal.tile_power_wait - type: integer - default: 9 - help: 'wait time in seconds until check the result after tilera power operations ' - - - name: baremetal.virtual_power_ssh_host - type: string - default: '' - help: 'ip or name to virtual power host ' - - - name: baremetal.virtual_power_ssh_port - type: port - default: 22 - help: 'Port to use for ssh to virtual power host ' - - - name: baremetal.virtual_power_type - type: string - default: 'virsh' - help: 'base command to use for virtual power(vbox,virsh) ' - - - name: baremetal.virtual_power_host_user - type: string - default: '' - help: 'user to execute virtual power commands as ' - - - name: baremetal.virtual_power_host_pass - type: string - default: '' - help: 'password for virtual power host_user ' - - - name: baremetal.virtual_power_host_key - type: string - default: ~ - help: 'ssh key for virtual power host_user ' - - - name: baremetal.use_unsafe_iscsi - type: boolean - default: False - help: 'Do not set this out of dev/test environments. If a node does not have a fixed PXE IP address, volumes are exported with globally opened ACL ' - - - name: baremetal.iscsi_iqn_prefix - type: string - default: 'iqn.2010-10.org.openstack.baremetal' - help: 'iSCSI IQN prefix used in baremetal volume connections. ' - - - name: rpc_notifier2.topics - type: string_list - default: ['notifications'] - help: 'AMQP topic(s) used for OpenStack notifications ' - - - name: matchmaker_redis.port - type: integer - default: 6379 - help: 'Use this port to connect to redis host. ' - - - name: matchmaker_redis.password - type: string - default: ~ - help: 'Password for Redis server. (optional) ' - - - name: ssl.cert_file - type: string - default: ~ - help: 'Certificate file to use when starting the server securely ' - - - name: trusted_computing.attestation_server - type: string - default: ~ - help: 'attestation server http ' - - - name: trusted_computing.attestation_server_ca_file - type: string - default: ~ - help: 'attestation server Cert file for Identity verification ' - - - name: trusted_computing.attestation_port - type: string - default: '8443' - help: 'attestation server port ' - - - name: trusted_computing.attestation_api_url - type: string - default: '/OpenAttestationWebServices/V1.0' - help: 'attestation web API URL ' - - - name: trusted_computing.attestation_auth_blob - type: string - default: ~ - help: 'attestation authorization blob - must change ' - - - name: trusted_computing.attestation_auth_timeout - type: integer - default: 60 - help: 'Attestation status cache valid period length ' - - - name: upgrade_levels.baseapi - type: string - default: ~ - help: 'Set a version cap for messages sent to the base api in any service ' - - - name: upgrade_levels.intercell - type: string - default: ~ - help: 'Set a version cap for messages sent between cells services ' - - - name: upgrade_levels.cells - type: string - default: ~ - help: 'Set a version cap for messages sent to local cells services ' - - - name: upgrade_levels.compute - type: string - default: ~ - help: 'Set a version cap for messages sent to compute services ' - - - name: upgrade_levels.conductor - type: string - default: ~ - help: 'Set a version cap for messages sent to conductor services ' - - - name: upgrade_levels.console - type: string - default: ~ - help: 'Set a version cap for messages sent to console services ' - - - name: upgrade_levels.consoleauth - type: string - default: ~ - help: 'Set a version cap for messages sent to consoleauth services ' - - - name: upgrade_levels.network - type: string - default: ~ - help: 'Set a version cap for messages sent to network services ' - - - name: matchmaker_ring.ringfile - type: string - default: '/etc/oslo/matchmaker_ring.json' - help: 'Matchmaker ring file (JSON) ' - - - name: vmware.host_ip - type: string - default: ~ - help: 'URL for connection to VMware ESX/VC host. Required if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver. ' - - - name: vmware.host_username - type: string - default: ~ - help: 'Username for connection to VMware ESX/VC host. Used only if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver. ' - - - name: vmware.host_password - type: string - default: ~ - help: 'Password for connection to VMware ESX/VC host. Used only if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver. ' - - - name: vmware.cluster_name - type: string - default: ~ - help: 'Name of a VMware Cluster ComputeResource. Used only if compute_driver is vmwareapi.VMwareVCDriver. (multi valued)' - - - name: vmware.datastore_regex - type: string - default: ~ - help: 'Regex to match the name of a datastore. Used only if compute_driver is vmwareapi.VMwareVCDriver. ' - - - name: vmware.task_poll_interval - type: float - default: 5.0 - help: 'The interval used for polling of remote tasks. Used only if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver. ' - - - name: vmware.api_retry_count - type: integer - default: 10 - help: 'The number of times we retry on failures, e.g., socket error, etc. Used only if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver. ' - - - name: vmware.vnc_port - type: port - default: 5900 - help: 'VNC starting port ' - - - name: vmware.vnc_port_total - type: integer - default: 10000 - help: 'Total number of VNC ports ' - - - name: vmware.vnc_password - type: string - default: ~ - help: 'DEPRECATED. VNC password. The password-based access to VNC consoles will be removed in the next release. The default value will disable password protection on the VNC console. ' - - - name: vmware.use_linked_clone - type: boolean - default: True - help: 'Whether to use linked clone ' - - - name: vmware.wsdl_location - type: string - default: ~ - help: 'Optional VIM Service WSDL Location e.g http:///vimService.wsdl. Optional over-ride to default location for bug work-arounds ' - - - name: vmware.maximum_objects - type: integer - default: 100 - help: 'The maximum number of ObjectContent data objects that should be returned in a single result. A positive value will cause the operation to suspend the retrieval when the count of objects reaches the specified maximum. The server may still limit the count to something less than the configured value. Any remaining objects may be retrieved with additional requests. ' - - - name: vmware.integration_bridge - type: string - default: 'br-int' - help: 'Name of Integration Bridge ' - - - name: spice.html5proxy_base_url - type: string - default: 'http://127.0.0.1:6082/spice_auto.html' - help: "location of spice html5 console proxy, in the form 'http://127.0.0.1:6082/spice_auto.html' " - - - name: spice.server_listen - type: host - default: '127.0.0.1' - help: 'IP address on which instance spice server should listen ' - - - name: spice.server_proxyclient_address - type: string - default: '127.0.0.1' - help: 'the address to which proxy clients (like nova- spicehtml5proxy) should connect ' - - - name: spice.agent_enabled - type: boolean - default: True - help: 'enable spice guest agent support ' - - - name: spice.keymap - type: string - default: 'en-us' - help: 'keymap for spice ' - diff --git a/rubick/schemas/nova/nova.conf.yml b/rubick/schemas/nova/nova.conf.yml deleted file mode 100644 index 60f9968..0000000 --- a/rubick/schemas/nova/nova.conf.yml +++ /dev/null @@ -1,7831 +0,0 @@ -- version: '2013.1.3' - checkpoint: true - added: - - - name: internal_service_availability_zone - type: string - default: 'internal' - help: 'availability_zone to show internal services under' - - - name: default_availability_zone - type: string - default: 'nova' - help: 'default compute node availability_zone' - - - name: ssl.ca_file - type: file - default: ~ - help: 'CA certificate file to use to verify connecting clients' - - - name: ssl.key_file - type: file - default: ~ - help: 'Private key file to use when starting the server securely' - - - name: crl_file - type: file - default: 'crl.pem' - help: 'Filename of root Certificate Revocation List' - - - name: keys_path - type: directory - default: '$state_path/keys' - help: 'Where we keep our keys' - - - name: ca_path - type: directory - default: '$state_path/CA' - help: 'Where we keep our root CA' - - - name: use_project_ca - type: boolean - default: false - help: 'Should we use a CA for each project?' - - - name: user_cert_subject - type: string - default: '/CUS/STCalifornia/OOpenStack/OUNovaDev/CN%.16s-%.16s-%s' - help: 'Subject for certificate for users, %s for project, user, timestamp' - - - name: project_cert_subject - type: string - default: '/CUS/STCalifornia/OOpenStack/OUNovaDev/CNproject-ca-%.16s-%s' - help: 'Subject for certificate for projects, %s for project, timestamp' - - - name: fatal_exception_format_errors - type: boolean - default: false - help: 'make exception message format errors fatal' - - - name: my_ip - type: string - default: '10.0.0.1' - help: 'ip address of this host' - - - name: matchmaker_redis.host - type: host - default: '127.0.0.1' - help: 'Host to locate redis' - - - name: use_ipv6 - type: boolean - default: false - help: 'use ipv6' - - - name: notify_on_state_change - type: enum - type_args: {'values': [~, 'vm_state', 'vm_and_task_state']} - default: ~ - help: "If set, send compute.instance.update notifications on instance state changes. Valid values are None for no notifications, 'vm_state' for notifications on VM state changes, or 'vm_and_task_state' for notifications on VM and task state changes." - - - name: notify_api_faults - type: boolean - default: false - help: 'If set, send api.fault notifications on caught exceptions in the API service.' - - - name: pybasedir - type: directory - default: '/usr/lib/python/site-packages' - help: 'Directory where the nova python module is installed' - - - name: bindir - type: directory - default: '/usr/local/bin' - help: 'Directory where nova binaries are installed' - - - name: state_path - type: directory - default: '$pybasedir' - help: "Top-level directory for maintaining nova's state" - - - name: policy_file - type: file - default: 'policy.json' - help: 'JSON file representing policy' - - - name: policy_default_rule - type: string - default: 'default' - help: 'Rule checked when requested rule is not found' - - - name: quota_instances - type: integer - default: 10 - help: 'number of instances allowed per project' - - - name: quota_cores - type: integer - default: 20 - help: 'number of instance cores allowed per project' - - - name: quota_ram - type: integer - default: 51200 - help: 'megabytes of instance ram allowed per project' - - - name: quota_floating_ips - type: integer - default: 10 - help: 'number of floating ips allowed per project' - - - name: quota_fixed_ips - type: integer - default: -1 - help: 'number of fixed ips allowed per project' - - - name: quota_metadata_items - type: integer - default: 128 - help: 'number of metadata items allowed per instance' - - - name: quota_injected_files - type: integer - default: 5 - help: 'number of injected files allowed' - - - name: quota_injected_file_content_bytes - type: integer - default: 10240 - help: 'number of bytes allowed per injected file' - - - name: quota_injected_file_path_bytes - type: integer - default: 255 - help: 'number of bytes allowed per injected file path' - - - name: quota_security_groups - type: integer - default: 10 - help: 'number of security groups per project' - - - name: quota_security_group_rules - type: integer - default: 20 - help: 'number of security rules per security group' - - - name: quota_key_pairs - type: integer - default: 100 - help: 'number of key pairs per user' - - - name: reservation_expire - type: integer - default: 86400 - help: 'number of seconds until a reservation expires' - - - name: until_refresh - type: integer - default: false - help: 'count of reservations until usage is refreshed' - - - name: max_age - type: integer - default: 0 - help: 'number of seconds between subsequent usage refreshes' - - - name: quota_driver - type: string - default: 'nova.quota.DbQuotaDriver' - help: 'default driver to use for quota checks' - - - name: report_interval - type: integer - default: 10 - help: 'seconds between nodes reporting state to datastore' - - - name: periodic_enable - type: boolean - default: true - help: 'enable periodic tasks' - - - name: periodic_fuzzy_delay - type: integer - default: 60 - help: 'range of seconds to randomly delay when starting the periodic task scheduler to reduce stampeding.' - - - name: enabled_apis - type: string_list - default: ['ec2', 'osapi_compute', 'metadata'] - help: 'a list of APIs to enable by default' - - - name: enabled_ssl_apis - type: list - default: [] - help: 'a list of APIs with enabled SSL' - - - name: ec2_listen - type: host - default: '0.0.0.0' - help: 'IP address for EC2 API to listen' - - - name: ec2_listen_port - type: port - default: 8773 - help: 'port for ec2 api to listen' - - - name: ec2_workers - type: integer - default: ~ - help: 'Number of workers for EC2 API service' - - - name: osapi_compute_listen - type: host - default: '0.0.0.0' - help: 'IP address for OpenStack API to listen' - - - name: osapi_compute_listen_port - type: port - default: 8774 - help: 'list port for osapi compute' - - - name: osapi_compute_workers - type: integer - default: ~ - help: 'Number of workers for OpenStack API service' - - - name: metadata_manager - type: string - default: 'nova.api.manager.MetadataManager' - help: 'OpenStack metadata service manager' - - - name: metadata_listen - type: host - default: '0.0.0.0' - help: 'IP address for metadata api to listen' - - - name: metadata_listen_port - type: port - default: 8775 - help: 'port for metadata api to listen' - - - name: metadata_workers - type: integer - default: ~ - help: 'Number of workers for metadata service' - - - name: compute_manager - type: string - default: 'nova.compute.manager.ComputeManager' - help: 'full class name for the Manager for compute' - - - name: console_manager - type: string - default: 'nova.console.manager.ConsoleProxyManager' - help: 'full class name for the Manager for console proxy' - - - name: cert_manager - type: string - default: 'nova.cert.manager.CertManager' - help: 'full class name for the Manager for cert' - - - name: network_manager - type: string - default: 'nova.network.manager.VlanManager' - help: 'full class name for the Manager for network' - - - name: scheduler_manager - type: string - default: 'nova.scheduler.manager.SchedulerManager' - help: 'full class name for the Manager for scheduler' - - - name: service_down_time - type: integer - default: 60 - help: 'maximum time since last check-in for up service' - - - name: sqlite_clean_db - type: file - default: 'clean.sqlite' - help: 'File name of clean sqlite db' - - - name: monkey_patch - type: boolean - default: false - help: 'Whether to log monkey patching' - - - name: monkey_patch_modules - type: list - default: ['nova.api.ec2.cloud:nova.notifications.notify_decorator', 'nova.compute.api:nova.notifications.notify_decorator'] - help: 'List of modules/decorators to monkey patch' - - - name: password_length - type: integer - default: 12 - help: 'Length of generated instance admin passwords' - - - name: instance_usage_audit_period - type: enum - type_args: {'values': ['hour', 'day', 'month', 'year']} - default: 'month' - help: 'time period to generate instance usages for. Time period must be hour, day, month or year' - - - name: rootwrap_config - type: file - default: '/etc/nova/rootwrap.conf' - help: 'Path to the rootwrap configuration file to use for running commands as root' - - - name: tempdir - type: directory - default: ~ - help: 'Explicitly specify the temporary working directory' - - - name: api_paste_config - type: file - default: 'api-paste.ini' - help: 'File name for the paste.deploy config for nova-api' - - - name: wsgi_log_format - type: string - default: '%(client_ip)s "%(request_line)s" status: %(status_code)s len: %(body_length)s time: %(wall_seconds).7f' - help: 'A python format string that is used as the template to generate log lines. The following values can be formatted into it: client_ip, date_time, request_line, status_code, body_length, wall_seconds.' - - - name: ssl_ca_file - type: file - default: ~ - help: 'CA certificate file to use to verify connecting clients' - - - name: ssl_cert_file - type: file - default: ~ - help: 'SSL certificate of API server' - - - name: ssl_key_file - type: file - default: ~ - help: 'SSL private key of API server' - - - name: tcp_keepidle - type: integer - default: 600 - help: 'Sets the value of TCP_KEEPIDLE in seconds for each server socket. Not supported on OS X.' - - - name: api_rate_limit - type: boolean - default: false - help: 'whether to use per-user rate limiting for the api.' - - - name: auth_strategy - type: enum - type_args: {'values': ['noauth', 'keystone']} - default: 'noauth' - help: 'The strategy to use for auth: noauth or keystone.' - - - name: use_forwarded_for - type: boolean - default: false - help: 'Treat X-Forwarded-For as the canonical remote address. Only enable this if you have a sanitizing proxy.' - - - name: lockout_attempts - type: integer - default: 5 - help: 'Number of failed auths before lockout.' - - - name: lockout_minutes - type: integer - default: 15 - help: 'Number of minutes to lockout if triggered.' - - - name: lockout_window - type: integer - default: 15 - help: 'Number of minutes for lockout window.' - - - name: keystone_ec2_url - type: string - default: 'http://localhost:5000/v2.0/ec2tokens' - help: 'URL to get token from ec2 request.' - - - name: ec2_private_dns_show_ip - type: boolean - default: false - help: 'Return the IP address as private dns hostname in describe instances' - - - name: ec2_strict_validation - type: boolean - default: true - help: 'Validate security group names according to EC2 specification' - - - name: ec2_timestamp_expiry - type: integer - default: 300 - help: 'Time in seconds before ec2 timestamp expires' - - - name: ec2_host - type: host - default: '$my_ip' - help: 'the ip of the ec2 api server' - - - name: ec2_dmz_host - type: host - default: '$my_ip' - help: 'the internal ip of the ec2 api server' - - - name: ec2_port - type: port - default: 8773 - help: 'the port of the ec2 api server' - - - name: ec2_scheme - type: enum - type_args: {'values': ['http', 'https']} - default: 'http' - help: 'the protocol to use when connecting to the ec2 api server' - - - name: ec2_path - type: string - default: '/services/Cloud' - help: 'the path prefix used to call the ec2 api server' - - - name: region_list - type: list - default: [] - help: 'list of region=fqdn pairs separated by commas' - - - name: config_drive_skip_versions - type: string - default: '1.0 2007-01-19 2007-03-01 2007-08-29 2007-10-10 2007-12-15 2008-02-01 2008-09-01' - help: 'List of metadata versions to skip placing into the config drive' - - - name: vendordata_driver - type: string - default: 'nova.api.metadata.vendordata_json.JsonFileVendorData' - help: 'Driver to use for vendor data' - - - name: service_neutron_metadata_proxy - type: boolean - default: false - help: 'Set flag to indicate Neutron will proxy metadata requests and resolve instance ids.' - - - name: neutron_metadata_proxy_shared_secret - type: string - default: '' - help: 'Shared secret to validate proxies Neutron metadata requests' - - - name: vendordata_jsonfile_path - type: file - default: ~ - help: 'File to load json formated vendor data from' - - - name: osapi_max_limit - type: integer - default: 1000 - help: 'the maximum number of items returned in a single response from a collection resource' - - - name: osapi_compute_link_prefix - type: string - default: ~ - help: 'Base URL that will be presented to users in links to the OpenStack Compute API' - - - name: osapi_glance_link_prefix - type: string - default: ~ - help: 'Base URL that will be presented to users in links to glance resources' - - - name: allow_instance_snapshots - type: boolean - default: true - help: 'Permit instance snapshot operations.' - - - name: osapi_compute_ext_list - type: list - default: [] - help: 'Specify list of extensions to load when using osapi_compute_extension option with nova.api.openstack.compute.contrib.select_extensions' - - - name: fping_path - type: executable - default: '/usr/sbin/fping' - help: 'Full path to fping.' - - - name: enable_network_quota - type: boolean - default: false - help: 'Enables or disables quota checking for tenant networks' - - - name: use_neutron_default_nets - type: boolean - default: false - help: 'Control for checking for default networks' - - - name: neutron_default_tenant_id - type: string - default: 'default' - help: 'Default tenant id when creating neutron networks' - - - name: osapi_compute_extension - type: multi - default: 'nova.api.openstack.compute.contrib.standard_extensions' - help: 'osapi compute extension to load' - - - name: osapi_hide_server_address_states - type: list - default: ['building'] - help: 'List of instance states that should hide network info' - - - name: enable_instance_password - type: boolean - default: true - help: 'Allows use of instance password during server creation' - - - name: osapi_max_request_body_size - type: integer - default: 114688 - help: 'the maximum body size per each osapi request(bytes)' - - - name: compute_api_class - type: string - default: 'nova.compute.api.API' - help: 'The full class name of the compute API class to use' - - - name: cert_topic - type: string - default: 'cert' - help: 'the topic cert nodes listen on' - - - name: vpn_image_id - type: string - default: '0' - help: 'image id used when starting up a cloudpipe vpn server' - - - name: vpn_flavor - type: string - default: 'm1.tiny' - help: 'Flavor for vpn instances' - - - name: boot_script_template - type: file - default: '$pybasedir/nova/cloudpipe/bootscript.template' - help: 'Template for cloudpipe instance boot script' - - - name: dmz_net - type: old_network - default: '10.0.0.0' - help: 'Network to push into openvpn config' - - - name: dmz_mask - type: network_mask - default: '255.255.255.0' - help: 'Netmask to push into openvpn config' - - - name: vpn_key_suffix - type: string - default: '-vpn' - help: 'Suffix to add to project name for vpn key and secgroups' - - - name: record - type: boolean - default: false - help: 'Record sessions to FILE.[session_number]' - - - name: daemon - type: boolean - default: false - help: 'Become a daemon' - - - name: ssl_only - type: boolean - default: false - help: 'Disallow non-encrypted connections' - - - name: source_is_ipv6 - type: boolean - default: false - help: 'Source is ipv6' - - - name: upgrade_levels.cert - type: string - default: ~ - help: 'Set a version cap for messages sent to cert services' - - - name: key - type: file - default: ~ - help: 'SSL key file' - - - name: web - type: executable - default: '/usr/share/spice-html5' - help: 'Run webserver on same port. Serve files from DIR.' - - - name: novncproxy_host - type: host - default: '0.0.0.0' - help: 'Host on which to listen for incoming requests' - - - name: novncproxy_port - type: port - default: 6080 - help: 'Port on which to listen for incoming requests' - - - name: spicehtml5proxy_host - type: host - default: '0.0.0.0' - help: 'Host on which to listen for incoming requests' - - - name: spicehtml5proxy_port - type: port - default: 6082 - help: 'Port on which to listen for incoming requests' - - - name: allow_resize_to_same_host - type: boolean - default: false - help: 'Allow destination machine to match source for resize. Useful when testing in single-host environments.' - - - name: allow_migrate_to_same_host - type: boolean - default: false - help: 'Allow migrate machine to the same host. Useful when testing in single-host environments.' - - - name: default_schedule_zone - type: string - default: ~ - help: "availability zone to use when user doesn't specify one" - - - name: non_inheritable_image_properties - type: list - default: ['cache_in_nova', 'bittorrent'] - help: 'These are image properties which a snapshot should not inherit from an instance' - - - name: null_kernel - type: string - default: 'nokernel' - help: 'kernel image that indicates not to use a kernel, but to use a raw disk image instead' - - - name: multi_instance_display_name_template - type: string - default: '%(name)s-%(uuid)s' - help: "When creating multiple instances with a single request using the os-multiple-create API extension, this template will be used to build the display name for each instance. The benefit is that the instances end up with different hostnames. To restore legacy behavior of every instance having the same name, set this option to '%(name)s'. Valid keys for the template are: name, uuid, count." - - - name: max_local_block_devices - type: integer - default: 3 - help: 'Maximum number of devices that will result in a local image being created on the hypervisor node. Setting this to 0 means nova will allow only boot from volume. A negative number means unlimited.' - - - name: default_flavor - type: string - default: 'm1.small' - help: 'default flavor to use for the EC2 API only. The Nova API does not support a default flavor.' - - - name: console_host - type: string - default: 'nova' - help: 'Console proxy host to use to connect to instances on this host.' - - - name: default_access_ip_network_name - type: string - default: ~ - help: 'Name of network to use to set access ips for instances' - - - name: defer_iptables_apply - type: boolean - default: false - help: 'Whether to batch up the application of IPTables rules during a host restart and apply all at the end of the init phase' - - - name: instances_path - type: directory - default: '$state_path/instances' - help: 'where instances are stored on disk' - - - name: instance_usage_audit - type: boolean - default: false - help: 'Generate periodic compute.instance.exists notifications' - - - name: live_migration_retry_count - type: integer - default: 30 - help: 'Number of 1 second retries needed in live_migration' - - - name: resume_guests_state_on_host_boot - type: boolean - default: false - help: 'Whether to start guests that were running before the host rebooted' - - - name: network_allocate_retries - type: integer - default: false - help: 'Number of times to retry network allocation on failures' - - - name: maximum_instance_delete_attempts - type: integer - default: 5 - help: 'The number of times to attempt to reap an instances files.' - - - name: bandwidth_poll_interval - type: integer - default: 600 - help: 'interval to pull bandwidth usage info' - - - name: sync_power_state_interval - type: integer - default: 600 - help: 'interval to sync power states between the database and the hypervisor' - - - name: heal_instance_info_cache_interval - type: integer - default: 60 - help: 'Number of seconds between instance info_cache self healing updates' - - - name: host_state_interval - type: integer - default: 120 - help: 'Interval in seconds for querying the host status' - - - name: image_cache_manager_interval - type: integer - default: 2400 - help: 'Number of seconds to wait between runs of the image cache manager' - - - name: reclaim_instance_interval - type: integer - default: 0 - help: 'Interval in seconds for reclaiming deleted instances' - - - name: volume_usage_poll_interval - type: integer - default: 0 - help: 'Interval in seconds for gathering volume usages' - - - name: shelved_poll_interval - type: integer - default: 3600 - help: 'Interval in seconds for polling shelved instances to offload' - - - name: shelved_offload_time - type: integer - default: 0 - help: 'Time in seconds before a shelved instance is eligible for removing from a host. -1 never offload, 0 offload when shelved' - - - name: instance_delete_interval - type: integer - default: 300 - help: 'Interval in seconds for retrying failed instance file deletes' - - - name: running_deleted_instance_action - type: string - default: 'log' - help: "Action to take if a running deleted instance is detected.Valid options are 'noop', 'log' and 'reap'. Set to 'noop' to disable." - - - name: running_deleted_instance_poll_interval - type: integer - default: 1800 - help: 'Number of seconds to wait between runs of the cleanup task.' - - - name: running_deleted_instance_timeout - type: integer - default: 0 - help: 'Number of seconds after being deleted when a running instance should be considered eligible for cleanup.' - - - name: reboot_timeout - type: integer - default: 0 - help: 'Automatically hard reboot an instance if it has been stuck in a rebooting state longer than N seconds. Set to 0 to disable.' - - - name: instance_build_timeout - type: integer - default: 0 - help: 'Amount of time in seconds an instance can be in BUILD before going into ERROR status.Set to 0 to disable.' - - - name: rescue_timeout - type: integer - default: 0 - help: 'Automatically unrescue an instance after N seconds. Set to 0 to disable.' - - - name: resize_confirm_window - type: integer - default: 0 - help: 'Automatically confirm resizes after N seconds. Set to 0 to disable.' - - - name: reserved_host_disk_mb - type: integer - default: 0 - help: 'Amount of disk in MB to reserve for the host' - - - name: reserved_host_memory_mb - type: integer - default: 512 - help: 'Amount of memory in MB to reserve for the host' - - - name: compute_stats_class - type: string - default: 'nova.compute.stats.Stats' - help: 'Class that will manage stats for the local compute host' - - - name: compute_topic - type: string - default: 'compute' - help: 'the topic compute nodes listen on' - - - name: migrate_max_retries - type: integer - default: -1 - help: 'Number of times to retry live-migration before failing. If == -1, try until out of hosts. If == 0, only try once, no retries.' - - - name: console_driver - type: string - default: 'nova.console.xvp.XVPConsoleProxy' - help: 'Driver to use for the console proxy' - - - name: stub_compute - type: boolean - default: false - help: 'Stub calls to compute worker for tests' - - - name: console_public_hostname - type: string - default: 'nova' - help: 'Publicly visible name for this console host' - - - name: console_topic - type: string - default: 'console' - help: 'the topic console proxy nodes listen on' - - - name: console_vmrc_port - type: port - default: 443 - help: 'port for VMware VMRC connections' - - - name: console_vmrc_error_retries - type: integer - default: 10 - help: 'number of retries for retrieving VMRC information' - - - name: console_xvp_conf_template - type: file - default: '$pybasedir/nova/console/xvp.conf.template' - help: 'XVP conf template' - - - name: console_xvp_conf - type: file - default: '/etc/xvp.conf' - help: 'generated XVP conf file' - - - name: console_xvp_pid - type: file - default: '/var/run/xvp.pid' - help: 'XVP master process pid file' - - - name: console_xvp_log - type: file - default: '/var/log/xvp.log' - help: 'XVP log file' - - - name: console_xvp_multiplex_port - type: port - default: 5900 - help: 'port for XVP to multiplex VNC connections on' - - - name: consoleauth_topic - type: string - default: 'consoleauth' - help: 'the topic console auth proxy nodes listen on' - - - name: console_token_ttl - type: integer - default: 600 - help: 'How many seconds before deleting tokens' - - - name: consoleauth_manager - type: string - default: 'nova.consoleauth.manager.ConsoleAuthManager' - help: 'Manager for console auth' - - - name: enable_new_services - type: boolean - default: true - help: 'Services to be added to the available pool on create' - - - name: instance_name_template - type: string - default: 'instance-%08x' - help: 'Template string to be used to generate instance names' - - - name: snapshot_name_template - type: string - default: 'snapshot-%s' - help: 'Template string to be used to generate snapshot names' - - - name: db_driver - type: string - default: 'nova.db' - help: 'driver to use for database access' - - - name: osapi_compute_unique_server_name_scope - type: string - default: '' - help: "When set, compute API will consider duplicate hostnames invalid within the specified scope, regardless of case. Should be empty, 'project' or 'global'." - - - name: glance_host - type: host - default: '$my_ip' - help: 'default glance hostname or ip' - - - name: glance_port - type: port - default: 9292 - help: 'default glance port' - - - name: glance_protocol - type: enum - type_args: {'values': ['http', 'https']} - default: 'http' - help: 'Default protocol to use when connecting to glance. Set to https for SSL.' - - - name: glance_api_servers - type: list - default: ['$glance_host:$glance_port'] - help: 'A list of the glance api servers available to nova. Prefix with https:// for ssl-based glance api servers.' - - - name: glance_api_insecure - type: boolean - default: false - help: 'Allow to perform insecure SSL' - - - name: glance_num_retries - type: integer - default: 0 - help: 'Number retries when downloading an image from glance' - - - name: allowed_direct_url_schemes - type: list - default: [] - help: 'A list of url scheme that can be downloaded directly via the direct_url. Currently supported schemes: [file].' - - - name: image_decryption_dir - type: directory - default: '/tmp' - help: 'parent dir for tempdir used for image decryption' - - - name: s3_host - type: host - default: '$my_ip' - help: 'hostname or ip for OpenStack to use when accessing the s3 api' - - - name: s3_port - type: port - default: 3333 - help: 'port used when accessing the s3 api' - - - name: s3_access_key - type: string - default: 'notchecked' - help: 'access key to use for s3 server for images' - - - name: s3_secret_key - type: string - default: 'notchecked' - help: 'secret key to use for s3 server for images' - - - name: s3_use_ssl - type: boolean - default: false - help: 'whether to use ssl when talking to s3' - - - name: s3_affix_tenant - type: boolean - default: false - help: 'whether to affix the tenant id to the access key when downloading from s3' - - - name: ipv6_backend - type: string - default: 'rfc2462' - help: 'Backend to use for IPv6 generation' - - - name: network_api_class - type: string - default: 'nova.network.api.API' - help: 'The full class name of the network API class to use' - - - name: network_driver - type: string - default: 'nova.network.linux_net' - help: 'Driver to use for network creation' - - - name: default_floating_pool - type: string - default: 'nova' - help: 'Default pool for floating ips' - - - name: auto_assign_floating_ip - type: boolean - default: false - help: 'Autoassigning floating ip to VM' - - - name: floating_ip_dns_manager - type: string - default: 'nova.network.noop_dns_driver.NoopDNSDriver' - help: 'full class name for the DNS Manager for floating IPs' - - - name: instance_dns_manager - type: string - default: 'nova.network.noop_dns_driver.NoopDNSDriver' - help: 'full class name for the DNS Manager for instance IPs' - - - name: instance_dns_domain - type: string - default: '' - help: 'full class name for the DNS Zone for instance IPs' - - - name: ldap_dns_url - type: string - default: 'ldap://ldap.example.com:389' - help: 'URL for ldap server which will store dns entries' - - - name: ldap_dns_user - type: string - default: 'uidadmin,oupeople,dcexample,dcorg' - help: 'user for ldap DNS' - - - name: ldap_dns_password - type: string - default: 'password' - help: 'password for ldap DNS' - - - name: ldap_dns_soa_hostmaster - type: string - default: 'hostmaster@example.org' - help: 'Hostmaster for ldap dns driver Statement of Authority' - - - name: ldap_dns_servers - type: multi - default: 'dns.example.org' - help: 'DNS Servers for ldap dns driver' - - - name: ldap_dns_base_dn - type: string - default: 'ouhosts,dcexample,dcorg' - help: 'Base DN for DNS entries in ldap' - - - name: ldap_dns_soa_refresh - type: integer - default: 1800 - help: 'Refresh interval' - - - name: ldap_dns_soa_retry - type: integer - default: 3600 - help: 'Retry interval' - - - name: ldap_dns_soa_expiry - type: integer - default: 86400 - help: 'Expiry interval' - - - name: ldap_dns_soa_minimum - type: integer - default: 7200 - help: 'Minimum interval' - - - name: dhcpbridge_flagfile - type: file - default: '/etc/nova/nova-dhcpbridge.conf' - help: 'location of flagfiles for dhcpbridge' - - - name: networks_path - type: directory - default: '$state_path/networks' - help: 'Location to keep network config files' - - - name: public_interface - type: string - default: 'eth0' - help: 'Interface for public IP addresses' - - - name: network_device_mtu - type: string - default: ~ - help: 'MTU setting for vlan' - - - name: dhcpbridge - type: executable - default: '$bindir/nova-dhcpbridge' - help: 'location of nova-dhcpbridge' - - - name: routing_source_ip - type: host - default: '$my_ip' - help: 'Public IP of network host' - - - name: dhcp_lease_time - type: integer - default: 120 - help: 'Lifetime of a DHCP lease in seconds' - - - name: dns_server - type: multi - default: '' - help: 'if set, uses specific dns server for dnsmasq. Canbe specified multiple times.' - - - name: use_network_dns_servers - type: boolean - default: false - help: 'if set, uses the dns1 and dns2 from the network ref.as dns servers.' - - - name: dmz_cidr - type: list - default: [] - help: 'A list of dmz range that should be accepted' - - - name: force_snat_range - type: multi - default: '' - help: 'Traffic to this range will always be snatted to the fallback ip, even if it would normally be bridged out of the node. Can be specified multiple times.' - - - name: dnsmasq_config_file - type: string - default: '' - help: 'Override the default dnsmasq settings with this file' - - - name: linuxnet_interface_driver - type: string - default: 'nova.network.linux_net.LinuxBridgeInterfaceDriver' - help: 'Driver used to create ethernet devices.' - - - name: linuxnet_ovs_integration_bridge - type: string - default: 'br-int' - help: 'Name of Open vSwitch bridge used with linuxnet' - - - name: send_arp_for_ha - type: boolean - default: false - help: 'send gratuitous ARPs for HA setup' - - - name: send_arp_for_ha_count - type: integer - default: 3 - help: 'send this many gratuitous ARPs for HA setup' - - - name: use_single_default_gateway - type: boolean - default: false - help: 'Use single default gateway. Only first nic of vm will get default gateway from dhcp server' - - - name: forward_bridge_interface - type: multi - default: 'all' - help: 'An interface that bridges can forward to. If this is set to all then all traffic will be forwarded. Can be specified multiple times.' - - - name: metadata_host - type: host - default: '$my_ip' - help: 'the ip for the metadata api server' - - - name: metadata_port - type: port - default: 8775 - help: 'the port for the metadata api port' - - - name: iptables_top_regex - type: regex - default: '' - help: 'Regular expression to match iptables rule that should always be on the top.' - - - name: iptables_bottom_regex - type: regex - default: '' - help: 'Regular expression to match iptables rule that should always be on the bottom.' - - - name: iptables_drop_action - type: string - default: 'DROP' - help: 'The table that iptables to jump to when a packet is to be dropped.' - - - name: flat_network_bridge - type: string - default: ~ - help: 'Bridge for simple network instances' - - - name: flat_network_dns - type: host - default: '8.8.4.4' - help: 'Dns for simple network' - - - name: flat_injected - type: boolean - default: false - help: 'Whether to attempt to inject network setup into guest' - - - name: flat_interface - type: string - default: ~ - help: 'FlatDhcp will bridge into this interface if set' - - - name: vlan_start - type: integer - default: 100 - help: 'First VLAN for private networks' - - - name: vmware.vlan_interface - type: string - default: 'vmnic0' - help: 'Physical ethernet adapter name for vlan networking' - - - name: num_networks - type: integer - default: 1 - help: 'Number of networks to support' - - - name: vpn_ip - type: host - default: '$my_ip' - help: 'Public IP for the cloudpipe VPN servers' - - - name: vpn_start - type: port - default: 1000 - help: 'First Vpn port for private networks' - - - name: network_size - type: integer - default: 256 - help: 'Number of addresses in each private subnet' - - - name: fixed_range_v6 - type: string - default: 'fd00::/48' - help: 'Fixed IPv6 address block' - - - name: fixed_range - type: network - default: '' - help: 'Fixed IPv4 address block' - - - name: gateway - type: host - default: ~ - help: 'Default IPv4 gateway' - - - name: gateway_v6 - type: host_v6 - default: ~ - help: 'Default IPv6 gateway' - - - name: cnt_vpn_clients - type: integer - default: 0 - help: 'Number of addresses reserved for vpn clients' - - - name: fixed_ip_disassociate_timeout - type: integer - default: 600 - help: 'Seconds after which a deallocated ip is disassociated' - - - name: create_unique_mac_address_attempts - type: integer - default: 5 - help: 'Number of attempts to create unique mac address' - - - name: fake_network - type: boolean - default: false - help: 'If passed, use fake network devices and addresses' - - - name: fake_call - type: boolean - default: false - help: 'If True, skip using the queue and make local calls' - - - name: teardown_unused_network_gateway - type: boolean - default: false - help: 'If True, unused gateway devices' - - - name: force_dhcp_release - type: boolean - default: true - help: 'If True, send a dhcp release on instance termination' - - - name: share_dhcp_address - type: boolean - default: false - help: 'If True in multi_host mode, all compute hosts share the same dhcp address. The same IP address used for DHCP will be added on each nova-network node which is only visible to the vms on the same host.' - - - name: update_dns_entries - type: boolean - default: false - help: 'If True, when a DNS entry must be updated, it sends a fanout cast to all network hosts to update their DNS entries in multi host mode' - - - name: dns_update_periodic_interval - type: integer - default: -1 - help: 'Number of seconds to wait between runs of updates to DNS entries.' - - - name: dhcp_domain - type: string - default: 'novalocal' - help: 'domain to use for building the hostnames' - - - name: l3_lib - type: string - default: 'nova.network.l3.LinuxNetL3' - help: 'Indicates underlying L3 management library' - - - name: neutron_url - type: string - default: 'http://127.0.0.1:9696' - help: 'URL for connecting to neutron' - comment: 'New param' - - - name: neutron_url_timeout - type: integer - default: 30 - help: 'timeout value for connecting to neutron in seconds' - - - name: neutron_admin_username - type: string - default: ~ - help: 'username for connecting to neutron in admin context' - - - name: neutron_admin_password - type: string - default: ~ - help: 'password for connecting to neutron in admin context' - - - name: neutron_admin_tenant_name - type: string - default: ~ - help: 'tenant name for connecting to neutron in admin context' - - - name: neutron_region_name - type: string - default: ~ - help: 'region name for connecting to neutron in admin context' - - - name: neutron_admin_auth_url - type: string - default: 'http://localhost:5000/v2.0' - help: 'auth url for connecting to neutron in admin context' - - - name: neutron_api_insecure - type: boolean - default: false - help: 'if set, ignore any SSL validation issues' - - - name: neutron_auth_strategy - type: string - default: 'keystone' - help: 'auth strategy for connecting to neutron in admin context' - - - name: neutron_ovs_bridge - type: string - default: 'br-int' - help: 'Name of Integration Bridge used by Open vSwitch' - - - name: neutron_extension_sync_interval - type: integer - default: 600 - help: 'Number of seconds before querying neutron for extensions' - - - name: neutron_ca_certificates_file - type: file - default: ~ - help: 'Location of ca certicates file to use for neutronclient requests.' - - - name: dhcp_options_enabled - type: boolean - default: false - help: 'Use per-port DHCP options with Neutron' - - - name: network_topic - type: string - default: 'network' - help: 'the topic network nodes listen on' - - - name: multi_host - type: boolean - default: false - help: 'Default value for multi_host in networks. Also, if set, some rpc network calls will be sent directly to host.' - - - name: security_group_api - type: string - default: 'nova' - help: 'The full class name of the security API class' - - - name: buckets_path - type: directory - default: '$state_path/buckets' - help: 'path to s3 buckets' - - - name: s3_listen - type: host - default: '0.0.0.0' - help: 'IP address for S3 API to listen' - - - name: s3_listen_port - type: port - default: 3333 - help: 'port for s3 api to listen' - comment: 'New param' - - - name: sqlite_db - type: file - default: 'nova.sqlite' - help: 'the filename to use with sqlite' - - - name: sqlite_synchronous - type: boolean - default: true - help: 'If true, use synchronous mode for sqlite' - - - name: backdoor_port - type: string - default: ~ - help: "Enable eventlet backdoor. Acceptable values are 0, and :, where 0 results in listening on a random tcp port number, results in listening on the specified port number and not enabling backdoorif it is in use and : results in listening on the smallest unused port number within the specified range of port numbers. The chosen port is displayed in the service's log file." - comment: 'New param' - - - name: disable_process_locking - type: boolean - default: false - help: 'Whether to disable inter-process locks' - - - name: lock_path - type: directory - default: ~ - help: 'Directory to use for lock files.' - - - name: debug - type: boolean - default: false - help: 'Print debugging output' - - - name: verbose - type: boolean - default: false - help: 'Print more verbose output' - - - name: use_stderr - type: boolean - default: true - help: 'Log output to standard error' - - - name: logging_context_format_string - type: string - 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' - comment: 'New param' - - - name: logging_default_format_string - type: string - default: '%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s' - help: 'format string to use for log messages without context' - comment: 'New param' - - - name: logging_debug_format_suffix - type: string - default: '%(funcName)s %(pathname)s:%(lineno)d' - help: 'data to append to log format when level is DEBUG' - comment: 'New param' - - - name: logging_exception_prefix - type: string - default: '%(asctime)s.%(msecs)03d %(process)d TRACE %(name)s %(instance)s' - help: 'prefix each line of exception output with this format' - comment: 'New param' - - - name: default_log_levels - type: list - default: ['amqplib=WARN', 'sqlalchemy=WARN', 'boto=WARN', 'suds=INFO', 'keystone=INFO', 'eventlet.wsgi.server=WARN'] - help: 'list of logger=LEVEL pairs' - - - name: publish_errors - type: boolean - default: false - help: 'publish error events' - - - name: fatal_deprecations - type: boolean - default: false - help: 'make deprecations fatal' - - - name: instance_format - type: string - default: '"[instance: %(uuid)s] "' - help: 'If an instance is passed with the log message, format it like this' - - - name: instance_uuid_format - type: string - default: '"[instance: %(uuid)s] "' - help: 'If an instance UUID is passed with the log message, format it like this' - - - name: log_config - type: file - default: ~ - help: 'If this option is specified, the logging configuration file specified is used and overrides any other logging options specified. Please see the Python logging module documentation for details on logging configuration files.' - - - name: log_format - type: string - default: ~ - help: 'DEPRECATED. A logging.Formatter log message format string which may use any of the available logging.LogRecord attributes. This option is deprecated. Please use logging_context_format_string and logging_default_format_string instead.' - - - name: log_date_format - type: string - default: '%Y-%m-%d %H:%M:%S' - help: 'Format string for %%(asctime)s in log records. Default: %(default)s' - comment: 'New param' - - - name: log_file - type: file - default: ~ - help: '(Optional) Name of log file to output to. If no default is set, logging will go to stdout.' - - - name: log_dir - type: directory - default: ~ - help: '(Optional) The base directory used for relative --log-file paths' - - - name: use_syslog - type: boolean - default: false - help: 'Use syslog for logging.' - - - name: syslog_log_facility - type: string - default: 'LOG_USER' - help: 'syslog facility to receive log lines' - - - name: memcached_servers - type: list - default: ~ - help: 'Memcached servers or None for in process cache.' - - - name: notification_driver - type: multi - default: '' - help: 'Driver or drivers to handle sending notifications' - - - name: default_notification_level - type: enum - type_args: {'values': ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL']} - default: 'INFO' - help: 'Default notification level for outgoing notifications' - - - name: default_publisher_id - type: string - default: ~ - help: 'Default publisher_id for outgoing notifications' - - - name: notification_topics - type: list - default: ['notifications'] - help: 'AMQP topic used for OpenStack notifications' - - - name: run_external_periodic_tasks - type: boolean - default: true - help: 'Some periodic tasks can be run in a separate process. Should we run them here?' - - - name: rpc_backend - type: string - default: 'nova.openstack.common.rpc.impl_kombu' - help: 'The messaging module to use, defaults to kombu.' - - - name: rpc_thread_pool_size - type: integer - default: 64 - help: 'Size of RPC thread pool' - - - name: rpc_conn_pool_size - type: integer - default: 30 - help: 'Size of RPC connection pool' - - - name: rpc_response_timeout - type: integer - default: 60 - help: 'Seconds to wait for a response from call or multicall' - - - name: rpc_cast_timeout - type: integer - default: 30 - help: 'Seconds to wait before a cast expires' - - - name: allowed_rpc_exception_modules - type: list - default: ['nova.exception', 'cinder.exception', 'exceptions'] - help: 'Modules of exceptions that are permitted to be recreatedupon receiving exception data from an rpc call.' - - - name: fake_rabbit - type: boolean - default: false - help: 'If passed, use a fake RabbitMQ provider' - - - name: control_exchange - type: string - default: 'openstack' - help: 'AMQP exchange to connect to if using RabbitMQ or Qpid' - - - name: amqp_durable_queues - type: boolean - default: false - help: 'Use durable queues in amqp.' - - - name: amqp_auto_delete - type: boolean - default: false - help: 'Auto-delete queues in amqp.' - - - name: kombu_ssl_version - type: string - default: '' - help: 'SSL version to use' - - - name: kombu_ssl_keyfile - type: file - default: '' - help: 'SSL key file' - - - name: kombu_ssl_certfile - type: file - default: '' - help: 'SSL cert file' - - - name: kombu_ssl_ca_certs - type: file - default: '' - help: 'SSL certification authority file' - - - name: rabbit_host - type: host - default: 'localhost' - help: 'The RabbitMQ broker address where a single node is used' - deprecated: 'Deprecated in favor of rabbit_hosts' - - - name: rabbit_port - type: port - default: 5672 - help: 'The RabbitMQ broker port where a single node is used' - deprecated: 'Deprecated in favor of rabbit_hosts' - - - name: rabbit_hosts - type: list - default: ['$rabbit_host:$rabbit_port'] - help: 'RabbitMQ HA cluster host:port pairs' - - - name: rabbit_use_ssl - type: boolean - default: false - help: 'connect over SSL for RabbitMQ' - - - name: rabbit_userid - type: string - default: 'guest' - help: 'the RabbitMQ userid' - - - name: rabbit_password - type: string - default: 'guest' - help: 'the RabbitMQ password' - - - name: rabbit_virtual_host - type: string - default: '/' - help: 'the RabbitMQ virtual host' - - - name: rabbit_retry_interval - type: integer - default: 1 - help: 'how frequently to retry connecting with RabbitMQ' - - - name: rabbit_retry_backoff - type: integer - default: 2 - help: 'how long to backoff for between retries when connecting to RabbitMQ' - - - name: rabbit_max_retries - type: integer - default: 0 - help: 'maximum retries with trying to connect to RabbitMQ' - - - name: rabbit_ha_queues - type: boolean - default: false - help: 'use H/A queues in RabbitMQ' - - - name: qpid_hostname - type: host - default: 'localhost' - help: 'Qpid broker hostname' - deprecated: 'Deprecated in favor of qpid_hosts' - - - name: qpid_port - type: port - default: 5672 - help: 'Qpid broker port' - deprecated: 'Deprecated in favor of qpid_hosts' - - - name: qpid_hosts - type: list - default: ['$qpid_hostname:$qpid_port'] - help: 'Qpid HA cluster host:port pairs' - - - name: qpid_username - type: string - default: '' - help: 'Username for qpid connection' - - - name: qpid_password - type: string - default: '' - help: 'Password for qpid connection' - - - name: qpid_sasl_mechanisms - type: string - default: '' - help: 'Space separated list of SASL mechanisms to use for auth' - - - name: qpid_heartbeat - type: integer - default: 60 - help: 'Seconds between connection keepalive heartbeats' - - - name: qpid_protocol - type: enum - type_args: {'values': ['tcp', 'ssl']} - default: 'tcp' - help: "Transport to use, either 'tcp' or 'ssl'" - - - name: qpid_tcp_nodelay - type: boolean - default: true - help: 'Disable Nagle algorithm' - - - name: qpid_topology_version - type: integer - default: 1 - help: 'The qpid topology version to use. Version 1 is what was originally used by impl_qpid. Version 2 includes some backwards-incompatible changes that allow broker federation to work. Users should update to version 2 when they are able to take everything down, as it requires a clean break.' - - - name: rpc_zmq_bind_address - type: string - default: '*' - help: 'ZeroMQ bind address. Should be a wildcard' - - - name: rpc_zmq_matchmaker - type: string - default: 'nova.openstack.common.rpc.matchmaker.MatchMakerLocalhost' - help: 'MatchMaker driver' - - - name: rpc_zmq_port - type: port - default: 9501 - help: 'ZeroMQ receiver listening port' - - - name: rpc_zmq_contexts - type: integer - default: 1 - help: 'Number of ZeroMQ contexts, defaults to 1' - - - name: rpc_zmq_topic_backlog - type: integer - default: ~ - help: 'Maximum number of ingress messages to locally buffer per topic. Default is unlimited.' - - - name: rpc_zmq_ipc_dir - type: directory - default: '/var/run/openstack' - help: 'Directory for holding IPC sockets' - - - name: rpc_zmq_host - type: host - default: 'nova' - help: "Name of this node. Must be a valid hostname, FQDN, or IP address. Must match 'host' option, if running nova." - - - name: matchmaker_heartbeat_freq - type: integer - default: 300 - help: 'Heartbeat frequency' - - - name: matchmaker_heartbeat_ttl - type: integer - default: 600 - help: 'Heartbeat time-to-live.' - - - name: pci_alias - type: multi - default: '' - help: "An alias for a PCI passthrough device requirement. This allows users to specify the alias in the extra_spec for a flavor, without needing to repeat all the PCI property requirements. For example: pci_alias = { 'name': 'QuicAssist', 'product_id': '0443', 'vendor_id': '8086', 'device_type': 'ACCEL' } defines an alias for the Intel QuickAssist card." - - - name: pci_passthrough_whitelist - type: multi - default: '' - help: "White list of PCI devices available to VMs. For example: pci_passthrough_whitelist = [{'vendor_id': '8086', 'product_id': '0443'}]" - - - name: scheduler_host_manager - type: string - default: 'nova.scheduler.host_manager.HostManager' - help: 'The scheduler host manager class to use' - - - name: scheduler_max_attempts - type: integer - default: 3 - help: 'Maximum number of attempts to schedule an instance' - - - name: scheduler_host_subset_size - type: integer - default: 1 - help: 'New instances will be scheduled on a host chosen randomly from a subset of the N best hosts. This property defines the subset size that a host is chosen from. A value of 1 chooses the first host returned by the weighing functions. This value must be at least 1. Any value less than 1 will be ignored, and 1 will be used instead' - - - name: cpu_allocation_ratio - type: float - default: 16.0 - help: 'Virtual CPU to physical CPU allocation ratio which affects all CPU filters. This configuration specifies a global ratio for CoreFilter. For AggregateCoreFilter, it will fall back to this configuration value if no per-aggregate setting found.' - - - name: disk_allocation_ratio - type: float - default: 1.0 - help: 'virtual disk to physical disk allocation ratio' - - - name: max_io_ops_per_host - type: integer - default: 8 - help: 'Ignore hosts that have too many builds/resizes/snaps/migrations' - - - name: isolated_images - type: list - default: [] - help: 'Images to run on isolated host' - - - name: isolated_hosts - type: list - default: [] - help: 'Host reserved for specific images' - - - name: restrict_isolated_hosts_to_isolated_images - type: boolean - default: true - help: 'Whether to force isolated hosts to run only isolated images' - - - name: max_instances_per_host - type: integer - default: 50 - help: 'Ignore hosts that have too many instances' - - - name: ram_allocation_ratio - type: float - default: 1.5 - help: 'Virtual ram to physical ram allocation ratio which affects all ram filters. This configuration specifies a global ratio for RamFilter. For AggregateRamFilter, it will fall back to this configuration value if no per-aggregate setting found.' - - - name: scheduler_available_filters - type: multi - default: 'nova.scheduler.filters.all_filters' - help: "Filter classes available to the scheduler which may be specified more than once. An entry of 'nova.scheduler.filters.standard_filters' maps to all filters included with nova." - - - name: scheduler_default_filters - type: list - default: ['RetryFilter', 'AvailabilityZoneFilter', 'RamFilter', 'ComputeFilter', 'ComputeCapabilitiesFilter', 'ImagePropertiesFilter'] - help: 'Which filter class names to use for filtering hosts when not specified in the request.' - - - name: cells.scheduler_weight_classes - type: list - default: ['nova.cells.weights.all_weighers'] - help: "Weigher classes the cells scheduler should use. An entry of 'nova.cells.weights.all_weighers' maps to all cell weighers included with nova." - - - name: scheduler_driver - type: string - default: 'nova.scheduler.filter_scheduler.FilterScheduler' - help: 'Default driver to use for the scheduler' - - - name: scheduler_topic - type: string - default: 'scheduler' - help: 'the topic scheduler nodes listen on' - - - name: scheduler_json_config_location - type: file - default: '' - help: 'Absolute path to scheduler configuration JSON file.' - - - name: cells.ram_weight_multiplier - type: float - default: 10.0 - help: 'Multiplier used for weighing ram. Negative numbers mean to stack vs spread.' - - - name: servicegroup_driver - type: string - default: 'db' - help: 'The driver for servicegroup service' - - - name: config_drive_format - type: string - default: 'iso9660' - help: 'Config drive format. One of iso9660' - - - name: config_drive_tempdir - type: directory - default: ~ - help: 'Where to put temporary files associated with config drive creation' - - - name: force_config_drive - type: string - default: ~ - help: 'Set to force injection to take place on a config drive' - - - name: mkisofs_cmd - type: string - default: 'genisoimage' - help: 'Name and optionally path of the tool used for ISO image creation' - - - name: baremetal.injected_network_template - type: file - default: '$pybasedir/nova/virt/baremetal/interfaces.template' - help: 'Template file for injected network' - - - name: virt_mkfs - type: string - default: 'windowsmkfs.ntfs --force --fast --label %(fs_label)s %(target)s' - - - name: resize_fs_using_block_device - type: boolean - default: true - help: 'Attempt to resize the filesystem by accessing the image over a block device. This is done by the host and may not be necessary if the image contains a recent version of cloud- init. Possible mechanisms require the nbd driver' - - - name: timeout_nbd - type: integer - default: 10 - help: 'time to wait for a NBD device coming up' - - - name: docker_registry_default_port - type: port - default: 5042 - help: 'Default TCP port to find the docker-registry container' - - - name: compute_driver - type: string - default: ~ - help: 'Driver to use for controlling virtualization. Options include: libvirt.LibvirtDriver, xenapi.XenAPIDriver, fake.FakeDriver, baremetal.BareMetalDriver, vmwareapi.VMwareESXDriver, vmwareapi.VMwareVCDriver' - - - name: default_ephemeral_format - type: string - default: ~ - help: 'The default format an ephemeral_volume will be formatted with on creation.' - - - name: preallocate_images - type: enum - type_args: {'values': ['none', 'space']} - default: 'none' - help: "VM image preallocation mode: 'none' => no storage provisioning is done up front, 'space' => storage is fully allocated at instance start" - - - name: use_cow_images - type: boolean - default: true - help: 'Whether to use cow images' - - - name: firewall_driver - type: string - default: ~ - help: 'Firewall driver' - - - name: allow_same_net_traffic - type: boolean - default: true - help: 'Whether to allow network traffic from same network' - - - name: force_raw_images - type: boolean - default: true - help: 'Force backing images to raw format' - - - name: rescue_image_id - type: string - default: ~ - help: 'Rescue ami image' - - - name: rescue_kernel_id - type: string - default: ~ - help: 'Rescue aki image' - - - name: rescue_ramdisk_id - type: string - default: ~ - help: 'Rescue ari image' - - - name: libvirt_type - type: string - default: 'kvm' - help: 'Libvirt domain type' - - - name: libvirt_uri - type: string - default: '' - help: 'Override the default libvirt URI' - - - name: libvirt_inject_password - type: boolean - default: false - help: 'Inject the admin password at boot time, without an agent.' - - - name: libvirt_inject_key - type: boolean - default: true - help: 'Inject the ssh public key at boot time' - - - name: libvirt_inject_partition - type: integer - default: 1 - help: 'The partition to inject to : -2 => disable, -1 => inspect' - - - name: use_usb_tablet - type: boolean - default: true - help: 'Sync virtual and real mouse cursors in Windows VMs' - - - name: live_migration_uri - type: string - default: 'qemu+tcp://%s/system' - help: 'Migration target URI' - - - name: live_migration_flag - type: string - default: 'VIR_MIGRATE_UNDEFINE_SOURCE, VIR_MIGRATE_PEER2PEER' - help: 'Migration flags to be set for live migration' - - - name: block_migration_flag - type: string - default: 'VIR_MIGRATE_UNDEFINE_SOURCE, VIR_MIGRATE_PEER2PEER, VIR_MIGRATE_NON_SHARED_INC' - help: 'Migration flags to be set for block migration' - - - name: live_migration_bandwidth - type: integer - default: 0 - help: 'Maximum bandwidth to be used during migration, in Mbps' - - - name: snapshot_image_format - type: string - default: ~ - help: 'Snapshot image format' - - - name: libvirt_vif_driver - type: string - default: 'nova.virt.libvirt.vif.LibvirtGenericVIFDriver' - help: 'The libvirt VIF driver to configure the VIFs.' - - - name: libvirt_volume_drivers - type: list - default: ['iscsinova.virt.libvirt.volume.LibvirtISCSIVolumeDriver', 'isernova.virt.libvirt.volume.LibvirtISERVolumeDriver', 'localnova.virt.libvirt.volume.LibvirtVolumeDriver', 'fakenova.virt.libvirt.volume.LibvirtFakeVolumeDriver', 'rbdnova.virt.libvirt.volume.LibvirtNetVolumeDriver', 'sheepdognova.virt.libvirt.volume.LibvirtNetVolumeDriver', 'nfsnova.virt.libvirt.volume.LibvirtNFSVolumeDriver', 'aoenova.virt.libvirt.volume.LibvirtAOEVolumeDriver', 'glusterfsnova.virt.libvirt.volume.LibvirtGlusterfsVolumeDriver', 'fibre_channelnova.virt.libvirt.volume.LibvirtFibreChannelVolumeDriver', 'scalitynova.virt.libvirt.volume.LibvirtScalityVolumeDriver'] - help: 'Libvirt handlers for remote volumes.' - - - name: libvirt_disk_prefix - type: string - default: ~ - help: 'Override the default disk prefix for the devices attached to a server, which is dependent on libvirt_type.' - - - name: libvirt_wait_soft_reboot_seconds - type: integer - default: 120 - help: 'Number of seconds to wait for instance to shut down after soft reboot request is made. We fall back to hard reboot if instance does not shutdown within this window.' - - - name: libvirt_nonblocking - type: boolean - default: true - help: 'Use a separated OS thread pool to realize non-blocking libvirt calls' - - - name: libvirt_cpu_mode - type: enum - type_args: {'values': ['host-model', 'host-passthrough', 'custom', 'none']} - default: ~ - help: "Set to 'host-model' to clone the host CPU feature flags; to 'host-passthrough' to use the host CPU model exactly; to 'custom' to use a named CPU model; to 'none' to not set any CPU model. If libvirt_type='kvm|qemu', it will default to 'host-model', otherwise it will default to 'none'" - - - name: libvirt_cpu_model - type: string - default: ~ - help: 'Set to a named libvirt CPU model' - - - name: libvirt_snapshots_directory - type: directory - default: '$instances_path/snapshots' - help: 'Location where libvirt driver will store snapshots before uploading them to image service' - - - name: xen_hvmloader_path - type: executable - default: '/usr/lib/xen/boot/hvmloader' - help: 'Location where the Xen hvmloader is kept' - comment: 'New param' - - - name: disk_cachemodes - type: list - default: [] - help: "Specific cachemodes to use for different disk types e.g: ['file=directsync','block=none']" - - - name: vcpu_pin_set - type: string - default: ~ - help: "Which pcpus can be used by vcpus of instance e.g: '4-12,^8,15'" - - - name: libvirt_images_type - type: string - default: 'default' - help: 'VM Images format. Acceptable values are: raw, qcow2, lvm,rbd, default. If default is specified, then use_cow_images flag is used instead of this one.' - - - name: libvirt_images_volume_group - type: string - default: ~ - help: 'LVM Volume Group that is used for VM images, when you specify libvirt_images_type=lvm.' - - - name: libvirt_sparse_logical_volumes - type: boolean - default: false - help: 'Create sparse logical volumes' - - - name: libvirt_lvm_snapshot_size - type: integer - default: 1000 - help: 'The amount of storage' - - - name: libvirt_images_rbd_pool - type: string - default: 'rbd' - help: 'the RADOS pool in which rbd volumes are stored' - - - name: libvirt_images_rbd_ceph_conf - type: file - default: '' - help: 'path to the ceph configuration file to use' - - - name: base_dir_name - type: string - default: '_base' - help: 'Where cached images are stored under $instances_path.This is NOT the full path - just a folder name.For per-compute-host cached images, set to _base_$my_ip' - - - name: image_info_filename_pattern - type: string - default: '$instances_path/$base_dir_name/%(image)s.info' - help: 'Allows image information files to be stored in non-standard locations' - - - name: remove_unused_base_images - type: boolean - default: true - help: 'Should unused base images be removed?' - - - name: remove_unused_kernels - type: boolean - default: false - help: 'Should unused kernel images be removed? This is only safe to enable if all compute nodes have been updated to support this option. This will enabled by default in future.' - - - name: remove_unused_resized_minimum_age_seconds - type: integer - default: 3600 - help: 'Unused resized base images younger than this will not be removed' - - - name: remove_unused_original_minimum_age_seconds - type: integer - default: 86400 - help: 'Unused unresized base images younger than this will not be removed' - - - name: checksum_base_images - type: boolean - default: false - help: 'Write a checksum for files in _base to disk' - - - name: checksum_interval_seconds - type: integer - default: 3600 - help: 'How frequently to checksum base images' - - - name: libvirt_snapshot_compression - type: boolean - default: false - help: 'Compress snapshot images when possible. This currently applies exclusively to qcow2 images' - - - name: libvirt_ovs_bridge - type: string - default: 'br-int' - help: 'Name of Integration Bridge used by Open vSwitch' - - - name: libvirt_use_virtio_for_bridges - type: boolean - default: true - help: 'Use virtio for bridge interfaces with KVM/QEMU' - - - name: num_iscsi_scan_tries - type: integer - default: 3 - help: 'number of times to rescan iSCSI target to find volume' - - - name: num_iser_scan_tries - type: integer - default: 3 - help: 'number of times to rescan iSER target to find volume' - - - name: rbd_user - type: string - default: ~ - help: 'the RADOS client name for accessing rbd volumes' - - - name: rbd_secret_uuid - type: string - default: ~ - help: 'the libvirt uuid of the secret for the rbd_uservolumes' - - - name: nfs_mount_point_base - type: directory - default: '$state_path/mnt' - help: 'Dir where the nfs volume is mounted on the compute node' - - - name: nfs_mount_options - type: string - default: ~ - help: 'Mount options passed to the nfs client. See section of the nfs man page for details' - - - name: num_aoe_discover_tries - type: integer - default: 3 - help: 'number of times to rediscover AoE target to find volume' - - - name: glusterfs_mount_point_base - type: directory - default: '$state_path/mnt' - help: 'Dir where the glusterfs volume is mounted on the compute node' - - - name: libvirt_iscsi_use_multipath - type: boolean - default: false - help: 'use multipath connection of the iSCSI volume' - - - name: libvirt_iser_use_multipath - type: boolean - default: false - help: 'use multipath connection of the iSER volume' - - - name: scality_sofs_config - type: string - default: ~ - help: 'Path or URL to Scality SOFS configuration file' - comment: 'New param' - - - name: scality_sofs_mount_point - type: directory - default: '$state_path/scality' - help: 'Base dir where Scality SOFS shall be mounted' - - - name: qemu_allowed_storage_drivers - type: list - default: [] - help: 'Protocols listed here will be accessed directly from QEMU. Currently supported protocols: [gluster]' - - - name: powervm_mgr_type - type: string - default: 'ivm' - help: 'PowerVM manager type' - - - name: powervm_mgr - type: string - default: ~ - help: 'PowerVM manager host or ip' - - - name: powervm_mgr_user - type: string - default: ~ - help: 'PowerVM manager user name' - - - name: powervm_mgr_passwd - type: string - default: ~ - help: 'PowerVM manager user password' - - - name: powervm_img_remote_path - type: directory - default: '/home/padmin' - help: 'PowerVM image remote path where images will be moved. Make sure this path can fit your biggest image in glance' - - - name: powervm_img_local_path - type: directory - default: '/tmp' - help: 'Local directory to download glance images to. Make sure this path can fit your biggest image in glance' - - - name: agent_timeout - type: integer - default: 30 - help: 'number of seconds to wait for agent reply' - - - name: agent_version_timeout - type: integer - default: 300 - help: 'number of seconds to wait for agent to be fully operational' - - - name: agent_resetnetwork_timeout - type: integer - default: 60 - help: 'number of seconds to wait for agent reply to resetnetwork request' - - - name: xenapi_agent_path - type: string - default: 'usr/sbin/xe-update-networking' - help: 'Specifies the path in which the xenapi guest agent should be located. If the agent is present, network configuration is not injected into the image. Used if compute_driver=xenapi.XenAPIDriver and flat_injected=True' - comment: 'New param' - - - name: xenapi_disable_agent - type: boolean - default: false - help: 'Disables the use of the XenAPI agent in any image regardless of what image properties are present. ' - - - name: xenapi_use_agent_default - type: boolean - default: false - help: "Determines if the xenapi agent should be used when the image used does not contain a hint to declare if the agent is present or not. The hint is a glance property 'xenapi_use_agent' that has the value 'true' or 'false'. Note that waiting for the agent when it is not present will significantly increase server boot times." - - - name: xenapi_connection_url - type: string - default: ~ - help: 'URL for connection to XenServer/Xen Cloud Platform. A special value of unix://local can be used to connect to the local unix socket. Required if compute_driver=xenapi.XenAPIDriver' - - - name: xenapi_connection_username - type: string - default: 'root' - help: 'Username for connection to XenServer/Xen Cloud Platform. Used only if compute_driver=xenapi.XenAPIDriver' - - - name: xenapi_connection_password - type: string - default: ~ - help: 'Password for connection to XenServer/Xen Cloud Platform. Used only if compute_driver=xenapi.XenAPIDriver' - - - name: xenapi_connection_concurrent - type: integer - default: 5 - help: 'Maximum number of concurrent XenAPI connections. Used only if compute_driver=xenapi.XenAPIDriver' - - - name: xenapi_vhd_coalesce_poll_interval - type: float - default: 5.0 - help: 'The interval used for polling of coalescing vhds. Used only if compute_driver=xenapi.XenAPIDriver' - - - name: xenapi_check_host - type: boolean - default: true - help: 'Ensure compute service is running on host XenAPI connects to.' - - - name: xenapi_vhd_coalesce_max_attempts - type: integer - default: 5 - help: 'Max number of times to poll for VHD to coalesce. Used only if compute_driver=xenapi.XenAPIDriver' - - - name: xenapi_sr_base_path - type: directory - default: '/var/run/sr-mount' - help: 'Base path to the storage repository' - - - name: target_host - type: host - default: ~ - help: 'iSCSI Target Host' - - - name: target_port - type: port - default: 3260 - help: 'iSCSI Target Port, 3260 Default' - - - name: iqn_prefix - type: string - default: 'iqn.2010-10.org.openstack' - help: 'IQN Prefix' - - - name: xenapi_remap_vbd_dev - type: boolean - default: false - help: 'Used to enable the remapping of VBD dev' - - - name: xenapi_remap_vbd_dev_prefix - type: string - default: 'sd' - help: 'Specify prefix to remap VBD dev to' - - - name: xenapi_login_timeout - type: integer - default: 10 - help: 'Timeout in seconds for XenAPI login.' - - - name: xenapi_torrent_base_url - type: string - default: ~ - help: 'Base URL for torrent files.' - - - name: xenapi_torrent_seed_chance - type: float - default: 1.0 - help: 'Probability that peer will become a seeder.' - - - name: xenapi_torrent_seed_duration - type: integer - default: 3600 - help: 'Number of seconds after downloading an image via BitTorrent that it should be seeded for other peers.' - - - name: xenapi_torrent_max_last_accessed - type: integer - default: 86400 - help: 'Cached torrent files not accessed within this number of seconds can be reaped' - - - name: xenapi_torrent_listen_port_start - type: port - default: 6881 - help: 'Beginning of port range to listen on' - - - name: xenapi_torrent_listen_port_end - type: port - default: 6891 - help: 'End of port range to listen on' - - - name: xenapi_torrent_download_stall_cutoff - type: integer - default: 600 - help: 'Number of seconds a download can remain at the same progress percentage w/o being considered a stall' - - - name: xenapi_torrent_max_seeder_processes_per_host - type: integer - default: true - help: 'Maximum number of seeder processes to run concurrently within a given dom0.' - - - name: use_join_force - type: boolean - default: true - help: 'To use for hosts with different CPUs' - - - name: xenapi_ovs_integration_bridge - type: string - default: 'xapi1' - help: 'Name of Integration Bridge used by Open vSwitch' - - - name: cache_images - type: string - default: 'all' - help: 'Cache glance images locally. `all` will cache all images, `some` will only cache images that have the image_property `cache_in_nova=True`, and `none` turns off caching entirely' - - - name: xenapi_image_compression_level - type: integer - default: ~ - help: 'Compression level for images, e.g., 9 for gzip -9. Range is 1-9, 9 being most compressed but most CPU intensive on dom0.' - - - name: default_os_type - type: string - default: 'linux' - help: 'Default OS type' - - - name: block_device_creation_timeout - type: integer - default: 10 - help: 'Time to wait for a block device to be created' - - - name: max_kernel_ramdisk_size - type: integer - default: 16777216 - help: 'Maximum size in bytes of kernel or ramdisk images' - - - name: sr_matching_filter - type: string - default: 'default-sr:true' - help: 'Filter for finding the SR to be used to install guest instances on. To use the Local Storage in default XenServer/XCP installations set this flag to other-config :i18n-key=local-storage. To select an SR with a different matching criteria, you could set it to other- config:my_favorite_sr=true. On the other hand, to fall back on the Default SR, as displayed by XenCenter, set this flag to: default-sr:true' - - - name: xenapi_sparse_copy - type: boolean - default: true - help: 'Whether to use sparse_copy for copying data on a resize down' - - - name: xenapi_num_vbd_unplug_retries - type: integer - default: 10 - help: 'Maximum number of retries to unplug VBD' - - - name: xenapi_torrent_images - type: string - default: 'none' - help: 'Whether or not to download images via Bit Torrent' - - - name: xenapi_ipxe_network_name - type: string - default: ~ - help: 'Name of network to use for booting iPXE ISOs' - - - name: xenapi_ipxe_boot_menu_url - type: string - default: ~ - help: 'URL to the iPXE boot menu' - - - name: xenapi_ipxe_mkisofs_cmd - type: string - default: 'mkisofs' - help: 'Name and optionally path of the tool used for ISO image creation' - - - name: xenapi_running_timeout - type: integer - default: 60 - help: 'number of seconds to wait for instance to go to running state' - - - name: xenapi_vif_driver - type: string - default: 'nova.virt.xenapi.vif.XenAPIBridgeDriver' - help: 'The XenAPI VIF driver using XenServer Network APIs.' - - - name: xenapi_image_upload_handler - type: string - default: 'nova.virt.xenapi.image.glance.GlanceStore' - help: 'Dom0 plugin driver used to handle image uploads.' - - - name: novncproxy_base_url - type: string - default: 'http://127.0.0.1:6080/vnc_auto.html' - help: "location of vnc console proxy, in the form 'http://127.0.0.1:6080/vnc_auto.html'" - - - name: xvpvncproxy_base_url - type: string - default: 'http://127.0.0.1:6081/console' - help: "location of nova xvp vnc console proxy, in the form 'http://127.0.0.1:6081/console'" - - - name: vncserver_listen - type: host - default: '127.0.0.1' - help: 'IP address on which instance vncservers should listen' - - - name: vncserver_proxyclient_address - type: host - default: '127.0.0.1' - help: 'the address to which proxy clients' - - - name: vnc_enabled - type: boolean - default: true - help: 'enable vnc related features' - - - name: vnc_keymap - type: string - default: 'en-us' - help: 'keymap for vnc' - - - name: xvpvncproxy_port - type: port - default: 6081 - help: 'Port that the XCP VNC proxy should bind to' - - - name: xvpvncproxy_host - type: host - default: '0.0.0.0' - help: 'Address that the XCP VNC proxy should bind to' - - - name: volume_api_class - type: string - default: 'nova.volume.cinder.API' - help: 'The full class name of the volume API class to use' - - - name: cinder_catalog_info - type: string - default: 'volume:cinder:publicURL' - help: 'Info to match when looking for cinder in the service catalog. Format is : separated values of the form: ::' - - - name: cinder_endpoint_template - type: string - default: ~ - help: 'Override service catalog lookup with template for cinder endpoint e.g. http://localhost:8776/v1/%(project_id)s' - - - name: os_region_name - type: string - default: ~ - help: 'region name of this node' - - - name: cinder_ca_certificates_file - type: file - default: ~ - help: 'Location of ca certicates file to use for cinder client requests.' - - - name: cinder_http_retries - type: integer - default: 3 - help: 'Number of cinderclient retries on failed http calls' - - - name: cinder_api_insecure - type: boolean - default: false - help: 'Allow to perform insecure SSL requests to cinder' - - - name: cinder_cross_az_attach - type: boolean - default: true - help: 'Allow attach between instance and volume in different availability zones.' - - - name: baremetal.sql_connection - type: string - default: 'sqlite:///$state_path/baremetal_$sqlite_db' - help: 'The SQLAlchemy connection string used to connect to the bare-metal database' - - - name: hyperv.instances_path_share - type: string - default: '' - help: "The name of a Windows share name mapped to the 'instances_path' dir and used by the resize feature to copy files to the target host. If left blank, an administrative share will be used, looking for the same 'instances_path' used locally" - - - name: hyperv.force_hyperv_utils_v1 - type: boolean - default: false - help: 'Force V1 WMI utility classes' - - - name: hyperv.force_volumeutils_v1 - type: boolean - default: false - help: 'Force V1 volume utility class' - - - name: hyperv.vswitch_name - type: string - default: ~ - help: 'External virtual switch Name, if not provided, the first external virtual switch is used' - - - name: hyperv.limit_cpu_features - type: boolean - default: false - help: 'Required for live migration among hosts with different CPU features' - - - name: hyperv.config_drive_inject_password - type: boolean - default: false - help: 'Sets the admin password in the config drive image' - - - name: hyperv.qemu_img_cmd - type: string - default: 'qemu-img.exe' - help: 'qemu-img is used to convert between different image types' - - - name: hyperv.config_drive_cdrom - type: boolean - default: false - help: 'Attaches the Config Drive image as a cdrom drive instead of a disk drive' - - - name: hyperv.enable_instance_metrics_collection - type: boolean - default: false - help: "Enables metrics collections for an instance by using Hyper-V's metric APIs. Collected data can by retrieved by other apps and services, e.g.: Ceilometer. Requires Hyper-V / Windows Server 2012 and above" - - - name: hyperv.dynamic_memory_ratio - type: float - default: true - help: 'Enables dynamic memory allocation' - - - name: hyperv.volume_attach_retry_count - type: integer - default: 10 - help: 'The number of times to retry to attach a volume' - - - name: hyperv.volume_attach_retry_interval - type: integer - default: 5 - help: 'Interval between volume attachment attempts, in seconds' - - - name: zookeeper.address - type: string - default: ~ - help: 'The ZooKeeper addresses for servicegroup service in the format of host1:port,host2:port,host3:port' - - - name: zookeeper.recv_timeout - type: integer - default: 4000 - help: 'recv_timeout parameter for the zk session' - - - name: zookeeper.sg_prefix - type: string - default: '/servicegroups' - help: 'The prefix used in ZooKeeper to store ephemeral nodes' - - - name: zookeeper.sg_retry_interval - type: integer - default: 5 - help: 'Number of seconds to wait until retrying to join the session' - - - name: spice.enabled - type: boolean - default: false - help: 'enable spice related features' - - - name: osapi_v3.extensions_blacklist - type: list - default: [] - help: 'A list of v3 API extensions to never load. Specify the extension aliases here.' - - - name: osapi_v3.extensions_whitelist - type: list - default: [] - help: 'If the list is not empty then a v3 API extension will only be loaded if it exists in this list. Specify the extension aliases here.' - - - name: conductor.use_local - type: boolean - default: false - help: 'Perform nova-conductor operations locally' - - - name: cells.topic - type: string - default: 'cells' - help: 'the topic cells nodes listen on' - - - name: cells.manager - type: string - default: 'nova.cells.manager.CellsManager' - help: 'Manager for cells' - - - name: conductor.workers - type: integer - default: ~ - help: 'Number of workers for OpenStack Conductor service' - - - name: keymgr.api_class - type: string - default: 'nova.keymgr.conf_key_mgr.ConfKeyManager' - help: 'The full class name of the key manager API class' - - - name: keymgr.fixed_key - type: string - default: ~ - help: 'Fixed key returned by key manager, specified in hex' - - - name: baremetal.driver - type: string - default: 'nova.virt.baremetal.pxe.PXE' - help: 'Baremetal driver back-end' - - - name: cells.instance_updated_at_threshold - type: integer - default: 3600 - help: 'Number of seconds after an instance was updated or deleted to continue to update cells' - - - name: cells.instance_update_num_instances - type: integer - default: true - help: 'Number of instances to update per periodic task run' - - - name: cells.max_hop_count - type: integer - default: 10 - help: 'Maximum number of hops for cells routing.' - - - name: upgrade_levels.scheduler - type: string - default: ~ - help: 'Set a version cap for messages sent to scheduler services' - - - name: cells.enable - type: boolean - default: false - help: 'Enable cell functionality' - - - name: cells.name - type: string - default: 'nova' - help: 'name of this cell' - - - name: cells.capabilities - type: list - default: ['hypervisorxenserver;kvm', 'oslinux;windows'] - help: 'Key/Multi-value list with the capabilities of the cell' - - - name: cells.call_timeout - type: integer - default: 60 - help: 'Seconds to wait for response from a call to a cell.' - - - name: cells.reserve_percent - type: float - default: 10.0 - help: 'Percentage of cell capacity to hold in reserve. Affects both memory and disk utilization' - - - name: cells.cell_type - type: enum - type_args: {'values': ['api', 'compute']} - default: ~ - help: 'Type of cell: api or compute' - - - name: cells.mute_child_interval - type: integer - default: 300 - help: 'Number of seconds after which a lack of capability and capacity updates signals the child cell is to be treated as a mute.' - - - name: cells.bandwidth_update_interval - type: integer - default: 600 - help: 'Seconds between bandwidth updates for cells.' - - - name: cells.rpc_driver_queue_base - type: string - default: 'cells.intercell' - help: 'Base queue name to use when communicating between cells. Various topics by message type will be appended to this.' - - - name: cells.scheduler_filter_classes - type: list - default: ['nova.cells.filters.all_filters'] - help: "Filter classes the cells scheduler should use. An entry of 'nova.cells.filters.all_filters' maps to all cells filters included with nova." - - - name: cells.scheduler_retries - type: integer - default: 10 - help: 'How many retries when no cells are available.' - - - name: cells.scheduler_retry_delay - type: integer - default: 2 - help: 'How often to retry in seconds when no cells are available.' - - - name: cells.db_check_interval - type: integer - default: 60 - help: 'Seconds between getting fresh cell info from db.' - - - name: cells.cells_config - type: file - default: ~ - help: 'Configuration file from which to read cells configuration. If given, overrides reading cells from the database.' - - - name: cells.mute_weight_multiplier - type: float - default: -10.0 - help: 'Multiplier used to weigh mute children. ' - - - name: cells.mute_weight_value - type: float - default: 1000.0 - help: 'Weight value assigned to mute children. ' - - - name: database.backend - type: string - default: 'sqlalchemy' - help: 'The backend to use for db' - - - name: database.use_tpool - type: boolean - default: false - help: 'Enable the experimental use of thread pooling for all DB API calls' - - - name: database.connection - type: string - default: 'sqlite:////nova/openstack/common/db/$sqlite_db' - help: 'The SQLAlchemy connection string used to connect to the database' - - - name: database.slave_connection - type: string - default: '' - help: 'The SQLAlchemy connection string used to connect to the slave database' - - - name: database.idle_timeout - type: integer - default: 3600 - help: 'timeout before idle sql connections are reaped' - - - name: database.min_pool_size - type: integer - default: 1 - help: 'Minimum number of SQL connections to keep open in a pool' - - - name: database.max_pool_size - type: integer - default: ~ - help: 'Maximum number of SQL connections to keep open in a pool' - - - name: database.max_retries - type: integer - default: 10 - help: 'maximum db connection retries during startup.' - - - name: database.retry_interval - type: integer - default: 10 - help: 'interval between retries of opening a sql connection' - - - name: database.max_overflow - type: integer - default: ~ - help: 'If set, use this value for max_overflow with sqlalchemy' - - - name: database.connection_debug - type: integer - default: 0 - help: 'Verbosity of SQL debugging information. 0=None, 100=Everything' - - - name: database.connection_trace - type: boolean - default: false - help: 'Add python stack traces to SQL as comment strings' - - - name: database.pool_timeout - type: integer - default: ~ - help: 'If set, use this value for pool_timeout with sqlalchemy' - - - name: image_file_url.filesystems - type: list - default: [] - help: 'A list of filesystems that will be configured in this file under the sections image_file_url:' - - - name: baremetal.db_backend - type: string - default: 'sqlalchemy' - help: 'The backend to use for bare-metal database' - - - name: baremetal.inject_password - type: boolean - default: true - help: 'Whether baremetal compute injects password or not' - - - name: baremetal.vif_driver - type: string - default: 'nova.virt.baremetal.vif_driver.BareMetalVIFDriver' - help: 'Baremetal VIF driver.' - - - name: baremetal.volume_driver - type: string - default: 'nova.virt.baremetal.volume_driver.LibvirtVolumeDriver' - help: 'Baremetal volume driver.' - - - name: baremetal.instance_type_extra_specs - type: list - default: [] - help: "a list of additional capabilities corresponding to instance_type_extra_specs for this compute host to advertise. Valid entries are name=value, pairsFor example, 'key1:val1, key2:val2'" - - - name: baremetal.power_manager - type: string - default: 'nova.virt.baremetal.ipmi.IPMI' - help: 'Baremetal power management method' - - - name: baremetal.tftp_root - type: directory - default: '/tftpboot' - help: "Baremetal compute node's tftp root path" - - - name: baremetal.terminal - type: executable - default: 'shellinaboxd' - help: 'path to baremetal terminal program' - - - name: baremetal.terminal_cert_dir - type: directory - default: ~ - help: 'path to baremetal terminal SSL cert(PEM)' - - - name: baremetal.terminal_pid_dir - type: directory - default: '$state_path/baremetal/console' - help: 'path to directory stores pidfiles of baremetal_terminal' - - - name: baremetal.ipmi_power_retry - type: integer - default: 5 - help: 'maximal number of retries for IPMI operations' - - - name: baremetal.deploy_kernel - type: string - default: ~ - help: 'Default kernel image ID used in deployment phase' - - - name: baremetal.deploy_ramdisk - type: string - default: ~ - help: 'Default ramdisk image ID used in deployment phase' - - - name: baremetal.net_config_template - type: file - default: '$pybasedir/nova/virt/baremetal/net-dhcp.ubuntu.template' - help: 'Template file for injected network config' - - - name: baremetal.pxe_append_params - type: string - default: ~ - help: 'additional append parameters for baremetal PXE boot' - - - name: baremetal.pxe_config_template - type: file - default: '$pybasedir/nova/virt/baremetal/pxe_config.template' - help: 'Template file for PXE configuration' - - - name: baremetal.pxe_deploy_timeout - type: integer - default: 0 - help: 'Timeout for PXE deployments. Default: 0' - - - name: baremetal.pxe_network_config - type: boolean - default: false - help: 'If set, pass the network configuration details to the initramfs via cmdline.' - - - name: baremetal.pxe_bootfile_name - type: string - default: 'pxelinux.0' - help: 'This gets passed to Neutron as the bootfile dhcp parameter when the dhcp_options_enabled is set.' - - - name: baremetal.tile_pdu_ip - type: host - default: '10.0.100.1' - help: 'ip address of tilera pdu' - - - name: baremetal.tile_pdu_mgr - type: string - default: '/tftpboot/pdu_mgr' - help: 'management script for tilera pdu' - - - name: baremetal.tile_pdu_off - type: integer - default: 2 - help: 'power status of tilera PDU is OFF' - - - name: baremetal.tile_pdu_on - type: integer - default: 1 - help: 'power status of tilera PDU is ON' - - - name: baremetal.tile_pdu_status - type: integer - default: 9 - help: 'power status of tilera PDU' - - - name: baremetal.tile_power_wait - type: integer - default: 9 - help: 'wait time in seconds until check the result after tilera power operations' - - - name: baremetal.virtual_power_ssh_host - type: host - default: '' - help: 'ip or name to virtual power host' - - - name: baremetal.virtual_power_ssh_port - type: port - default: 22 - help: 'Port to use for ssh to virtual power host' - - - name: baremetal.virtual_power_type - type: enum - type_args: {'values': ['vbox', 'virsh']} - default: 'virsh' - help: 'base command to use for virtual power(vbox,virsh)' - - - name: baremetal.virtual_power_host_user - type: string - default: '' - help: 'user to execute virtual power commands as' - - - name: baremetal.virtual_power_host_pass - type: string - default: '' - help: 'password for virtual power host_user' - - - name: baremetal.virtual_power_host_key - type: file - default: ~ - help: 'ssh key for virtual power host_user' - - - name: baremetal.use_unsafe_iscsi - type: boolean - default: false - help: 'Do not set this out of dev/test environments. If a node does not have a fixed PXE IP address, volumes are exported with globally opened ACL' - - - name: baremetal.iscsi_iqn_prefix - type: string - default: 'iqn.2010-10.org.openstack.baremetal' - help: 'iSCSI IQN prefix used in baremetal volume connections.' - - - name: rpc_notifier2.topics - type: list - default: ['notifications'] - help: 'AMQP topic(s) used for OpenStack notifications' - - - name: matchmaker_redis.port - type: port - default: 6379 - help: 'Use this port to connect to redis host.' - - - name: matchmaker_redis.password - type: string - default: ~ - help: 'Password for Redis server.' - - - name: ssl.cert_file - type: file - default: ~ - help: 'Certificate file to use when starting the server securely' - - - name: trusted_computing.attestation_server - type: string - default: ~ - help: 'attestation server http' - - - name: trusted_computing.attestation_server_ca_file - type: file - default: ~ - help: 'attestation server Cert file for Identity verification' - - - name: trusted_computing.attestation_port - type: port - default: 8443 - help: 'attestation server port' - - - name: trusted_computing.attestation_api_url - type: string - default: '/OpenAttestationWebServices/V1.0' - help: 'attestation web API URL' - - - name: trusted_computing.attestation_auth_blob - type: string - default: ~ - help: 'attestation authorization blob - must change' - - - name: trusted_computing.attestation_auth_timeout - type: integer - default: 60 - help: 'Attestation status cache valid period length' - - - name: upgrade_levels.baseapi - type: string - default: ~ - help: 'Set a version cap for messages sent to the base api in any service' - - - name: upgrade_levels.intercell - type: string - default: ~ - help: 'Set a version cap for messages sent between cells services' - - - name: upgrade_levels.cells - type: string - default: ~ - help: 'Set a version cap for messages sent to local cells services' - - - name: upgrade_levels.compute - type: string - default: ~ - help: 'Set a version cap for messages sent to compute services' - - - name: upgrade_levels.conductor - type: string - default: ~ - help: 'Set a version cap for messages sent to conductor services' - - - name: upgrade_levels.console - type: string - default: ~ - help: 'Set a version cap for messages sent to console services' - - - name: upgrade_levels.consoleauth - type: string - default: ~ - help: 'Set a version cap for messages sent to consoleauth services' - - - name: upgrade_levels.network - type: string - default: ~ - help: 'Set a version cap for messages sent to network services' - - - name: matchmaker_ring.ringfile - type: file - default: '/etc/oslo/matchmaker_ring.json' - help: 'Matchmaker ring file' - - - name: vmware.host_ip - type: host - default: ~ - help: 'URL for connection to VMware ESX/VC host. Required if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver.' - - - name: vmware.host_username - type: string - default: ~ - help: 'Username for connection to VMware ESX/VC host. Used only if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver.' - - - name: vmware.host_password - type: string - default: ~ - help: 'Password for connection to VMware ESX/VC host. Used only if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver.' - - - name: vmware.cluster_name - type: multi - default: ~ - help: 'Name of a VMware Cluster ComputeResource. Used only if compute_driver is vmwareapi.VMwareVCDriver.' - - - name: vmware.datastore_regex - type: regex - default: ~ - help: 'Regex to match the name of a datastore. Used only if compute_driver is vmwareapi.VMwareVCDriver.' - - - name: vmware.task_poll_interval - type: float - default: 5.0 - help: 'The interval used for polling of remote tasks. Used only if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver.' - - - name: vmware.api_retry_count - type: integer - default: 10 - help: 'The number of times we retry on failures, e.g., socket error, etc. Used only if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver.' - - - name: vmware.vnc_port - type: port - default: 5900 - help: 'VNC starting port' - comment: 'New param' - - - name: vmware.vnc_port_total - type: integer - default: 10000 - help: 'Total number of VNC ports' - - - name: vmware.vnc_password - type: string - default: ~ - help: 'VNC password' - - - name: vmware.use_linked_clone - type: boolean - default: true - help: 'Whether to use linked clone' - - - name: vmware.wsdl_location - type: string - default: ~ - help: 'Optional VIM Service WSDL Location e.g http:///vimService.wsdl. Optional over-ride to default location for bug work-arounds' - - - name: vmware.maximum_objects - type: integer - default: 100 - help: 'The maximum number of ObjectContent data objects that should be returned in a single result. A positive value will cause the operation to suspend the retrieval when the count of objects reaches the specified maximum. The server may still limit the count to something less than the configured value. Any remaining objects may be retrieved with additional requests.' - - - name: vmware.integration_bridge - type: string - default: 'br-int' - help: 'Name of Integration Bridge' - - - name: spice.html5proxy_base_url - type: string - default: 'http://127.0.0.1:6082/spice_auto.html' - help: "location of spice html5 console proxy, in the form 'http://127.0.0.1:6082/spice_auto.html'" - - - name: spice.server_listen - type: host - default: '127.0.0.1' - help: 'IP address on which instance spice server should listen' - - - name: spice.server_proxyclient_address - type: host - default: '127.0.0.1' - help: 'the address to which proxy clients' - - - name: spice.agent_enabled - type: boolean - default: true - help: 'enable spice guest agent support' - - - name: 'filter:authtoken.keymap' - type: host - default: '127.0.0.1' - help: 'keymap for spice' - -# ==================================================== - -- version: '2013.1.4' - added: - - - name: ca_file - type: file - default: 'cacert.pem' - help: 'Filename of root CA' - - - name: key_file - type: file - default: 'private/cakey.pem' - help: 'Filename of private key' - - - name: host - type: string - default: 'nova' - help: 'Name of this node. This can be an opaque identifier. It is not necessarily a hostname, FQDN, or IP address. However, the node name must be valid within an AMQP key, and if using ZeroMQ, a valid hostname, FQDN, or IP address' - - - name: notify_on_any_change - type: boolean - default: false - help: 'If set, send compute.instance.update notifications on instance state changes. Valid values are False for no notifications, True for notifications on any instance changes.' - - - name: bindir - type: directory - default: '$pybasedir/bin' - help: 'Directory where nova binaries are installed' - comment: 'Default value has changed' - - - name: monkey_patch_modules - type: list - default: ['nova.api.ec2.cloud:nova.openstack.common.notifier.api.notify_decorator', 'nova.compute.api:nova.openstack.common.notifier.api.notify_decorator'] - help: 'List of modules/decorators to monkey patch' - comment: 'Default value has changed' - - - name: api_rate_limit - type: boolean - default: true - help: 'whether to rate limit the api' - comment: 'Default value has changed' - - - name: service_quantum_metadata_proxy - type: boolean - default: false - help: 'Set flag to indicate Quantum will proxy metadata requests and resolve instance ids.' - - - name: quantum_metadata_proxy_shared_secret - type: string - default: '' - help: 'Shared secret to validate proxies Quantum metadata requests' - - - name: osapi_hide_server_address_states - type: list - default: ['building'] - help: 'List of instance states that should hide network info' - comment: 'Default value has changed' - - - name: enable_network_quota - type: boolean - default: false - help: 'Enables or disables quotaing of tenant networks' - comment: 'Help string has changed' - - - name: use_quantum_default_nets - type: boolean - default: false - help: 'Control for checking for default networks' - - - name: quantum_default_tenant_id - type: string - default: 'default' - help: 'Default tenant id when creating quantum networks' - - - name: vpn_instance_type - type: string - default: 'm1.tiny' - help: 'Instance type for vpn instances' - - - name: default_instance_type - type: string - default: 'm1.small' - help: 'default instance type to use, testing only' - - - name: s3_host - type: host - default: '$my_ip' - help: 'hostname or ip for openstack to use when accessing the s3 api' - comment: 'Help string has changed' - - - name: iptables_top_regex - type: regex - default: '' - help: 'Regular expression to match iptables rule that shouldalways be on the top.' - comment: 'Help string has changed' - - - name: iptables_bottom_regex - type: regex - default: '' - help: 'Regular expression to match iptables rule that shouldalways be on the bottom.' - - - name: vlan_interface - type: string - default: ~ - help: 'vlans will bridge into this interface if set' - - - name: fixed_range - type: network - default: '10.0.0.0/8' - help: 'Fixed IP address block' - comment: 'Default value has changed' - - - name: force_dhcp_release - type: boolean - default: false - help: 'If True, send a dhcp release on instance termination' - comment: 'Default value has changed' - - - name: share_dhcp_address - type: boolean - default: false - help: 'If True in multi_host mode, all compute hosts share the same dhcp address.' - comment: 'Help string has changed' - - - name: quantum_url - type: string - default: 'http://127.0.0.1:9696' - help: 'URL for connecting to quantum' - - - name: quantum_url_timeout - type: integer - default: 30 - help: 'timeout value for connecting to quantum in seconds' - - - name: quantum_admin_username - type: string - default: ~ - help: 'username for connecting to quantum in admin context' - - - name: quantum_admin_password - type: string - default: ~ - help: 'password for connecting to quantum in admin context' - - - name: quantum_admin_tenant_name - type: string - default: ~ - help: 'tenant name for connecting to quantum in admin context' - - - name: quantum_region_name - type: string - default: ~ - help: 'region name for connecting to quantum in admin context' - - - name: quantum_admin_auth_url - type: string - default: 'http://localhost:5000/v2.0' - help: 'auth url for connecting to quantum in admin context' - - - name: quantum_api_insecure - type: boolean - default: false - help: 'if set, ignore any SSL validation issues' - - - name: quantum_auth_strategy - type: string - default: 'keystone' - help: 'auth strategy for connecting to quantum in admin context' - - - name: quantum_ovs_bridge - type: string - default: 'br-int' - help: 'Name of Integration Bridge used by Open vSwitch' - - - name: quantum_extension_sync_interval - type: integer - default: 600 - help: 'Number of seconds before querying quantum for extensions' - - - name: security_group_handler - type: string - default: 'nova.network.sg.NullSecurityGroupHandler' - help: 'The full class name of the security group handler class' - - - name: queues - type: multi - default: '' - help: 'Queues to delete' - - - name: delete_exchange - type: boolean - default: false - help: 'delete nova exchange too.' - - - name: cert - type: file - default: 'self.pem' - help: 'SSL certificate file' - - - name: web - type: executable - default: '/usr/share/novnc' - help: 'Run webserver on same port. Serve files from DIR.' - comment: 'Default value has changed' - - - name: dbapi_use_tpool - type: boolean - default: false - help: 'Enable the experimental use of thread pooling for all DB API calls' - - - name: sql_idle_timeout - type: integer - default: 3600 - help: 'timeout before idle sql connections are reaped' - - - name: sqlite_synchronous - type: boolean - default: true - help: 'If passed, use synchronous mode for sqlite' - comment: 'Help string has changed' - - - name: sql_min_pool_size - type: integer - default: true - help: 'Minimum number of SQL connections to keep open in a pool' - - - name: sql_max_pool_size - type: integer - default: 5 - help: 'Maximum number of SQL connections to keep open in a pool' - - - name: sql_max_retries - type: integer - default: 10 - help: 'maximum db connection retries during startup.' - - - name: sql_retry_interval - type: integer - default: 10 - help: 'interval between retries of opening a sql connection' - - - name: sql_max_overflow - type: integer - default: ~ - help: 'If set, use this value for max_overflow with sqlalchemy' - - - name: sql_connection_debug - type: integer - default: false - help: 'Verbosity of SQL debugging information. 0=None, 100=Everything' - - - name: sql_connection_trace - type: boolean - default: false - help: 'Add python stack traces to SQL as comment strings' - - - name: backdoor_port - type: port - default: ~ - help: 'port for eventlet backdoor to listen' - comment: 'Type has changed' - - - name: lock_path - type: directory - default: ~ - help: 'Directory to use for lock files. Default to a temp directory' - comment: 'Help string has changed' - - - name: logfile_mode - type: file_mode - default: 420 - help: 'Default file mode used when creating log files' - - - name: logging_context_format_string - type: string - default: '%(asctime)s.%(msecs)03d %(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' - comment: 'Default value has changed' - - - name: default_log_levels - type: list - default: ['amqplib=WARN', 'sqlalchemy=WARN', 'boto=WARN', 'suds=INFO', 'keystone=INFO', 'eventlet.wsgi.server=WARN'] - help: 'list of logger=LEVEL pairs' - comment: 'Default value has changed' - - - name: log_format - type: string - default: '%(asctime)s %(levelname)8s [%(name)s] %(message)s' - help: 'A logging.Formatter log message format string which may use any of the available logging.LogRecord attributes. Default: %(default)s' - comment: 'Default value has changed' - - - name: log_file - type: file - default: ~ - help: '(Optional) Name of log file to output to. If not set, logging will go to stdout.' - comment: 'Help string has changed' - - - name: log_dir - type: directory - default: ~ - help: '(Optional) The directory to keep log files in' - comment: 'Help string has changed' - - - name: default_publisher_id - type: string - default: '$host' - help: 'Default publisher_id for outgoing notifications' - comment: 'Default value has changed' - - - name: allowed_rpc_exception_modules - type: list - default: ['nova.openstack.common.exception', 'nova.exception', 'cinder.exception,exceptions'] - help: 'Modules of exceptions that are permitted to be recreatedupon receiving exception data from an rpc call.' - comment: 'Default value has changed' - - - name: amqp_rpc_single_reply_queue - type: boolean - default: false - help: 'Enable a fast single reply queue if using AMQP based RPC like RabbitMQ or Qpid.' - - - name: rabbit_durable_queues - type: boolean - default: false - help: 'use durable queues in RabbitMQ' - - - name: rpc_zmq_host - type: string - default: 'sorcha' - help: "Name of this node. Must be a valid hostname, FQDN, or IP address. Must match 'host' option, if running Nova." - comment: 'Default value has changed' - - - name: matchmaker_ringfile - type: file - default: '/etc/nova/matchmaker_ring.json' - help: 'Matchmaker ring file' - - - name: cpu_allocation_ratio - type: float - default: 16.0 - help: 'Virtual CPU to Physical CPU allocation ratio' - comment: 'Help string has changed' - - - name: ram_allocation_ratio - type: float - default: 1.5 - help: 'virtual ram to physical ram allocation ratio' - comment: 'Help string has changed' - - - name: scheduler_default_filters - type: list - default: ['RetryFilter', 'AvailabilityZoneFilter', 'RamFilter', 'ComputeFilter', 'ComputeCapabilitiesFilter', 'ImagePropertiesFilter'] - help: 'Which filter class names to use for filtering hosts when not specified in the request.' - comment: 'Default value has changed' - - - name: scheduler_weight_classes - type: list - default: ['nova.scheduler.weights.all_weighers'] - help: 'Which weight class names to use for weighing hosts' - - - name: compute_scheduler_driver - type: string - default: 'nova.scheduler.filter_scheduler.FilterScheduler' - help: 'Driver to use for scheduling compute calls' - - - name: default_scheduler_driver - type: string - default: 'nova.scheduler.chance.ChanceScheduler' - help: 'Default driver to use for scheduling calls' - - - name: least_cost_functions - type: list - default: ~ - help: 'Which cost functions the LeastCostScheduler should use' - - - name: noop_cost_fn_weight - type: float - default: 1.0 - help: 'How much weight to give the noop cost function' - - - name: compute_fill_first_cost_fn_weight - type: float - default: ~ - help: 'How much weight to give the fill-first cost function. A negative value will reverse behavior: e.g. spread-first' - - - name: ram_weight_multiplier - type: float - default: 1.0 - help: 'Multiplier used for weighing ram. Negative numbers mean to stack vs spread.' - - - name: compute_driver - type: string - default: ~ - help: 'Driver to use for controlling virtualization. Options include: libvirt.LibvirtDriver, xenapi.XenAPIDriver, fake.FakeDriver, baremetal.BareMetalDriver, vmwareapi.VMWareESXDriver' - comment: 'Help string has changed' - - - name: vswitch_name - type: string - default: ~ - help: 'External virtual switch Name, if not provided, the first external virtual switch is used' - - - name: limit_cpu_features - type: boolean - default: false - help: 'Required for live migration among hosts with different CPU features' - - - name: config_drive_inject_password - type: boolean - default: false - help: 'Sets the admin password in the config drive image' - - - name: qemu_img_cmd - type: string - default: 'qemu-img.exe' - help: 'qemu-img is used to convert between different image types' - - - name: config_drive_cdrom - type: boolean - default: false - help: 'Attaches the Config Drive image as a cdrom drive instead of a disk drive' - - - name: hyperv_attaching_volume_retry_count - type: integer - default: 10 - help: 'The number of times we retry on attaching volume ' - - - name: hyperv_wait_between_attach_retry - type: integer - default: 5 - help: 'The seconds to wait between an volume attachment attempt' - - - name: force_volumeutils_v1 - type: boolean - default: false - help: 'Force volumeutils v1' - - - name: libvirt_volume_drivers - type: list - default: ['iscsinova.virt.libvirt.volume.LibvirtISCSIVolumeDriver', 'localnova.virt.libvirt.volume.LibvirtVolumeDriver', 'fakenova.virt.libvirt.volume.LibvirtFakeVolumeDriver', 'rbdnova.virt.libvirt.volume.LibvirtNetVolumeDriver', 'sheepdognova.virt.libvirt.volume.LibvirtNetVolumeDriver', 'nfsnova.virt.libvirt.volume.LibvirtNFSVolumeDriver', 'aoenova.virt.libvirt.volume.LibvirtAOEVolumeDriver', 'glusterfsnova.virt.libvirt.volume.LibvirtGlusterfsVolumeDriver', 'fibre_channelnova.virt.libvirt.volume.LibvirtFibreChannelVolumeDriver', 'scalitynova.virt.libvirt.volume.LibvirtScalityVolumeDriver'] - help: 'Libvirt handlers for remote volumes.' - comment: 'Default value has changed' - - - name: libvirt_images_type - type: string - default: 'default' - help: 'VM Images format. Acceptable values are: raw, qcow2, lvm, default. If default is specified, then use_cow_images flag is used instead of this one.' - comment: 'Help string has changed' - - - name: vmwareapi_host_ip - type: host - default: ~ - help: 'URL for connection to VMware ESX/VC host. Required if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver.' - - - name: vmwareapi_host_username - type: string - default: ~ - help: 'Username for connection to VMware ESX/VC host. Used only if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver.' - - - name: vmwareapi_host_password - type: string - default: ~ - help: 'Password for connection to VMware ESX/VC host. Used only if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver.' - - - name: vmwareapi_cluster_name - type: string - default: ~ - help: 'Name of a VMware Cluster ComputeResource. Used only if compute_driver is vmwareapi.VMwareVCDriver.' - - - name: vmwareapi_task_poll_interval - type: float - default: 5.0 - help: 'The interval used for polling of remote tasks. Used only if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver.' - - - name: vmwareapi_api_retry_count - type: integer - default: 10 - help: 'The number of times we retry on failures, e.g., socket error, etc. Used only if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver.' - - - name: vnc_port - type: port - default: 5900 - help: 'VNC starting port' - - - name: vnc_port_total - type: integer - default: 10000 - help: 'Total number of VNC ports' - - - name: vnc_password - type: string - default: ~ - help: 'VNC password' - - - name: use_linked_clone - type: boolean - default: true - help: 'Whether to use linked clone' - - - name: vmwareapi_vlan_interface - type: string - default: 'vmnic0' - help: 'Physical ethernet adapter name for vlan networking' - - - name: vmwareapi_wsdl_loc - type: string - default: ~ - help: 'Optional VIM Service WSDL Location e.g http:///vimService.wsdl' - - - name: xenapi_disable_agent - type: boolean - default: false - help: 'Disable XenAPI agent. Reduces the amount of time it takes nova to detect that a VM has started, when that VM does not have the agent installed' - comment: 'Help string has changed' - - - name: xenapi_connection_url - type: string - default: ~ - help: 'URL for connection to XenServer/Xen Cloud Platform. Required if compute_driver=xenapi.XenAPIDriver' - comment: 'Help string has changed' - - - name: sr_matching_filter - type: string - default: 'other-config:i18n-keylocal-storage' - help: 'Filter for finding the SR to be used to install guest instances on. The default value is the Local Storage in default XenServer/XCP installations. To select an SR with a different matching criteria, you could set it to other- config:my_favorite_sr=true. On the other hand, to fall back on the Default SR, as displayed by XenCenter, set this flag to: default-sr:true' - comment: 'Default value has changed' - - - name: xenapi_image_upload_handler - type: string - default: 'nova.virt.xenapi.imageupload.glance.GlanceStore' - help: 'Object Store Driver used to handle image uploads.' - comment: 'Default value has changed' - - - name: HYPERV.instances_path_share - type: string - default: '' - help: "The name of a Windows share name mapped to the 'instances_path' dir and used by the resize feature to copy files to the target host. If left blank, an administrative share will be used, looking for the same 'instances_path' used locally" - - - name: cells.scheduler - type: string - default: 'nova.cells.scheduler.CellsScheduler' - help: 'Cells scheduler to use' - - - name: baremetal.virtual_power_type - type: enum - type_args: {'values': ['vbox', 'virsh']} - default: 'vbox' - help: 'base command to use for virtual power(vbox,virsh)' - comment: 'Default value has changed' - - - name: spice.keymap - type: string - default: 'en-us' - help: 'keymap for spice' - - removed: - - ssl.ca_file - - ssl.key_file - - matchmaker_redis.host - - quota_fixed_ips - - vendordata_driver - - service_neutron_metadata_proxy - - neutron_metadata_proxy_shared_secret - - vendordata_jsonfile_path - - use_neutron_default_nets - - neutron_default_tenant_id - - vpn_flavor - - upgrade_levels.cert - - spicehtml5proxy_host - - spicehtml5proxy_port - - allow_migrate_to_same_host - - max_local_block_devices - - default_flavor - - network_allocate_retries - - maximum_instance_delete_attempts - - sync_power_state_interval - - shelved_poll_interval - - shelved_offload_time - - instance_delete_interval - - migrate_max_retries - - iptables_drop_action - - vmware.vlan_interface - - neutron_url - - neutron_url_timeout - - neutron_admin_username - - neutron_admin_password - - neutron_admin_tenant_name - - neutron_region_name - - neutron_admin_auth_url - - neutron_api_insecure - - neutron_auth_strategy - - neutron_ovs_bridge - - neutron_extension_sync_interval - - neutron_ca_certificates_file - - dhcp_options_enabled - - amqp_durable_queues - - amqp_auto_delete - - qpid_topology_version - - matchmaker_heartbeat_freq - - matchmaker_heartbeat_ttl - - pci_alias - - pci_passthrough_whitelist - - restrict_isolated_hosts_to_isolated_images - - cells.scheduler_weight_classes - - cells.ram_weight_multiplier - - resize_fs_using_block_device - - docker_registry_default_port - - vcpu_pin_set - - libvirt_images_rbd_pool - - libvirt_images_rbd_ceph_conf - - num_iser_scan_tries - - libvirt_iser_use_multipath - - qemu_allowed_storage_drivers - - xenapi_use_agent_default - - xenapi_image_compression_level - - xenapi_ipxe_network_name - - xenapi_ipxe_boot_menu_url - - xenapi_ipxe_mkisofs_cmd - - cinder_ca_certificates_file - - hyperv.instances_path_share - - hyperv.force_hyperv_utils_v1 - - hyperv.force_volumeutils_v1 - - hyperv.vswitch_name - - hyperv.limit_cpu_features - - hyperv.config_drive_inject_password - - hyperv.qemu_img_cmd - - hyperv.config_drive_cdrom - - hyperv.enable_instance_metrics_collection - - hyperv.dynamic_memory_ratio - - hyperv.volume_attach_retry_count - - hyperv.volume_attach_retry_interval - - osapi_v3.extensions_blacklist - - osapi_v3.extensions_whitelist - - conductor.workers - - keymgr.api_class - - keymgr.fixed_key - - upgrade_levels.scheduler - - cells.reserve_percent - - cells.cell_type - - cells.mute_child_interval - - cells.bandwidth_update_interval - - cells.scheduler_filter_classes - - cells.cells_config - - cells.mute_weight_multiplier - - cells.mute_weight_value - - database.backend - - database.use_tpool - - database.connection - - database.slave_connection - - database.idle_timeout - - database.min_pool_size - - database.max_pool_size - - database.max_retries - - database.retry_interval - - database.max_overflow - - database.connection_debug - - database.connection_trace - - database.pool_timeout - - image_file_url.filesystems - - baremetal.pxe_network_config - - baremetal.pxe_bootfile_name - - baremetal.tile_pdu_ip - - baremetal.tile_pdu_mgr - - baremetal.tile_pdu_off - - baremetal.tile_pdu_on - - baremetal.tile_pdu_status - - baremetal.tile_power_wait - - baremetal.virtual_power_ssh_port - - baremetal.virtual_power_host_key - - matchmaker_redis.port - - matchmaker_redis.password - - ssl.cert_file - - upgrade_levels.baseapi - - upgrade_levels.intercell - - upgrade_levels.cells - - upgrade_levels.compute - - upgrade_levels.conductor - - upgrade_levels.console - - upgrade_levels.consoleauth - - upgrade_levels.network - - matchmaker_ring.ringfile - - vmware.host_ip - - vmware.host_username - - vmware.host_password - - vmware.cluster_name - - vmware.datastore_regex - - vmware.task_poll_interval - - vmware.api_retry_count - - vmware.vnc_port - - vmware.vnc_port_total - - vmware.vnc_password - - vmware.use_linked_clone - - vmware.wsdl_location - - vmware.maximum_objects - - 'filter:authtoken.keymap' - -# ==================================================== - -- version: '2013.2.0' - checkpoint: true - added: - - - name: internal_service_availability_zone - type: string - default: 'internal' - help: 'availability_zone to show internal services under ' - comment: 'Help string has changed' - - - name: default_availability_zone - type: string - default: 'nova' - help: 'default compute node availability_zone ' - comment: 'Help string has changed' - - - name: crl_file - type: file - default: 'crl.pem' - help: 'Filename of root Certificate Revocation List ' - comment: 'Help string has changed' - - - name: keys_path - type: directory - default: '$state_path/keys' - help: 'Where we keep our keys ' - comment: 'Help string has changed' - - - name: ca_path - type: string - default: '$state_path/CA' - help: 'Where we keep our root CA ' - comment: 'Help string has changed' - - - name: use_project_ca - type: boolean - default: false - help: 'Should we use a CA for each project? ' - comment: 'Help string has changed' - - - name: user_cert_subject - type: string - default: '/C=US/ST=California/O=OpenStack/OU=NovaDev/CN=%.16s-%.16s-%s' - help: 'Subject for certificate for users, %s for project, user, timestamp ' - comment: 'Default value has changed' - - - name: project_cert_subject - type: string - default: '/C=US/ST=California/O=OpenStack/OU=NovaDev/CN=project-ca-%.16s-%s' - help: 'Subject for certificate for projects, %s for project, timestamp ' - comment: 'Default value has changed' - - - name: fatal_exception_format_errors - type: boolean - default: false - help: 'make exception message format errors fatal ' - comment: 'Help string has changed' - - - name: my_ip - type: string - default: '10.0.0.1' - help: 'ip address of this host ' - comment: 'Help string has changed' - - - name: use_ipv6 - type: boolean - default: false - help: 'use ipv6 ' - comment: 'Help string has changed' - - - name: notify_on_state_change - type: string - default: ~ - help: "If set, send compute.instance.update notifications on instance state changes. Valid values are None for no notifications, 'vm_state' for notifications on VM state changes, or 'vm_and_task_state' for notifications on VM and task state changes. " - comment: 'Help string has changed' - - - name: notify_api_faults - type: boolean - default: false - help: 'If set, send api.fault notifications on caught exceptions in the API service. ' - comment: 'Help string has changed' - - - name: pybasedir - type: string - default: '/usr/lib/python/site-packages' - help: 'Directory where the nova python module is installed ' - comment: 'Help string has changed' - - - name: bindir - type: string - default: '/usr/local/bin' - help: 'Directory where nova binaries are installed ' - comment: 'Default value has changed' - - - name: state_path - type: string - default: '$pybasedir' - help: "Top-level directory for maintaining nova's state " - comment: 'Help string has changed' - - - name: policy_file - type: string - default: 'policy.json' - help: 'JSON file representing policy ' - comment: 'Help string has changed' - - - name: policy_default_rule - type: string - default: 'default' - help: 'Rule checked when requested rule is not found ' - comment: 'Help string has changed' - - - name: quota_instances - type: integer - default: 10 - help: 'number of instances allowed per project ' - comment: 'Help string has changed' - - - name: quota_cores - type: integer - default: 20 - help: 'number of instance cores allowed per project ' - comment: 'Help string has changed' - - - name: quota_ram - type: integer - default: 51200 - help: 'megabytes of instance ram allowed per project ' - comment: 'Help string has changed' - - - name: quota_floating_ips - type: integer - default: 10 - help: 'number of floating ips allowed per project ' - comment: 'Help string has changed' - - - name: quota_metadata_items - type: integer - default: 128 - help: 'number of metadata items allowed per instance ' - comment: 'Help string has changed' - - - name: quota_injected_files - type: integer - default: 5 - help: 'number of injected files allowed ' - comment: 'Help string has changed' - - - name: quota_injected_file_content_bytes - type: integer - default: 10240 - help: 'number of bytes allowed per injected file ' - comment: 'Help string has changed' - - - name: quota_injected_file_path_bytes - type: integer - default: 255 - help: 'number of bytes allowed per injected file path ' - comment: 'Help string has changed' - - - name: quota_security_groups - type: integer - default: 10 - help: 'number of security groups per project ' - comment: 'Help string has changed' - - - name: quota_security_group_rules - type: integer - default: 20 - help: 'number of security rules per security group ' - comment: 'Help string has changed' - - - name: quota_key_pairs - type: integer - default: 100 - help: 'number of key pairs per user ' - comment: 'Help string has changed' - - - name: reservation_expire - type: integer - default: 86400 - help: 'number of seconds until a reservation expires ' - comment: 'Help string has changed' - - - name: until_refresh - type: integer - default: false - help: 'count of reservations until usage is refreshed ' - comment: 'Help string has changed' - - - name: max_age - type: integer - default: false - help: 'number of seconds between subsequent usage refreshes ' - comment: 'Help string has changed' - - - name: quota_driver - type: string - default: 'nova.quota.DbQuotaDriver' - help: 'default driver to use for quota checks ' - comment: 'Help string has changed' - - - name: report_interval - type: integer - default: 10 - help: 'seconds between nodes reporting state to datastore ' - comment: 'Help string has changed' - - - name: periodic_enable - type: boolean - default: true - help: 'enable periodic tasks ' - comment: 'Help string has changed' - - - name: periodic_fuzzy_delay - type: integer - default: 60 - help: 'range of seconds to randomly delay when starting the periodic task scheduler to reduce stampeding. (Disable by setting to 0) ' - comment: 'Help string has changed' - - - name: enabled_apis - type: string_list - default: ['ec2', 'osapi_compute', 'metadata'] - help: 'a list of APIs to enable by default ' - comment: 'Type has changed' - - - name: enabled_ssl_apis - type: string_list - default: [] - help: 'a list of APIs with enabled SSL ' - comment: 'Type has changed' - - - name: ec2_listen - type: host - default: '0.0.0.0' - help: 'IP address for EC2 API to listen ' - comment: 'Type has changed' - - - name: ec2_listen_port - type: port - default: 8773 - help: 'port for ec2 api to listen ' - comment: 'Help string has changed' - - - name: ec2_workers - type: integer - default: ~ - help: 'Number of workers for EC2 API service ' - comment: 'Help string has changed' - - - name: osapi_compute_listen - type: host - default: '0.0.0.0' - help: 'IP address for OpenStack API to listen ' - comment: 'Type has changed' - - - name: osapi_compute_listen_port - type: port - default: 8774 - help: 'list port for osapi compute ' - comment: 'Help string has changed' - - - name: osapi_compute_workers - type: integer - default: ~ - help: 'Number of workers for OpenStack API service ' - comment: 'Help string has changed' - - - name: metadata_manager - type: string - default: 'nova.api.manager.MetadataManager' - help: 'OpenStack metadata service manager ' - comment: 'Help string has changed' - - - name: metadata_listen - type: host - default: '0.0.0.0' - help: 'IP address for metadata api to listen ' - comment: 'Type has changed' - - - name: metadata_listen_port - type: port - default: 8775 - help: 'port for metadata api to listen ' - comment: 'Help string has changed' - - - name: metadata_workers - type: integer - default: ~ - help: 'Number of workers for metadata service ' - comment: 'Help string has changed' - - - name: compute_manager - type: string - default: 'nova.compute.manager.ComputeManager' - help: 'full class name for the Manager for compute ' - comment: 'Help string has changed' - - - name: console_manager - type: string - default: 'nova.console.manager.ConsoleProxyManager' - help: 'full class name for the Manager for console proxy ' - comment: 'Help string has changed' - - - name: cert_manager - type: string - default: 'nova.cert.manager.CertManager' - help: 'full class name for the Manager for cert ' - comment: 'Help string has changed' - - - name: network_manager - type: string - default: 'nova.network.manager.VlanManager' - help: 'full class name for the Manager for network ' - comment: 'Help string has changed' - - - name: scheduler_manager - type: string - default: 'nova.scheduler.manager.SchedulerManager' - help: 'full class name for the Manager for scheduler ' - comment: 'Help string has changed' - - - name: service_down_time - type: integer - default: 60 - help: 'maximum time since last check-in for up service ' - comment: 'Help string has changed' - - - name: sqlite_clean_db - type: string - default: 'clean.sqlite' - help: 'File name of clean sqlite db ' - comment: 'Help string has changed' - - - name: monkey_patch - type: boolean - default: false - help: 'Whether to log monkey patching ' - comment: 'Help string has changed' - - - name: monkey_patch_modules - type: string_list - default: ['nova.api.ec2.cloud:nova.notifications.notify_decorator', 'nova.compute.api:nova.notifications.notify_decorator'] - help: 'List of modules/decorators to monkey patch ' - comment: 'Type has changed' - - - name: password_length - type: integer - default: 12 - help: 'Length of generated instance admin passwords ' - comment: 'Help string has changed' - - - name: instance_usage_audit_period - type: string - default: 'month' - help: 'time period to generate instance usages for. Time period must be hour, day, month or year ' - comment: 'Help string has changed' - - - name: rootwrap_config - type: string - default: '/etc/nova/rootwrap.conf' - help: 'Path to the rootwrap configuration file to use for running commands as root ' - comment: 'Help string has changed' - - - name: tempdir - type: string - default: ~ - help: 'Explicitly specify the temporary working directory ' - comment: 'Help string has changed' - - - name: api_paste_config - type: string - default: 'api-paste.ini' - help: 'File name for the paste.deploy config for nova-api ' - comment: 'Help string has changed' - - - name: wsgi_log_format - type: string - default: '%(client_ip)s "%(request_line)s" status: %(status_code)s len: %(body_length)s time: %(wall_seconds).7f' - help: 'A python format string that is used as the template to generate log lines. The following values can be formatted into it: client_ip, date_time, request_line, status_code, body_length, wall_seconds. ' - comment: 'Help string has changed' - - - name: ssl_ca_file - type: string - default: ~ - help: 'CA certificate file to use to verify connecting clients ' - comment: 'Help string has changed' - - - name: ssl_cert_file - type: string - default: ~ - help: 'SSL certificate of API server ' - comment: 'Help string has changed' - - - name: ssl_key_file - type: string - default: ~ - help: 'SSL private key of API server ' - comment: 'Help string has changed' - - - name: tcp_keepidle - type: integer - default: 600 - help: 'Sets the value of TCP_KEEPIDLE in seconds for each server socket. Not supported on OS X. ' - comment: 'Help string has changed' - - - name: api_rate_limit - type: boolean - default: false - help: 'whether to use per-user rate limiting for the api. ' - comment: 'Default value has changed' - - - name: auth_strategy - type: string - default: 'noauth' - help: 'The strategy to use for auth: noauth or keystone. ' - comment: 'Help string has changed' - - - name: use_forwarded_for - type: boolean - default: false - help: 'Treat X-Forwarded-For as the canonical remote address. Only enable this if you have a sanitizing proxy. ' - comment: 'Help string has changed' - - - name: lockout_attempts - type: integer - default: 5 - help: 'Number of failed auths before lockout. ' - comment: 'Help string has changed' - - - name: lockout_minutes - type: integer - default: 15 - help: 'Number of minutes to lockout if triggered. ' - comment: 'Help string has changed' - - - name: lockout_window - type: integer - default: 15 - help: 'Number of minutes for lockout window. ' - comment: 'Help string has changed' - - - name: keystone_ec2_url - type: string - default: 'http://localhost:5000/v2.0/ec2tokens' - help: 'URL to get token from ec2 request. ' - comment: 'Help string has changed' - - - name: ec2_private_dns_show_ip - type: boolean - default: false - help: 'Return the IP address as private dns hostname in describe instances ' - comment: 'Help string has changed' - - - name: ec2_strict_validation - type: boolean - default: true - help: 'Validate security group names according to EC2 specification ' - comment: 'Help string has changed' - - - name: ec2_timestamp_expiry - type: integer - default: 300 - help: 'Time in seconds before ec2 timestamp expires ' - comment: 'Help string has changed' - - - name: ec2_host - type: host - default: '$my_ip' - help: 'the ip of the ec2 api server ' - comment: 'Help string has changed' - - - name: ec2_dmz_host - type: host - default: '$my_ip' - help: 'the internal ip of the ec2 api server ' - comment: 'Help string has changed' - - - name: ec2_port - type: port - default: 8773 - help: 'the port of the ec2 api server ' - comment: 'Help string has changed' - - - name: ec2_scheme - type: string - default: 'http' - help: 'the protocol to use when connecting to the ec2 api server (http, https) ' - comment: 'Help string has changed' - - - name: ec2_path - type: string - default: '/services/Cloud' - help: 'the path prefix used to call the ec2 api server ' - comment: 'Help string has changed' - - - name: region_list - type: string_list - default: [] - help: 'list of region=fqdn pairs separated by commas ' - comment: 'Type has changed' - - - name: config_drive_skip_versions - type: string - default: '1.0 2007-01-19 2007-03-01 2007-08-29 2007-10-10 2007-12-15 2008-02-01 2008-09-01' - help: 'List of metadata versions to skip placing into the config drive ' - comment: 'Help string has changed' - - - name: osapi_max_limit - type: integer - default: 1000 - help: 'the maximum number of items returned in a single response from a collection resource ' - comment: 'Help string has changed' - - - name: osapi_compute_link_prefix - type: string - default: ~ - help: 'Base URL that will be presented to users in links to the OpenStack Compute API ' - comment: 'Help string has changed' - - - name: osapi_glance_link_prefix - type: string - default: ~ - help: 'Base URL that will be presented to users in links to glance resources ' - comment: 'Help string has changed' - - - name: allow_instance_snapshots - type: boolean - default: true - help: 'Permit instance snapshot operations. ' - comment: 'Help string has changed' - - - name: osapi_compute_ext_list - type: string_list - default: [] - help: 'Specify list of extensions to load when using osapi_compute_extension option with nova.api.openstack.compute.contrib.select_extensions ' - comment: 'Type has changed' - - - name: fping_path - type: string - default: '/usr/sbin/fping' - help: 'Full path to fping. ' - comment: 'Help string has changed' - - - name: enable_network_quota - type: boolean - default: false - help: 'Enables or disables quota checking for tenant networks ' - comment: 'Help string has changed' - - - name: osapi_compute_extension - type: string - default: 'nova.api.openstack.compute.contrib.standard_extensions' - help: 'osapi compute extension to load (multi valued)' - comment: 'Type has changed' - - - name: osapi_hide_server_address_states - type: string_list - default: ['building'] - help: 'List of instance states that should hide network info ' - comment: 'Type has changed' - - - name: enable_instance_password - type: boolean - default: true - help: 'Allows use of instance password during server creation ' - comment: 'Help string has changed' - - - name: osapi_max_request_body_size - type: integer - default: 114688 - help: 'the maximum body size per each osapi request(bytes) ' - comment: 'Help string has changed' - - - name: compute_api_class - type: string - default: 'nova.compute.api.API' - help: 'The full class name of the compute API class to use (deprecated) ' - comment: 'Help string has changed' - - - name: cert_topic - type: string - default: 'cert' - help: 'the topic cert nodes listen on ' - comment: 'Help string has changed' - - - name: vpn_image_id - type: string - default: '0' - help: 'image id used when starting up a cloudpipe vpn server ' - comment: 'Help string has changed' - - - name: boot_script_template - type: string - default: '$pybasedir/nova/cloudpipe/bootscript.template' - help: 'Template for cloudpipe instance boot script ' - comment: 'Help string has changed' - - - name: dmz_net - type: network - default: '10.0.0.0' - help: 'Network to push into openvpn config ' - comment: 'Help string has changed' - - - name: dmz_mask - type: network_mask - default: '255.255.255.0' - help: 'Netmask to push into openvpn config ' - comment: 'Help string has changed' - - - name: vpn_key_suffix - type: string - default: '-vpn' - help: 'Suffix to add to project name for vpn key and secgroups ' - comment: 'Help string has changed' - - - name: record - type: boolean - default: false - help: 'Record sessions to FILE.[session_number] ' - comment: 'Help string has changed' - - - name: daemon - type: boolean - default: false - help: 'Become a daemon (background process) ' - comment: 'Help string has changed' - - - name: ssl_only - type: boolean - default: false - help: 'Disallow non-encrypted connections ' - comment: 'Help string has changed' - - - name: source_is_ipv6 - type: boolean - default: false - help: 'Source is ipv6 ' - comment: 'Help string has changed' - - - name: key - type: string - default: ~ - help: 'SSL key file (if separate from cert) ' - comment: 'Help string has changed' - - - name: web - type: string - default: '/usr/share/spice-html5' - help: 'Run webserver on same port. Serve files from DIR. ' - comment: 'Default value has changed' - - - name: novncproxy_host - type: host - default: '0.0.0.0' - help: 'Host on which to listen for incoming requests ' - comment: 'Type has changed' - - - name: novncproxy_port - type: port - default: 6080 - help: 'Port on which to listen for incoming requests ' - comment: 'Help string has changed' - - - name: allow_resize_to_same_host - type: boolean - default: false - help: 'Allow destination machine to match source for resize. Useful when testing in single-host environments. ' - comment: 'Help string has changed' - - - name: default_schedule_zone - type: string - default: ~ - help: "availability zone to use when user doesn't specify one " - comment: 'Help string has changed' - - - name: non_inheritable_image_properties - type: string_list - default: ['cache_in_nova', 'bittorrent'] - help: 'These are image properties which a snapshot should not inherit from an instance ' - comment: 'Type has changed' - - - name: null_kernel - type: string - default: 'nokernel' - help: 'kernel image that indicates not to use a kernel, but to use a raw disk image instead ' - comment: 'Help string has changed' - - - name: multi_instance_display_name_template - type: string - default: '%(name)s-%(uuid)s' - help: "When creating multiple instances with a single request using the os-multiple-create API extension, this template will be used to build the display name for each instance. The benefit is that the instances end up with different hostnames. To restore legacy behavior of every instance having the same name, set this option to '%(name)s'. Valid keys for the template are: name, uuid, count. " - comment: 'Help string has changed' - - - name: console_host - type: string - default: 'nova' - help: 'Console proxy host to use to connect to instances on this host. ' - comment: 'Help string has changed' - - - name: default_access_ip_network_name - type: string - default: ~ - help: 'Name of network to use to set access ips for instances ' - comment: 'Help string has changed' - - - name: defer_iptables_apply - type: boolean - default: false - help: 'Whether to batch up the application of IPTables rules during a host restart and apply all at the end of the init phase ' - comment: 'Help string has changed' - - - name: instances_path - type: string - default: '$state_path/instances' - help: 'where instances are stored on disk ' - comment: 'Help string has changed' - - - name: instance_usage_audit - type: boolean - default: false - help: 'Generate periodic compute.instance.exists notifications ' - comment: 'Help string has changed' - - - name: live_migration_retry_count - type: integer - default: 30 - help: 'Number of 1 second retries needed in live_migration ' - comment: 'Help string has changed' - - - name: resume_guests_state_on_host_boot - type: boolean - default: false - help: 'Whether to start guests that were running before the host rebooted ' - comment: 'Help string has changed' - - - name: bandwidth_poll_interval - type: integer - default: 600 - help: 'interval to pull bandwidth usage info ' - comment: 'Help string has changed' - - - name: heal_instance_info_cache_interval - type: integer - default: 60 - help: 'Number of seconds between instance info_cache self healing updates ' - comment: 'Help string has changed' - - - name: host_state_interval - type: integer - default: 120 - help: 'Interval in seconds for querying the host status ' - comment: 'Help string has changed' - - - name: image_cache_manager_interval - type: integer - default: 2400 - help: 'Number of seconds to wait between runs of the image cache manager ' - comment: 'Help string has changed' - - - name: reclaim_instance_interval - type: integer - default: false - help: 'Interval in seconds for reclaiming deleted instances ' - comment: 'Help string has changed' - - - name: volume_usage_poll_interval - type: integer - default: false - help: 'Interval in seconds for gathering volume usages ' - comment: 'Help string has changed' - - - name: running_deleted_instance_action - type: string - default: 'log' - help: "Action to take if a running deleted instance is detected.Valid options are 'noop', 'log' and 'reap'. Set to 'noop' to disable. " - comment: 'Help string has changed' - - - name: running_deleted_instance_poll_interval - type: integer - default: 1800 - help: 'Number of seconds to wait between runs of the cleanup task. ' - comment: 'Help string has changed' - - - name: running_deleted_instance_timeout - type: integer - default: false - help: 'Number of seconds after being deleted when a running instance should be considered eligible for cleanup. ' - comment: 'Help string has changed' - - - name: reboot_timeout - type: integer - default: false - help: 'Automatically hard reboot an instance if it has been stuck in a rebooting state longer than N seconds. Set to 0 to disable. ' - comment: 'Help string has changed' - - - name: instance_build_timeout - type: integer - default: false - help: 'Amount of time in seconds an instance can be in BUILD before going into ERROR status.Set to 0 to disable. ' - comment: 'Help string has changed' - - - name: rescue_timeout - type: integer - default: false - help: 'Automatically unrescue an instance after N seconds. Set to 0 to disable. ' - comment: 'Help string has changed' - - - name: resize_confirm_window - type: integer - default: false - help: 'Automatically confirm resizes after N seconds. Set to 0 to disable. ' - comment: 'Help string has changed' - - - name: reserved_host_disk_mb - type: integer - default: false - help: 'Amount of disk in MB to reserve for the host ' - comment: 'Help string has changed' - - - name: reserved_host_memory_mb - type: integer - default: 512 - help: 'Amount of memory in MB to reserve for the host ' - comment: 'Help string has changed' - - - name: compute_stats_class - type: string - default: 'nova.compute.stats.Stats' - help: 'Class that will manage stats for the local compute host ' - comment: 'Help string has changed' - - - name: compute_topic - type: string - default: 'compute' - help: 'the topic compute nodes listen on ' - comment: 'Help string has changed' - - - name: console_driver - type: string - default: 'nova.console.xvp.XVPConsoleProxy' - help: 'Driver to use for the console proxy ' - comment: 'Help string has changed' - - - name: stub_compute - type: boolean - default: false - help: 'Stub calls to compute worker for tests ' - comment: 'Help string has changed' - - - name: console_public_hostname - type: string - default: 'nova' - help: 'Publicly visible name for this console host ' - comment: 'Help string has changed' - - - name: console_topic - type: string - default: 'console' - help: 'the topic console proxy nodes listen on ' - comment: 'Help string has changed' - - - name: console_vmrc_port - type: port - default: 443 - help: 'port for VMware VMRC connections ' - comment: 'Help string has changed' - - - name: console_vmrc_error_retries - type: integer - default: 10 - help: 'number of retries for retrieving VMRC information ' - comment: 'Help string has changed' - - - name: console_xvp_conf_template - type: string - default: '$pybasedir/nova/console/xvp.conf.template' - help: 'XVP conf template ' - comment: 'Help string has changed' - - - name: console_xvp_conf - type: string - default: '/etc/xvp.conf' - help: 'generated XVP conf file ' - comment: 'Help string has changed' - - - name: console_xvp_pid - type: string - default: '/var/run/xvp.pid' - help: 'XVP master process pid file ' - comment: 'Help string has changed' - - - name: console_xvp_log - type: string - default: '/var/log/xvp.log' - help: 'XVP log file ' - comment: 'Help string has changed' - - - name: console_xvp_multiplex_port - type: port - default: 5900 - help: 'port for XVP to multiplex VNC connections on ' - comment: 'Help string has changed' - - - name: consoleauth_topic - type: string - default: 'consoleauth' - help: 'the topic console auth proxy nodes listen on ' - comment: 'Help string has changed' - - - name: console_token_ttl - type: integer - default: 600 - help: 'How many seconds before deleting tokens ' - comment: 'Help string has changed' - - - name: consoleauth_manager - type: string - default: 'nova.consoleauth.manager.ConsoleAuthManager' - help: 'Manager for console auth ' - comment: 'Help string has changed' - - - name: enable_new_services - type: boolean - default: true - help: 'Services to be added to the available pool on create ' - comment: 'Help string has changed' - - - name: instance_name_template - type: string - default: 'instance-%08x' - help: 'Template string to be used to generate instance names ' - comment: 'Help string has changed' - - - name: snapshot_name_template - type: string - default: 'snapshot-%s' - help: 'Template string to be used to generate snapshot names ' - comment: 'Help string has changed' - - - name: db_driver - type: string - default: 'nova.db' - help: 'driver to use for database access ' - comment: 'Help string has changed' - - - name: osapi_compute_unique_server_name_scope - type: string - default: '' - help: "When set, compute API will consider duplicate hostnames invalid within the specified scope, regardless of case. Should be empty, 'project' or 'global'. " - comment: 'Help string has changed' - - - name: glance_host - type: string - default: '$my_ip' - help: 'default glance hostname or ip ' - comment: 'Help string has changed' - - - name: glance_port - type: port - default: 9292 - help: 'default glance port ' - comment: 'Help string has changed' - - - name: glance_protocol - type: string - default: 'http' - help: 'Default protocol to use when connecting to glance. Set to https for SSL. ' - comment: 'Help string has changed' - - - name: glance_api_servers - type: string_list - default: ['$glance_host:$glance_port'] - help: 'A list of the glance api servers available to nova. Prefix with https:// for ssl-based glance api servers. ([hostname|ip]:port) ' - comment: 'Type has changed' - - - name: glance_api_insecure - type: boolean - default: false - help: 'Allow to perform insecure SSL (https) requests to glance ' - comment: 'Help string has changed' - - - name: glance_num_retries - type: integer - default: false - help: 'Number retries when downloading an image from glance ' - comment: 'Help string has changed' - - - name: allowed_direct_url_schemes - type: string_list - default: [] - help: 'A list of url scheme that can be downloaded directly via the direct_url. Currently supported schemes: [file]. ' - comment: 'Type has changed' - - - name: image_decryption_dir - type: string - default: '/tmp' - help: 'parent dir for tempdir used for image decryption ' - comment: 'Help string has changed' - - - name: s3_host - type: string - default: '$my_ip' - help: 'hostname or ip for OpenStack to use when accessing the s3 api ' - comment: 'Help string has changed' - - - name: s3_port - type: port - default: 3333 - help: 'port used when accessing the s3 api ' - comment: 'Help string has changed' - - - name: s3_access_key - type: string - default: 'notchecked' - help: 'access key to use for s3 server for images ' - comment: 'Help string has changed' - - - name: s3_secret_key - type: string - default: 'notchecked' - help: 'secret key to use for s3 server for images ' - comment: 'Help string has changed' - - - name: s3_use_ssl - type: boolean - default: false - help: 'whether to use ssl when talking to s3 ' - comment: 'Help string has changed' - - - name: s3_affix_tenant - type: boolean - default: false - help: 'whether to affix the tenant id to the access key when downloading from s3 ' - comment: 'Help string has changed' - - - name: ipv6_backend - type: string - default: 'rfc2462' - help: 'Backend to use for IPv6 generation ' - comment: 'Help string has changed' - - - name: network_api_class - type: string - default: 'nova.network.api.API' - help: 'The full class name of the network API class to use ' - comment: 'Help string has changed' - - - name: network_driver - type: string - default: 'nova.network.linux_net' - help: 'Driver to use for network creation ' - comment: 'Help string has changed' - - - name: default_floating_pool - type: string - default: 'nova' - help: 'Default pool for floating ips ' - comment: 'Help string has changed' - - - name: auto_assign_floating_ip - type: boolean - default: false - help: 'Autoassigning floating ip to VM ' - comment: 'Help string has changed' - - - name: floating_ip_dns_manager - type: string - default: 'nova.network.noop_dns_driver.NoopDNSDriver' - help: 'full class name for the DNS Manager for floating IPs ' - comment: 'Help string has changed' - - - name: instance_dns_manager - type: string - default: 'nova.network.noop_dns_driver.NoopDNSDriver' - help: 'full class name for the DNS Manager for instance IPs ' - comment: 'Help string has changed' - - - name: instance_dns_domain - type: string - default: '' - help: 'full class name for the DNS Zone for instance IPs ' - comment: 'Help string has changed' - - - name: ldap_dns_url - type: string - default: 'ldap://ldap.example.com:389' - help: 'URL for ldap server which will store dns entries ' - comment: 'Help string has changed' - - - name: ldap_dns_user - type: string - default: 'uid=admin,ou=people,dc=example,dc=org' - help: 'user for ldap DNS ' - comment: 'Default value has changed' - - - name: ldap_dns_password - type: string - default: 'password' - help: 'password for ldap DNS ' - comment: 'Help string has changed' - - - name: ldap_dns_soa_hostmaster - type: string - default: 'hostmaster@example.org' - help: 'Hostmaster for ldap dns driver Statement of Authority ' - comment: 'Help string has changed' - - - name: ldap_dns_servers - type: string - default: 'dns.example.org' - help: 'DNS Servers for ldap dns driver (multi valued)' - comment: 'Type has changed' - - - name: ldap_dns_base_dn - type: string - default: 'ou=hosts,dc=example,dc=org' - help: 'Base DN for DNS entries in ldap ' - comment: 'Default value has changed' - - - name: ldap_dns_soa_refresh - type: string - default: '1800' - help: 'Refresh interval (in seconds) for ldap dns driver Statement of Authority ' - comment: 'Type has changed' - - - name: ldap_dns_soa_retry - type: string - default: '3600' - help: 'Retry interval (in seconds) for ldap dns driver Statement of Authority ' - comment: 'Type has changed' - - - name: ldap_dns_soa_expiry - type: string - default: '86400' - help: 'Expiry interval (in seconds) for ldap dns driver Statement of Authority ' - comment: 'Type has changed' - - - name: ldap_dns_soa_minimum - type: string - default: '7200' - help: 'Minimum interval (in seconds) for ldap dns driver Statement of Authority ' - comment: 'Type has changed' - - - name: dhcpbridge_flagfile - type: string - default: '/etc/nova/nova-dhcpbridge.conf' - help: 'location of flagfiles for dhcpbridge (multi valued)' - comment: 'Type has changed' - - - name: networks_path - type: string - default: '$state_path/networks' - help: 'Location to keep network config files ' - comment: 'Help string has changed' - - - name: public_interface - type: string - default: 'eth0' - help: 'Interface for public IP addresses ' - comment: 'Help string has changed' - - - name: network_device_mtu - type: string - default: ~ - help: 'MTU setting for vlan ' - comment: 'Help string has changed' - - - name: dhcpbridge - type: string - default: '$bindir/nova-dhcpbridge' - help: 'location of nova-dhcpbridge ' - comment: 'Help string has changed' - - - name: routing_source_ip - type: string - default: '$my_ip' - help: 'Public IP of network host ' - comment: 'Help string has changed' - - - name: dhcp_lease_time - type: integer - default: 120 - help: 'Lifetime of a DHCP lease in seconds ' - comment: 'Help string has changed' - - - name: dns_server - type: string - default: '' - help: 'if set, uses specific dns server for dnsmasq. Canbe specified multiple times. (multi valued)' - comment: 'Type has changed' - - - name: use_network_dns_servers - type: boolean - default: false - help: 'if set, uses the dns1 and dns2 from the network ref.as dns servers. ' - comment: 'Help string has changed' - - - name: dmz_cidr - type: string_list - default: [] - help: 'A list of dmz range that should be accepted ' - comment: 'Type has changed' - - - name: force_snat_range - type: string - default: '' - help: 'Traffic to this range will always be snatted to the fallback ip, even if it would normally be bridged out of the node. Can be specified multiple times. (multi valued)' - comment: 'Type has changed' - - - name: dnsmasq_config_file - type: string - default: '' - help: 'Override the default dnsmasq settings with this file ' - comment: 'Help string has changed' - - - name: linuxnet_interface_driver - type: string - default: 'nova.network.linux_net.LinuxBridgeInterfaceDriver' - help: 'Driver used to create ethernet devices. ' - comment: 'Help string has changed' - - - name: linuxnet_ovs_integration_bridge - type: string - default: 'br-int' - help: 'Name of Open vSwitch bridge used with linuxnet ' - comment: 'Help string has changed' - - - name: send_arp_for_ha - type: boolean - default: false - help: 'send gratuitous ARPs for HA setup ' - comment: 'Help string has changed' - - - name: send_arp_for_ha_count - type: integer - default: 3 - help: 'send this many gratuitous ARPs for HA setup ' - comment: 'Help string has changed' - - - name: use_single_default_gateway - type: boolean - default: false - help: 'Use single default gateway. Only first nic of vm will get default gateway from dhcp server ' - comment: 'Help string has changed' - - - name: forward_bridge_interface - type: string - default: 'all' - help: 'An interface that bridges can forward to. If this is set to all then all traffic will be forwarded. Can be specified multiple times. (multi valued)' - comment: 'Type has changed' - - - name: metadata_host - type: string - default: '$my_ip' - help: 'the ip for the metadata api server ' - comment: 'Help string has changed' - - - name: metadata_port - type: port - default: 8775 - help: 'the port for the metadata api port ' - comment: 'Help string has changed' - - - name: iptables_top_regex - type: string - default: '' - help: 'Regular expression to match iptables rule that should always be on the top. ' - comment: 'Help string has changed' - - - name: iptables_bottom_regex - type: string - default: '' - help: 'Regular expression to match iptables rule that should always be on the bottom. ' - comment: 'Help string has changed' - - - name: flat_network_bridge - type: string - default: ~ - help: 'Bridge for simple network instances ' - comment: 'Help string has changed' - - - name: flat_network_dns - type: string - default: '8.8.4.4' - help: 'Dns for simple network ' - comment: 'Help string has changed' - - - name: flat_injected - type: boolean - default: false - help: 'Whether to attempt to inject network setup into guest ' - comment: 'Help string has changed' - - - name: flat_interface - type: string - default: ~ - help: 'FlatDhcp will bridge into this interface if set ' - comment: 'Help string has changed' - - - name: vlan_start - type: integer - default: 100 - help: 'First VLAN for private networks ' - comment: 'Help string has changed' - - - name: num_networks - type: integer - default: true - help: 'Number of networks to support ' - comment: 'Help string has changed' - - - name: vpn_ip - type: string - default: '$my_ip' - help: 'Public IP for the cloudpipe VPN servers ' - comment: 'Help string has changed' - - - name: vpn_start - type: integer - default: 1000 - help: 'First Vpn port for private networks ' - comment: 'Help string has changed' - - - name: network_size - type: integer - default: 256 - help: 'Number of addresses in each private subnet ' - comment: 'Help string has changed' - - - name: fixed_range_v6 - type: string - default: 'fd00::/48' - help: 'Fixed IPv6 address block ' - comment: 'Help string has changed' - - - name: gateway - type: string - default: ~ - help: 'Default IPv4 gateway ' - comment: 'Help string has changed' - - - name: gateway_v6 - type: string - default: ~ - help: 'Default IPv6 gateway ' - comment: 'Help string has changed' - - - name: cnt_vpn_clients - type: integer - default: false - help: 'Number of addresses reserved for vpn clients ' - comment: 'Help string has changed' - - - name: fixed_ip_disassociate_timeout - type: integer - default: 600 - help: 'Seconds after which a deallocated ip is disassociated ' - comment: 'Help string has changed' - - - name: create_unique_mac_address_attempts - type: integer - default: 5 - help: 'Number of attempts to create unique mac address ' - comment: 'Help string has changed' - - - name: fake_network - type: boolean - default: false - help: 'If passed, use fake network devices and addresses ' - comment: 'Help string has changed' - - - name: fake_call - type: boolean - default: false - help: 'If True, skip using the queue and make local calls ' - comment: 'Help string has changed' - - - name: teardown_unused_network_gateway - type: boolean - default: false - help: 'If True, unused gateway devices (VLAN and bridge) are deleted in VLAN network mode with multi hosted networks ' - comment: 'Help string has changed' - - - name: force_dhcp_release - type: boolean - default: true - help: 'If True, send a dhcp release on instance termination ' - comment: 'Default value has changed' - - - name: share_dhcp_address - type: boolean - default: false - help: 'If True in multi_host mode, all compute hosts share the same dhcp address. The same IP address used for DHCP will be added on each nova-network node which is only visible to the vms on the same host. ' - comment: 'Help string has changed' - - - name: update_dns_entries - type: boolean - default: false - help: 'If True, when a DNS entry must be updated, it sends a fanout cast to all network hosts to update their DNS entries in multi host mode ' - comment: 'Help string has changed' - - - name: dns_update_periodic_interval - type: integer - default: -1 - help: 'Number of seconds to wait between runs of updates to DNS entries. ' - comment: 'Help string has changed' - - - name: dhcp_domain - type: string - default: 'novalocal' - help: 'domain to use for building the hostnames ' - comment: 'Help string has changed' - - - name: l3_lib - type: string - default: 'nova.network.l3.LinuxNetL3' - help: 'Indicates underlying L3 management library ' - comment: 'Help string has changed' - - - name: network_topic - type: string - default: 'network' - help: 'the topic network nodes listen on ' - comment: 'Help string has changed' - - - name: multi_host - type: boolean - default: false - help: 'Default value for multi_host in networks. Also, if set, some rpc network calls will be sent directly to host. ' - comment: 'Help string has changed' - - - name: security_group_api - type: string - default: 'nova' - help: 'The full class name of the security API class ' - comment: 'Help string has changed' - - - name: buckets_path - type: string - default: '$state_path/buckets' - help: 'path to s3 buckets ' - comment: 'Help string has changed' - - - name: s3_listen - type: host - default: '0.0.0.0' - help: 'IP address for S3 API to listen ' - comment: 'Type has changed' - - - name: s3_listen_port - type: port - default: 3333 - help: 'port for s3 api to listen ' - comment: 'Help string has changed' - - - name: sqlite_db - type: string - default: 'nova.sqlite' - help: 'the filename to use with sqlite ' - comment: 'Help string has changed' - - - name: sqlite_synchronous - type: boolean - default: true - help: 'If true, use synchronous mode for sqlite ' - comment: 'Help string has changed' - - - name: backdoor_port - type: string - default: ~ - help: "Enable eventlet backdoor. Acceptable values are 0, and :, where 0 results in listening on a random tcp port number, results in listening on the specified port number and not enabling backdoorif it is in use and : results in listening on the smallest unused port number within the specified range of port numbers. The chosen port is displayed in the service's log file. " - comment: 'Type has changed' - - - name: disable_process_locking - type: boolean - default: false - help: 'Whether to disable inter-process locks ' - comment: 'Help string has changed' - - - name: lock_path - type: string - default: ~ - help: 'Directory to use for lock files. ' - comment: 'Help string has changed' - - - name: debug - type: boolean - default: false - help: 'Print debugging output (set logging level to DEBUG instead of default WARNING level). ' - comment: 'Help string has changed' - - - name: verbose - type: boolean - default: false - help: 'Print more verbose output (set logging level to INFO instead of default WARNING level). ' - comment: 'Help string has changed' - - - name: use_stderr - type: boolean - default: true - help: 'Log output to standard error ' - comment: 'Help string has changed' - - - name: logging_context_format_string - type: string - 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 ' - comment: 'Default value has changed' - - - name: logging_default_format_string - type: string - default: '%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s' - help: 'format string to use for log messages without context ' - comment: 'Help string has changed' - - - name: logging_debug_format_suffix - type: string - default: '%(funcName)s %(pathname)s:%(lineno)d' - help: 'data to append to log format when level is DEBUG ' - comment: 'Help string has changed' - - - name: logging_exception_prefix - type: string - default: '%(asctime)s.%(msecs)03d %(process)d TRACE %(name)s %(instance)s' - help: 'prefix each line of exception output with this format ' - comment: 'Help string has changed' - - - name: default_log_levels - type: string_list - default: ['amqplib=WARN', 'sqlalchemy=WARN', 'boto=WARN', 'suds=INFO', 'keystone=INFO', 'eventlet.wsgi.server=WARN'] - help: 'list of logger=LEVEL pairs ' - comment: 'Type has changed' - - - name: publish_errors - type: boolean - default: false - help: 'publish error events ' - comment: 'Help string has changed' - - - name: fatal_deprecations - type: boolean - default: false - help: 'make deprecations fatal ' - comment: 'Help string has changed' - - - name: instance_format - type: string - default: '"[instance: %(uuid)s] "' - help: 'If an instance is passed with the log message, format it like this ' - comment: 'Help string has changed' - - - name: instance_uuid_format - type: string - default: '"[instance: %(uuid)s] "' - help: 'If an instance UUID is passed with the log message, format it like this ' - comment: 'Help string has changed' - - - name: log_config - type: string - default: ~ - help: 'If this option is specified, the logging configuration file specified is used and overrides any other logging options specified. Please see the Python logging module documentation for details on logging configuration files. ' - comment: 'Help string has changed' - - - name: log_format - type: string - default: ~ - help: 'DEPRECATED. A logging.Formatter log message format string which may use any of the available logging.LogRecord attributes. This option is deprecated. Please use logging_context_format_string and logging_default_format_string instead. ' - comment: 'Default value has changed' - - - name: log_date_format - type: string - default: '%Y-%m-%d %H:%M:%S' - help: 'Format string for %%(asctime)s in log records. Default: %(default)s ' - comment: 'Help string has changed' - - - name: log_file - type: string - default: ~ - help: '(Optional) Name of log file to output to. If no default is set, logging will go to stdout. ' - comment: 'Help string has changed' - - - name: log_dir - type: string - default: ~ - help: '(Optional) The base directory used for relative --log-file paths ' - comment: 'Help string has changed' - - - name: use_syslog - type: boolean - default: false - help: 'Use syslog for logging. ' - comment: 'Help string has changed' - - - name: syslog_log_facility - type: string - default: 'LOG_USER' - help: 'syslog facility to receive log lines ' - comment: 'Help string has changed' - - - name: memcached_servers - type: list - default: ~ - help: 'Memcached servers or None for in process cache. ' - comment: 'Help string has changed' - - - name: notification_driver - type: string - default: '' - help: 'Driver or drivers to handle sending notifications (multi valued)' - comment: 'Type has changed' - - - name: default_notification_level - type: string - default: 'INFO' - help: 'Default notification level for outgoing notifications ' - comment: 'Help string has changed' - - - name: default_publisher_id - type: string - default: ~ - help: 'Default publisher_id for outgoing notifications ' - comment: 'Default value has changed' - - - name: notification_topics - type: string_list - default: ['notifications'] - help: 'AMQP topic used for OpenStack notifications ' - comment: 'Type has changed' - - - name: run_external_periodic_tasks - type: boolean - default: true - help: 'Some periodic tasks can be run in a separate process. Should we run them here? ' - comment: 'Help string has changed' - - - name: rpc_backend - type: string - default: 'nova.openstack.common.rpc.impl_kombu' - help: 'The messaging module to use, defaults to kombu. ' - comment: 'Help string has changed' - - - name: rpc_thread_pool_size - type: integer - default: 64 - help: 'Size of RPC thread pool ' - comment: 'Help string has changed' - - - name: rpc_conn_pool_size - type: integer - default: 30 - help: 'Size of RPC connection pool ' - comment: 'Help string has changed' - - - name: rpc_response_timeout - type: integer - default: 60 - help: 'Seconds to wait for a response from call or multicall ' - comment: 'Help string has changed' - - - name: rpc_cast_timeout - type: integer - default: 30 - help: 'Seconds to wait before a cast expires (TTL). Only supported by impl_zmq. ' - comment: 'Help string has changed' - - - name: allowed_rpc_exception_modules - type: string_list - default: ['nova.exception', 'cinder.exception', 'exceptions'] - help: 'Modules of exceptions that are permitted to be recreatedupon receiving exception data from an rpc call. ' - comment: 'Type has changed' - - - name: fake_rabbit - type: boolean - default: false - help: 'If passed, use a fake RabbitMQ provider ' - comment: 'Help string has changed' - - - name: control_exchange - type: string - default: 'openstack' - help: 'AMQP exchange to connect to if using RabbitMQ or Qpid ' - comment: 'Help string has changed' - - - name: kombu_ssl_version - type: string - default: '' - help: 'SSL version to use (valid only if SSL enabled). valid values are TLSv1, SSLv23 and SSLv3. SSLv2 may be available on some distributions ' - comment: 'Help string has changed' - - - name: kombu_ssl_keyfile - type: string - default: '' - help: 'SSL key file (valid only if SSL enabled) ' - comment: 'Help string has changed' - - - name: kombu_ssl_certfile - type: string - default: '' - help: 'SSL cert file (valid only if SSL enabled) ' - comment: 'Help string has changed' - - - name: kombu_ssl_ca_certs - type: string - default: '' - help: 'SSL certification authority file (valid only if SSL enabled) ' - comment: 'Help string has changed' - - - name: rabbit_host - type: host - default: 'localhost' - help: 'The RabbitMQ broker address where a single node is used ' - comment: 'Type has changed' - - - name: rabbit_port - type: port - default: 5672 - help: 'The RabbitMQ broker port where a single node is used ' - comment: 'Help string has changed' - - - name: rabbit_hosts - type: string_list - default: ['$rabbit_host:$rabbit_port'] - help: 'RabbitMQ HA cluster host:port pairs ' - comment: 'Type has changed' - - - name: rabbit_use_ssl - type: boolean - default: false - help: 'connect over SSL for RabbitMQ ' - comment: 'Help string has changed' - - - name: rabbit_userid - type: string - default: 'guest' - help: 'the RabbitMQ userid ' - comment: 'Help string has changed' - - - name: rabbit_password - type: string - default: 'guest' - help: 'the RabbitMQ password ' - comment: 'Help string has changed' - - - name: rabbit_virtual_host - type: string - default: '/' - help: 'the RabbitMQ virtual host ' - comment: 'Help string has changed' - - - name: rabbit_retry_interval - type: integer - default: true - help: 'how frequently to retry connecting with RabbitMQ ' - comment: 'Help string has changed' - - - name: rabbit_retry_backoff - type: integer - default: 2 - help: 'how long to backoff for between retries when connecting to RabbitMQ ' - comment: 'Help string has changed' - - - name: rabbit_max_retries - type: integer - default: false - help: 'maximum retries with trying to connect to RabbitMQ (the default of 0 implies an infinite retry count) ' - comment: 'Help string has changed' - - - name: rabbit_ha_queues - type: boolean - default: false - help: 'use H/A queues in RabbitMQ (x-ha-policy: all).You need to wipe RabbitMQ database when changing this option. ' - comment: 'Help string has changed' - - - name: qpid_hostname - type: string - default: 'localhost' - help: 'Qpid broker hostname ' - comment: 'Help string has changed' - - - name: qpid_port - type: port - default: 5672 - help: 'Qpid broker port ' - comment: 'Help string has changed' - - - name: qpid_hosts - type: string_list - default: ['$qpid_hostname:$qpid_port'] - help: 'Qpid HA cluster host:port pairs ' - comment: 'Type has changed' - - - name: qpid_username - type: string - default: '' - help: 'Username for qpid connection ' - comment: 'Help string has changed' - - - name: qpid_password - type: string - default: '' - help: 'Password for qpid connection ' - comment: 'Help string has changed' - - - name: qpid_sasl_mechanisms - type: string - default: '' - help: 'Space separated list of SASL mechanisms to use for auth ' - comment: 'Help string has changed' - - - name: qpid_heartbeat - type: integer - default: 60 - help: 'Seconds between connection keepalive heartbeats ' - comment: 'Help string has changed' - - - name: qpid_protocol - type: string - default: 'tcp' - help: "Transport to use, either 'tcp' or 'ssl' " - comment: 'Help string has changed' - - - name: qpid_tcp_nodelay - type: boolean - default: true - help: 'Disable Nagle algorithm ' - comment: 'Help string has changed' - - - name: rpc_zmq_bind_address - type: string - default: '*' - help: "ZeroMQ bind address. Should be a wildcard (*), an ethernet interface, or IP. The 'host' option should point or resolve to this address. " - comment: 'Help string has changed' - - - name: rpc_zmq_matchmaker - type: string - default: 'nova.openstack.common.rpc.matchmaker.MatchMakerLocalhost' - help: 'MatchMaker driver ' - comment: 'Help string has changed' - - - name: rpc_zmq_port - type: port - default: 9501 - help: 'ZeroMQ receiver listening port ' - comment: 'Help string has changed' - - - name: rpc_zmq_contexts - type: integer - default: true - help: 'Number of ZeroMQ contexts, defaults to 1 ' - comment: 'Help string has changed' - - - name: rpc_zmq_topic_backlog - type: integer - default: ~ - help: 'Maximum number of ingress messages to locally buffer per topic. Default is unlimited. ' - comment: 'Help string has changed' - - - name: rpc_zmq_ipc_dir - type: string - default: '/var/run/openstack' - help: 'Directory for holding IPC sockets ' - comment: 'Help string has changed' - - - name: rpc_zmq_host - type: string - default: 'nova' - help: "Name of this node. Must be a valid hostname, FQDN, or IP address. Must match 'host' option, if running Nova. " - comment: 'Default value has changed' - - - name: scheduler_host_manager - type: string - default: 'nova.scheduler.host_manager.HostManager' - help: 'The scheduler host manager class to use ' - comment: 'Help string has changed' - - - name: scheduler_max_attempts - type: integer - default: 3 - help: 'Maximum number of attempts to schedule an instance ' - comment: 'Help string has changed' - - - name: scheduler_host_subset_size - type: integer - default: true - help: 'New instances will be scheduled on a host chosen randomly from a subset of the N best hosts. This property defines the subset size that a host is chosen from. A value of 1 chooses the first host returned by the weighing functions. This value must be at least 1. Any value less than 1 will be ignored, and 1 will be used instead ' - comment: 'Help string has changed' - - - name: cpu_allocation_ratio - type: float - default: 16.0 - help: 'Virtual CPU to physical CPU allocation ratio which affects all CPU filters. This configuration specifies a global ratio for CoreFilter. For AggregateCoreFilter, it will fall back to this configuration value if no per-aggregate setting found. ' - comment: 'Type has changed' - - - name: disk_allocation_ratio - type: float - default: true - help: 'virtual disk to physical disk allocation ratio ' - comment: 'Type has changed' - - - name: max_io_ops_per_host - type: integer - default: 8 - help: 'Ignore hosts that have too many builds/resizes/snaps/migrations ' - comment: 'Help string has changed' - - - name: isolated_images - type: string_list - default: [] - help: 'Images to run on isolated host ' - comment: 'Type has changed' - - - name: isolated_hosts - type: string_list - default: [] - help: 'Host reserved for specific images ' - comment: 'Type has changed' - - - name: max_instances_per_host - type: integer - default: 50 - help: 'Ignore hosts that have too many instances ' - comment: 'Help string has changed' - - - name: ram_allocation_ratio - type: float - default: 1.5 - help: 'Virtual ram to physical ram allocation ratio which affects all ram filters. This configuration specifies a global ratio for RamFilter. For AggregateRamFilter, it will fall back to this configuration value if no per-aggregate setting found. ' - comment: 'Type has changed' - - - name: scheduler_available_filters - type: string - default: 'nova.scheduler.filters.all_filters' - help: "Filter classes available to the scheduler which may be specified more than once. An entry of 'nova.scheduler.filters.standard_filters' maps to all filters included with nova. (multi valued)" - comment: 'Type has changed' - - - name: scheduler_driver - type: string - default: 'nova.scheduler.filter_scheduler.FilterScheduler' - help: 'Default driver to use for the scheduler ' - comment: 'Help string has changed' - - - name: scheduler_topic - type: string - default: 'scheduler' - help: 'the topic scheduler nodes listen on ' - comment: 'Help string has changed' - - - name: scheduler_json_config_location - type: string - default: '' - help: 'Absolute path to scheduler configuration JSON file. ' - comment: 'Help string has changed' - - - name: servicegroup_driver - type: string - default: 'db' - help: 'The driver for servicegroup service (valid options are: db, zk, mc) ' - comment: 'Help string has changed' - - - name: config_drive_format - type: string - default: 'iso9660' - help: 'Config drive format. One of iso9660 (default) or vfat ' - comment: 'Help string has changed' - - - name: config_drive_tempdir - type: string - default: ~ - help: 'Where to put temporary files associated with config drive creation ' - comment: 'Help string has changed' - - - name: force_config_drive - type: string - default: ~ - help: 'Set to force injection to take place on a config drive (if set, valid options are: always) ' - comment: 'Help string has changed' - - - name: mkisofs_cmd - type: string - default: 'genisoimage' - help: 'Name and optionally path of the tool used for ISO image creation ' - comment: 'Help string has changed' - - - name: virt_mkfs - type: string - default: 'windows=mkfs.ntfs --force --fast --label %(fs_label)s %(target)s' - help: 'mkfs commands for ephemeral device. The format is = (multi valued)' - comment: 'Default value has changed' - - - name: timeout_nbd - type: integer - default: 10 - help: 'time to wait for a NBD device coming up ' - comment: 'Help string has changed' - - - name: compute_driver - type: string - default: ~ - help: 'Driver to use for controlling virtualization. Options include: libvirt.LibvirtDriver, xenapi.XenAPIDriver, fake.FakeDriver, baremetal.BareMetalDriver, vmwareapi.VMwareESXDriver, vmwareapi.VMwareVCDriver ' - comment: 'Help string has changed' - - - name: default_ephemeral_format - type: string - default: ~ - help: 'The default format an ephemeral_volume will be formatted with on creation. ' - comment: 'Help string has changed' - - - name: preallocate_images - type: string - default: 'none' - help: "VM image preallocation mode: 'none' => no storage provisioning is done up front, 'space' => storage is fully allocated at instance start " - comment: 'Help string has changed' - - - name: use_cow_images - type: boolean - default: true - help: 'Whether to use cow images ' - comment: 'Help string has changed' - - - name: firewall_driver - type: string - default: ~ - help: 'Firewall driver (defaults to hypervisor specific iptables driver) ' - comment: 'Help string has changed' - - - name: allow_same_net_traffic - type: boolean - default: true - help: 'Whether to allow network traffic from same network ' - comment: 'Help string has changed' - - - name: force_raw_images - type: boolean - default: true - help: 'Force backing images to raw format ' - comment: 'Help string has changed' - - - name: rescue_image_id - type: string - default: ~ - help: 'Rescue ami image ' - comment: 'Help string has changed' - - - name: rescue_kernel_id - type: string - default: ~ - help: 'Rescue aki image ' - comment: 'Help string has changed' - - - name: rescue_ramdisk_id - type: string - default: ~ - help: 'Rescue ari image ' - comment: 'Help string has changed' - - - name: libvirt_type - type: string - default: 'kvm' - help: 'Libvirt domain type (valid options are: kvm, lxc, qemu, uml, xen) ' - comment: 'Help string has changed' - - - name: libvirt_uri - type: string - default: '' - help: 'Override the default libvirt URI (which is dependent on libvirt_type) ' - comment: 'Help string has changed' - - - name: libvirt_inject_password - type: boolean - default: false - help: 'Inject the admin password at boot time, without an agent. ' - comment: 'Help string has changed' - - - name: libvirt_inject_key - type: boolean - default: true - help: 'Inject the ssh public key at boot time ' - comment: 'Help string has changed' - - - name: libvirt_inject_partition - type: integer - default: true - help: 'The partition to inject to : -2 => disable, -1 => inspect (libguestfs only), 0 => not partitioned, >0 => partition number ' - comment: 'Help string has changed' - - - name: use_usb_tablet - type: boolean - default: true - help: 'Sync virtual and real mouse cursors in Windows VMs ' - comment: 'Help string has changed' - - - name: live_migration_uri - type: string - default: 'qemu+tcp://%s/system' - help: "Migration target URI (any included '%s' is replaced with the migration target hostname) " - comment: 'Help string has changed' - - - name: live_migration_flag - type: string - default: 'VIR_MIGRATE_UNDEFINE_SOURCE, VIR_MIGRATE_PEER2PEER' - help: 'Migration flags to be set for live migration ' - comment: 'Help string has changed' - - - name: block_migration_flag - type: string - default: 'VIR_MIGRATE_UNDEFINE_SOURCE, VIR_MIGRATE_PEER2PEER, VIR_MIGRATE_NON_SHARED_INC' - help: 'Migration flags to be set for block migration ' - comment: 'Help string has changed' - - - name: live_migration_bandwidth - type: integer - default: false - help: 'Maximum bandwidth to be used during migration, in Mbps ' - comment: 'Help string has changed' - - - name: snapshot_image_format - type: string - default: ~ - help: 'Snapshot image format (valid options are : raw, qcow2, vmdk, vdi). Defaults to same as source image ' - comment: 'Help string has changed' - - - name: libvirt_vif_driver - type: string - default: 'nova.virt.libvirt.vif.LibvirtGenericVIFDriver' - help: 'The libvirt VIF driver to configure the VIFs. ' - comment: 'Help string has changed' - - - name: libvirt_volume_drivers - type: string_list - default: ['iscsi=nova.virt.libvirt.volume.LibvirtISCSIVolumeDriver', 'iser=nova.virt.libvirt.volume.LibvirtISERVolumeDriver', 'local=nova.virt.libvirt.volume.LibvirtVolumeDriver', 'fake=nova.virt.libvirt.volume.LibvirtFakeVolumeDriver', 'rbd=nova.virt.libvirt.volume.LibvirtNetVolumeDriver', 'sheepdog=nova.virt.libvirt.volume.LibvirtNetVolumeDriver', 'nfs=nova.virt.libvirt.volume.LibvirtNFSVolumeDriver', 'aoe=nova.virt.libvirt.volume.LibvirtAOEVolumeDriver', 'glusterfs=nova.virt.libvirt.volume.LibvirtGlusterfsVolumeDriver', 'fibre_channel=nova.virt.libvirt.volume.LibvirtFibreChannelVolumeDriver', 'scality=nova.virt.libvirt.volume.LibvirtScalityVolumeDriver'] - help: 'Libvirt handlers for remote volumes. ' - comment: 'Type has changed' - - - name: libvirt_disk_prefix - type: string - default: ~ - help: 'Override the default disk prefix for the devices attached to a server, which is dependent on libvirt_type. (valid options are: sd, xvd, uvd, vd) ' - comment: 'Help string has changed' - - - name: libvirt_wait_soft_reboot_seconds - type: integer - default: 120 - help: 'Number of seconds to wait for instance to shut down after soft reboot request is made. We fall back to hard reboot if instance does not shutdown within this window. ' - comment: 'Help string has changed' - - - name: libvirt_nonblocking - type: boolean - default: true - help: 'Use a separated OS thread pool to realize non-blocking libvirt calls ' - comment: 'Help string has changed' - - - name: libvirt_cpu_mode - type: string - default: ~ - help: "Set to 'host-model' to clone the host CPU feature flags; to 'host-passthrough' to use the host CPU model exactly; to 'custom' to use a named CPU model; to 'none' to not set any CPU model. If libvirt_type='kvm|qemu', it will default to 'host-model', otherwise it will default to 'none' " - comment: 'Help string has changed' - - - name: libvirt_cpu_model - type: string - default: ~ - help: "Set to a named libvirt CPU model (see names listed in /usr/share/libvirt/cpu_map.xml). Only has effect if libvirt_cpu_mode='custom' and libvirt_type='kvm|qemu' " - comment: 'Help string has changed' - - - name: libvirt_snapshots_directory - type: string - default: '$instances_path/snapshots' - help: 'Location where libvirt driver will store snapshots before uploading them to image service ' - comment: 'Help string has changed' - - - name: xen_hvmloader_path - type: string - default: '/usr/lib/xen/boot/hvmloader' - help: 'Location where the Xen hvmloader is kept ' - comment: 'Help string has changed' - - - name: disk_cachemodes - type: string_list - default: [] - help: "Specific cachemodes to use for different disk types e.g: ['file=directsync','block=none'] " - comment: 'Type has changed' - - - name: libvirt_images_type - type: string - default: 'default' - help: 'VM Images format. Acceptable values are: raw, qcow2, lvm,rbd, default. If default is specified, then use_cow_images flag is used instead of this one. ' - comment: 'Help string has changed' - - - name: libvirt_images_volume_group - type: string - default: ~ - help: 'LVM Volume Group that is used for VM images, when you specify libvirt_images_type=lvm. ' - comment: 'Help string has changed' - - - name: libvirt_sparse_logical_volumes - type: boolean - default: false - help: 'Create sparse logical volumes (with virtualsize) if this flag is set to True. ' - comment: 'Help string has changed' - - - name: libvirt_lvm_snapshot_size - type: integer - default: 1000 - help: 'The amount of storage (in megabytes) to allocate for LVM snapshot copy-on-write blocks. ' - comment: 'Help string has changed' - - - name: base_dir_name - type: string - default: '_base' - help: 'Where cached images are stored under $instances_path.This is NOT the full path - just a folder name.For per-compute-host cached images, set to _base_$my_ip ' - comment: 'Help string has changed' - - - name: image_info_filename_pattern - type: string - default: '$instances_path/$base_dir_name/%(image)s.info' - help: 'Allows image information files to be stored in non-standard locations ' - comment: 'Help string has changed' - - - name: remove_unused_base_images - type: boolean - default: true - help: 'Should unused base images be removed? ' - comment: 'Help string has changed' - - - name: remove_unused_kernels - type: boolean - default: false - help: 'Should unused kernel images be removed? This is only safe to enable if all compute nodes have been updated to support this option. This will enabled by default in future. ' - comment: 'Help string has changed' - - - name: remove_unused_resized_minimum_age_seconds - type: integer - default: 3600 - help: 'Unused resized base images younger than this will not be removed ' - comment: 'Help string has changed' - - - name: remove_unused_original_minimum_age_seconds - type: integer - default: 86400 - help: 'Unused unresized base images younger than this will not be removed ' - comment: 'Help string has changed' - - - name: checksum_base_images - type: boolean - default: false - help: 'Write a checksum for files in _base to disk ' - comment: 'Help string has changed' - - - name: checksum_interval_seconds - type: integer - default: 3600 - help: 'How frequently to checksum base images ' - comment: 'Help string has changed' - - - name: libvirt_snapshot_compression - type: boolean - default: false - help: 'Compress snapshot images when possible. This currently applies exclusively to qcow2 images ' - comment: 'Help string has changed' - - - name: libvirt_ovs_bridge - type: string - default: 'br-int' - help: 'Name of Integration Bridge used by Open vSwitch ' - comment: 'Help string has changed' - - - name: libvirt_use_virtio_for_bridges - type: boolean - default: true - help: 'Use virtio for bridge interfaces with KVM/QEMU ' - comment: 'Help string has changed' - - - name: num_iscsi_scan_tries - type: integer - default: 3 - help: 'number of times to rescan iSCSI target to find volume ' - comment: 'Help string has changed' - - - name: rbd_user - type: string - default: ~ - help: 'the RADOS client name for accessing rbd volumes ' - comment: 'Help string has changed' - - - name: rbd_secret_uuid - type: string - default: ~ - help: 'the libvirt uuid of the secret for the rbd_uservolumes ' - comment: 'Help string has changed' - - - name: nfs_mount_point_base - type: string - default: '$state_path/mnt' - help: 'Dir where the nfs volume is mounted on the compute node ' - comment: 'Help string has changed' - - - name: nfs_mount_options - type: string - default: ~ - help: 'Mount options passed to the nfs client. See section of the nfs man page for details ' - comment: 'Help string has changed' - - - name: num_aoe_discover_tries - type: integer - default: 3 - help: 'number of times to rediscover AoE target to find volume ' - comment: 'Help string has changed' - - - name: glusterfs_mount_point_base - type: string - default: '$state_path/mnt' - help: 'Dir where the glusterfs volume is mounted on the compute node ' - comment: 'Help string has changed' - - - name: libvirt_iscsi_use_multipath - type: boolean - default: false - help: 'use multipath connection of the iSCSI volume ' - comment: 'Help string has changed' - - - name: scality_sofs_config - type: string - default: ~ - help: 'Path or URL to Scality SOFS configuration file ' - comment: 'Help string has changed' - - - name: scality_sofs_mount_point - type: string - default: '$state_path/scality' - help: 'Base dir where Scality SOFS shall be mounted ' - comment: 'Help string has changed' - - - name: powervm_mgr_type - type: string - default: 'ivm' - help: 'PowerVM manager type (ivm, hmc) ' - comment: 'Help string has changed' - - - name: powervm_mgr - type: string - default: ~ - help: 'PowerVM manager host or ip ' - comment: 'Help string has changed' - - - name: powervm_mgr_user - type: string - default: ~ - help: 'PowerVM manager user name ' - comment: 'Help string has changed' - - - name: powervm_mgr_passwd - type: string - default: ~ - help: 'PowerVM manager user password ' - comment: 'Help string has changed' - - - name: powervm_img_remote_path - type: string - default: '/home/padmin' - help: 'PowerVM image remote path where images will be moved. Make sure this path can fit your biggest image in glance ' - comment: 'Help string has changed' - - - name: powervm_img_local_path - type: string - default: '/tmp' - help: 'Local directory to download glance images to. Make sure this path can fit your biggest image in glance ' - comment: 'Help string has changed' - - - name: agent_timeout - type: integer - default: 30 - help: 'number of seconds to wait for agent reply ' - comment: 'Help string has changed' - - - name: agent_version_timeout - type: integer - default: 300 - help: 'number of seconds to wait for agent to be fully operational ' - comment: 'Help string has changed' - - - name: agent_resetnetwork_timeout - type: integer - default: 60 - help: 'number of seconds to wait for agent reply to resetnetwork request ' - comment: 'Help string has changed' - - - name: xenapi_agent_path - type: string - default: 'usr/sbin/xe-update-networking' - help: 'Specifies the path in which the xenapi guest agent should be located. If the agent is present, network configuration is not injected into the image. Used if compute_driver=xenapi.XenAPIDriver and flat_injected=True ' - comment: 'Help string has changed' - - - name: xenapi_disable_agent - type: boolean - default: false - help: 'Disables the use of the XenAPI agent in any image regardless of what image properties are present. ' - comment: 'Help string has changed' - - - name: xenapi_connection_url - type: string - default: ~ - help: 'URL for connection to XenServer/Xen Cloud Platform. A special value of unix://local can be used to connect to the local unix socket. Required if compute_driver=xenapi.XenAPIDriver ' - comment: 'Help string has changed' - - - name: xenapi_connection_username - type: string - default: 'root' - help: 'Username for connection to XenServer/Xen Cloud Platform. Used only if compute_driver=xenapi.XenAPIDriver ' - comment: 'Help string has changed' - - - name: xenapi_connection_password - type: string - default: ~ - help: 'Password for connection to XenServer/Xen Cloud Platform. Used only if compute_driver=xenapi.XenAPIDriver ' - comment: 'Help string has changed' - - - name: xenapi_connection_concurrent - type: integer - default: 5 - help: 'Maximum number of concurrent XenAPI connections. Used only if compute_driver=xenapi.XenAPIDriver ' - comment: 'Help string has changed' - - - name: xenapi_vhd_coalesce_poll_interval - type: float - default: 5.0 - help: 'The interval used for polling of coalescing vhds. Used only if compute_driver=xenapi.XenAPIDriver ' - comment: 'Type has changed' - - - name: xenapi_check_host - type: boolean - default: true - help: 'Ensure compute service is running on host XenAPI connects to. ' - comment: 'Help string has changed' - - - name: xenapi_vhd_coalesce_max_attempts - type: integer - default: 5 - help: 'Max number of times to poll for VHD to coalesce. Used only if compute_driver=xenapi.XenAPIDriver ' - comment: 'Help string has changed' - - - name: xenapi_sr_base_path - type: string - default: '/var/run/sr-mount' - help: 'Base path to the storage repository ' - comment: 'Help string has changed' - - - name: target_host - type: string - default: ~ - help: 'iSCSI Target Host ' - comment: 'Help string has changed' - - - name: target_port - type: string - default: '3260' - help: 'iSCSI Target Port, 3260 Default ' - comment: 'Type has changed' - - - name: iqn_prefix - type: string - default: 'iqn.2010-10.org.openstack' - help: 'IQN Prefix ' - comment: 'Help string has changed' - - - name: xenapi_remap_vbd_dev - type: boolean - default: false - help: 'Used to enable the remapping of VBD dev (Works around an issue in Ubuntu Maverick) ' - comment: 'Help string has changed' - - - name: xenapi_remap_vbd_dev_prefix - type: string - default: 'sd' - help: 'Specify prefix to remap VBD dev to (ex. /dev/xvdb -> /dev/sdb) ' - comment: 'Help string has changed' - - - name: xenapi_login_timeout - type: integer - default: 10 - help: 'Timeout in seconds for XenAPI login. ' - comment: 'Help string has changed' - - - name: xenapi_torrent_base_url - type: string - default: ~ - help: 'Base URL for torrent files. ' - comment: 'Help string has changed' - - - name: xenapi_torrent_seed_chance - type: float - default: true - help: 'Probability that peer will become a seeder. (1.0 = 100%) ' - comment: 'Type has changed' - - - name: xenapi_torrent_seed_duration - type: integer - default: 3600 - help: 'Number of seconds after downloading an image via BitTorrent that it should be seeded for other peers. ' - comment: 'Help string has changed' - - - name: xenapi_torrent_max_last_accessed - type: integer - default: 86400 - help: 'Cached torrent files not accessed within this number of seconds can be reaped ' - comment: 'Help string has changed' - - - name: xenapi_torrent_listen_port_start - type: port - default: 6881 - help: 'Beginning of port range to listen on ' - comment: 'Help string has changed' - - - name: xenapi_torrent_listen_port_end - type: port - default: 6891 - help: 'End of port range to listen on ' - comment: 'Help string has changed' - - - name: xenapi_torrent_download_stall_cutoff - type: integer - default: 600 - help: 'Number of seconds a download can remain at the same progress percentage w/o being considered a stall ' - comment: 'Help string has changed' - - - name: xenapi_torrent_max_seeder_processes_per_host - type: integer - default: true - help: 'Maximum number of seeder processes to run concurrently within a given dom0. (-1 = no limit) ' - comment: 'Help string has changed' - - - name: use_join_force - type: boolean - default: true - help: 'To use for hosts with different CPUs ' - comment: 'Help string has changed' - - - name: xenapi_ovs_integration_bridge - type: string - default: 'xapi1' - help: 'Name of Integration Bridge used by Open vSwitch ' - comment: 'Help string has changed' - - - name: cache_images - type: string - default: 'all' - help: 'Cache glance images locally. `all` will cache all images, `some` will only cache images that have the image_property `cache_in_nova=True`, and `none` turns off caching entirely ' - comment: 'Help string has changed' - - - name: default_os_type - type: string - default: 'linux' - help: 'Default OS type ' - comment: 'Help string has changed' - - - name: block_device_creation_timeout - type: integer - default: 10 - help: 'Time to wait for a block device to be created ' - comment: 'Help string has changed' - - - name: max_kernel_ramdisk_size - type: integer - default: 16777216 - help: 'Maximum size in bytes of kernel or ramdisk images ' - comment: 'Help string has changed' - - - name: sr_matching_filter - type: string - default: 'default-sr:true' - help: 'Filter for finding the SR to be used to install guest instances on. To use the Local Storage in default XenServer/XCP installations set this flag to other-config :i18n-key=local-storage. To select an SR with a different matching criteria, you could set it to other- config:my_favorite_sr=true. On the other hand, to fall back on the Default SR, as displayed by XenCenter, set this flag to: default-sr:true ' - comment: 'Default value has changed' - - - name: xenapi_sparse_copy - type: boolean - default: true - help: "Whether to use sparse_copy for copying data on a resize down (False will use standard dd). This speeds up resizes down considerably since large runs of zeros won't have to be rsynced " - comment: 'Help string has changed' - - - name: xenapi_num_vbd_unplug_retries - type: integer - default: 10 - help: 'Maximum number of retries to unplug VBD ' - comment: 'Help string has changed' - - - name: xenapi_torrent_images - type: string - default: 'none' - help: 'Whether or not to download images via Bit Torrent (all|some|none). ' - comment: 'Help string has changed' - - - name: xenapi_running_timeout - type: integer - default: 60 - help: 'number of seconds to wait for instance to go to running state ' - comment: 'Help string has changed' - - - name: xenapi_vif_driver - type: string - default: 'nova.virt.xenapi.vif.XenAPIBridgeDriver' - help: 'The XenAPI VIF driver using XenServer Network APIs. ' - comment: 'Help string has changed' - - - name: xenapi_image_upload_handler - type: string - default: 'nova.virt.xenapi.image.glance.GlanceStore' - help: 'Dom0 plugin driver used to handle image uploads. ' - comment: 'Default value has changed' - - - name: novncproxy_base_url - type: string - default: 'http://127.0.0.1:6080/vnc_auto.html' - help: "location of vnc console proxy, in the form 'http://127.0.0.1:6080/vnc_auto.html' " - comment: 'Help string has changed' - - - name: xvpvncproxy_base_url - type: string - default: 'http://127.0.0.1:6081/console' - help: "location of nova xvp vnc console proxy, in the form 'http://127.0.0.1:6081/console' " - comment: 'Help string has changed' - - - name: vncserver_listen - type: host - default: '127.0.0.1' - help: 'IP address on which instance vncservers should listen ' - comment: 'Type has changed' - - - name: vncserver_proxyclient_address - type: string - default: '127.0.0.1' - help: 'the address to which proxy clients (like nova-xvpvncproxy) should connect ' - comment: 'Help string has changed' - - - name: vnc_enabled - type: boolean - default: true - help: 'enable vnc related features ' - comment: 'Help string has changed' - - - name: vnc_keymap - type: string - default: 'en-us' - help: 'keymap for vnc ' - comment: 'Help string has changed' - - - name: xvpvncproxy_port - type: port - default: 6081 - help: 'Port that the XCP VNC proxy should bind to ' - comment: 'Help string has changed' - - - name: xvpvncproxy_host - type: host - default: '0.0.0.0' - help: 'Address that the XCP VNC proxy should bind to ' - comment: 'Help string has changed' - - - name: volume_api_class - type: string - default: 'nova.volume.cinder.API' - help: 'The full class name of the volume API class to use ' - comment: 'Help string has changed' - - - name: cinder_catalog_info - type: string - default: 'volume:cinder:publicURL' - help: 'Info to match when looking for cinder in the service catalog. Format is : separated values of the form: :: ' - comment: 'Help string has changed' - - - name: cinder_endpoint_template - type: string - default: ~ - help: 'Override service catalog lookup with template for cinder endpoint e.g. http://localhost:8776/v1/%(project_id)s ' - comment: 'Help string has changed' - - - name: os_region_name - type: string - default: ~ - help: 'region name of this node ' - comment: 'Help string has changed' - - - name: cinder_http_retries - type: integer - default: 3 - help: 'Number of cinderclient retries on failed http calls ' - comment: 'Help string has changed' - - - name: cinder_api_insecure - type: boolean - default: false - help: 'Allow to perform insecure SSL requests to cinder ' - comment: 'Help string has changed' - - - name: cinder_cross_az_attach - type: boolean - default: true - help: 'Allow attach between instance and volume in different availability zones. ' - comment: 'Help string has changed' - - - name: baremetal.sql_connection - type: string - default: 'sqlite:///$state_path/baremetal_$sqlite_db' - help: 'The SQLAlchemy connection string used to connect to the bare-metal database ' - comment: 'Help string has changed' - - - name: zookeeper.address - type: string - default: ~ - help: 'The ZooKeeper addresses for servicegroup service in the format of host1:port,host2:port,host3:port ' - comment: 'Help string has changed' - - - name: zookeeper.recv_timeout - type: integer - default: 4000 - help: 'recv_timeout parameter for the zk session ' - comment: 'Help string has changed' - - - name: zookeeper.sg_prefix - type: string - default: '/servicegroups' - help: 'The prefix used in ZooKeeper to store ephemeral nodes ' - comment: 'Help string has changed' - - - name: zookeeper.sg_retry_interval - type: integer - default: 5 - help: 'Number of seconds to wait until retrying to join the session ' - comment: 'Help string has changed' - - - name: spice.enabled - type: boolean - default: false - help: 'enable spice related features ' - comment: 'Help string has changed' - - - name: conductor.use_local - type: boolean - default: false - help: 'Perform nova-conductor operations locally ' - comment: 'Help string has changed' - - - name: cells.topic - type: string - default: 'cells' - help: 'the topic cells nodes listen on ' - comment: 'Help string has changed' - - - name: cells.manager - type: string - default: 'nova.cells.manager.CellsManager' - help: 'Manager for cells ' - comment: 'Help string has changed' - - - name: baremetal.driver - type: string - default: 'nova.virt.baremetal.pxe.PXE' - help: 'Baremetal driver back-end (pxe or tilera) ' - comment: 'Help string has changed' - - - name: cells.instance_updated_at_threshold - type: integer - default: 3600 - help: 'Number of seconds after an instance was updated or deleted to continue to update cells ' - comment: 'Help string has changed' - - - name: cells.instance_update_num_instances - type: integer - default: true - help: 'Number of instances to update per periodic task run ' - comment: 'Help string has changed' - - - name: cells.max_hop_count - type: integer - default: 10 - help: 'Maximum number of hops for cells routing. ' - comment: 'Help string has changed' - - - name: cells.enable - type: boolean - default: false - help: 'Enable cell functionality ' - comment: 'Help string has changed' - - - name: cells.name - type: string - default: 'nova' - help: 'name of this cell ' - comment: 'Help string has changed' - - - name: cells.capabilities - type: string_list - default: ['hypervisor=xenserver;kvm', 'os=linux;windows'] - help: 'Key/Multi-value list with the capabilities of the cell ' - comment: 'Type has changed' - - - name: cells.call_timeout - type: integer - default: 60 - help: 'Seconds to wait for response from a call to a cell. ' - comment: 'Help string has changed' - - - name: cells.rpc_driver_queue_base - type: string - default: 'cells.intercell' - help: 'Base queue name to use when communicating between cells. Various topics by message type will be appended to this. ' - comment: 'Help string has changed' - - - name: cells.scheduler_retries - type: integer - default: 10 - help: 'How many retries when no cells are available. ' - comment: 'Help string has changed' - - - name: cells.scheduler_retry_delay - type: integer - default: 2 - help: 'How often to retry in seconds when no cells are available. ' - comment: 'Help string has changed' - - - name: cells.db_check_interval - type: integer - default: 60 - help: 'Seconds between getting fresh cell info from db. ' - comment: 'Help string has changed' - - - name: baremetal.db_backend - type: string - default: 'sqlalchemy' - help: 'The backend to use for bare-metal database ' - comment: 'Help string has changed' - - - name: baremetal.vif_driver - type: string - default: 'nova.virt.baremetal.vif_driver.BareMetalVIFDriver' - help: 'Baremetal VIF driver. ' - comment: 'Help string has changed' - - - name: baremetal.volume_driver - type: string - default: 'nova.virt.baremetal.volume_driver.LibvirtVolumeDriver' - help: 'Baremetal volume driver. ' - comment: 'Help string has changed' - - - name: baremetal.instance_type_extra_specs - type: string_list - default: [] - help: "a list of additional capabilities corresponding to instance_type_extra_specs for this compute host to advertise. Valid entries are name=value, pairs For example, 'key1:val1, key2:val2' " - comment: 'Type has changed' - - - name: baremetal.power_manager - type: string - default: 'nova.virt.baremetal.ipmi.IPMI' - help: 'Baremetal power management method ' - comment: 'Help string has changed' - - - name: baremetal.tftp_root - type: string - default: '/tftpboot' - help: "Baremetal compute node's tftp root path " - comment: 'Help string has changed' - - - name: baremetal.terminal - type: string - default: 'shellinaboxd' - help: 'path to baremetal terminal program ' - comment: 'Help string has changed' - - - name: baremetal.terminal_cert_dir - type: string - default: ~ - help: 'path to baremetal terminal SSL cert(PEM) ' - comment: 'Help string has changed' - - - name: baremetal.terminal_pid_dir - type: string - default: '$state_path/baremetal/console' - help: 'path to directory stores pidfiles of baremetal_terminal ' - comment: 'Help string has changed' - - - name: baremetal.ipmi_power_retry - type: integer - default: 10 - help: 'maximal number of retries for IPMI operations ' - comment: 'Default value has changed' - - - name: baremetal.deploy_kernel - type: string - default: ~ - help: 'Default kernel image ID used in deployment phase ' - comment: 'Help string has changed' - - - name: baremetal.deploy_ramdisk - type: string - default: ~ - help: 'Default ramdisk image ID used in deployment phase ' - comment: 'Help string has changed' - - - name: baremetal.net_config_template - type: string - default: '$pybasedir/nova/virt/baremetal/net-dhcp.ubuntu.template' - help: 'Template file for injected network config ' - comment: 'Help string has changed' - - - name: baremetal.pxe_append_params - type: string - default: 'nofb nomodeset vga=normal' - help: 'additional append parameters for baremetal PXE boot ' - comment: 'Default value has changed' - - - name: baremetal.pxe_config_template - type: string - default: '$pybasedir/nova/virt/baremetal/pxe_config.template' - help: 'Template file for PXE configuration ' - comment: 'Help string has changed' - - - name: baremetal.pxe_deploy_timeout - type: integer - default: false - help: 'Timeout for PXE deployments. Default: 0 (unlimited) ' - comment: 'Help string has changed' - - - name: baremetal.virtual_power_ssh_host - type: string - default: '' - help: 'ip or name to virtual power host ' - comment: 'Help string has changed' - - - name: baremetal.virtual_power_type - type: string - default: 'virsh' - help: 'base command to use for virtual power(vbox,virsh) ' - comment: 'Default value has changed' - - - name: baremetal.virtual_power_host_user - type: string - default: '' - help: 'user to execute virtual power commands as ' - comment: 'Help string has changed' - - - name: baremetal.virtual_power_host_pass - type: string - default: '' - help: 'password for virtual power host_user ' - comment: 'Help string has changed' - - - name: baremetal.use_unsafe_iscsi - type: boolean - default: false - help: 'Do not set this out of dev/test environments. If a node does not have a fixed PXE IP address, volumes are exported with globally opened ACL ' - comment: 'Help string has changed' - - - name: baremetal.iscsi_iqn_prefix - type: string - default: 'iqn.2010-10.org.openstack.baremetal' - help: 'iSCSI IQN prefix used in baremetal volume connections. ' - comment: 'Help string has changed' - - - name: rpc_notifier2.topics - type: string_list - default: ['notifications'] - help: 'AMQP topic(s) used for OpenStack notifications ' - comment: 'Type has changed' - - - name: trusted_computing.attestation_server - type: string - default: ~ - help: 'attestation server http ' - comment: 'Help string has changed' - - - name: trusted_computing.attestation_server_ca_file - type: string - default: ~ - help: 'attestation server Cert file for Identity verification ' - comment: 'Help string has changed' - - - name: trusted_computing.attestation_port - type: string - default: '8443' - help: 'attestation server port ' - comment: 'Type has changed' - - - name: trusted_computing.attestation_api_url - type: string - default: '/OpenAttestationWebServices/V1.0' - help: 'attestation web API URL ' - comment: 'Help string has changed' - - - name: trusted_computing.attestation_auth_blob - type: string - default: ~ - help: 'attestation authorization blob - must change ' - comment: 'Help string has changed' - - - name: trusted_computing.attestation_auth_timeout - type: integer - default: 60 - help: 'Attestation status cache valid period length ' - comment: 'Help string has changed' - - - name: vmware.integration_bridge - type: string - default: 'br-int' - help: 'Name of Integration Bridge ' - comment: 'Help string has changed' - - - name: spice.html5proxy_base_url - type: string - default: 'http://127.0.0.1:6082/spice_auto.html' - help: "location of spice html5 console proxy, in the form 'http://127.0.0.1:6082/spice_auto.html' " - comment: 'Help string has changed' - - - name: spice.server_listen - type: host - default: '127.0.0.1' - help: 'IP address on which instance spice server should listen ' - comment: 'Type has changed' - - - name: spice.server_proxyclient_address - type: string - default: '127.0.0.1' - help: 'the address to which proxy clients (like nova- spicehtml5proxy) should connect ' - comment: 'Help string has changed' - - - name: spice.agent_enabled - type: boolean - default: true - help: 'enable spice guest agent support ' - comment: 'Help string has changed' - - - name: spice.keymap - type: string - default: 'en-us' - help: 'keymap for spice ' - comment: 'Help string has changed' - - - name: ssl.ca_file - type: string - default: ~ - help: 'CA certificate file to use to verify connecting clients ' - comment: 'New param' - - - name: ssl.key_file - type: string - default: ~ - help: 'Private key file to use when starting the server securely ' - comment: 'New param' - - - name: matchmaker_redis.host - type: string - default: '127.0.0.1' - help: 'Host to locate redis ' - comment: 'New param' - - - name: quota_fixed_ips - type: integer - default: -1 - help: 'number of fixed ips allowed per project (this should be at least the number of instances allowed) ' - comment: 'New param' - - - name: vendordata_driver - type: string - default: 'nova.api.metadata.vendordata_json.JsonFileVendorData' - help: 'Driver to use for vendor data ' - comment: 'New param' - - - name: service_neutron_metadata_proxy - type: boolean - default: false - help: 'Set flag to indicate Neutron will proxy metadata requests and resolve instance ids. ' - comment: 'New param' - - - name: neutron_metadata_proxy_shared_secret - type: string - default: '' - help: 'Shared secret to validate proxies Neutron metadata requests ' - comment: 'New param' - - - name: vendordata_jsonfile_path - type: string - default: ~ - help: 'File to load json formated vendor data from ' - comment: 'New param' - - - name: use_neutron_default_nets - type: string - default: 'False' - help: 'Control for checking for default networks ' - comment: 'New param' - - - name: neutron_default_tenant_id - type: string - default: 'default' - help: 'Default tenant id when creating neutron networks ' - comment: 'New param' - - - name: vpn_flavor - type: string - default: 'm1.tiny' - help: 'Flavor for vpn instances ' - comment: 'New param' - - - name: upgrade_levels.cert - type: string - default: ~ - help: 'Set a version cap for messages sent to cert services ' - comment: 'New param' - - - name: spicehtml5proxy_host - type: host - default: '0.0.0.0' - help: 'Host on which to listen for incoming requests ' - comment: 'New param' - - - name: spicehtml5proxy_port - type: port - default: 6082 - help: 'Port on which to listen for incoming requests ' - comment: 'New param' - - - name: allow_migrate_to_same_host - type: boolean - default: false - help: 'Allow migrate machine to the same host. Useful when testing in single-host environments. ' - comment: 'New param' - - - name: max_local_block_devices - type: integer - default: 3 - help: 'Maximum number of devices that will result in a local image being created on the hypervisor node. Setting this to 0 means nova will allow only boot from volume. A negative number means unlimited. ' - comment: 'New param' - - - name: default_flavor - type: string - default: 'm1.small' - help: 'default flavor to use for the EC2 API only. The Nova API does not support a default flavor. ' - comment: 'New param' - - - name: network_allocate_retries - type: integer - default: false - help: 'Number of times to retry network allocation on failures ' - comment: 'New param' - - - name: maximum_instance_delete_attempts - type: integer - default: 5 - help: "The number of times to attempt to reap an instance's files. " - comment: 'New param' - - - name: sync_power_state_interval - type: integer - default: 600 - help: 'interval to sync power states between the database and the hypervisor ' - comment: 'New param' - - - name: shelved_poll_interval - type: integer - default: 3600 - help: 'Interval in seconds for polling shelved instances to offload ' - comment: 'New param' - - - name: shelved_offload_time - type: integer - default: false - help: 'Time in seconds before a shelved instance is eligible for removing from a host. -1 never offload, 0 offload when shelved ' - comment: 'New param' - - - name: instance_delete_interval - type: integer - default: 300 - help: 'Interval in seconds for retrying failed instance file deletes ' - comment: 'New param' - - - name: migrate_max_retries - type: integer - default: -1 - help: 'Number of times to retry live-migration before failing. If == -1, try until out of hosts. If == 0, only try once, no retries. ' - comment: 'New param' - - - name: iptables_drop_action - type: string - default: 'DROP' - help: 'The table that iptables to jump to when a packet is to be dropped. ' - comment: 'New param' - - - name: vmware.vlan_interface - type: string - default: 'vmnic0' - help: 'Physical ethernet adapter name for vlan networking ' - comment: 'New param' - - - name: neutron_url - type: string - default: 'http://127.0.0.1:9696' - help: 'URL for connecting to neutron ' - comment: 'New param' - - - name: neutron_url_timeout - type: integer - default: 30 - help: 'timeout value for connecting to neutron in seconds ' - comment: 'New param' - - - name: neutron_admin_username - type: string - default: ~ - help: 'username for connecting to neutron in admin context ' - comment: 'New param' - - - name: neutron_admin_password - type: string - default: ~ - help: 'password for connecting to neutron in admin context ' - comment: 'New param' - - - name: neutron_admin_tenant_name - type: string - default: ~ - help: 'tenant name for connecting to neutron in admin context ' - comment: 'New param' - - - name: neutron_region_name - type: string - default: ~ - help: 'region name for connecting to neutron in admin context ' - comment: 'New param' - - - name: neutron_admin_auth_url - type: string - default: 'http://localhost:5000/v2.0' - help: 'auth url for connecting to neutron in admin context ' - comment: 'New param' - - - name: neutron_api_insecure - type: boolean - default: false - help: 'if set, ignore any SSL validation issues ' - comment: 'New param' - - - name: neutron_auth_strategy - type: string - default: 'keystone' - help: 'auth strategy for connecting to neutron in admin context ' - comment: 'New param' - - - name: neutron_ovs_bridge - type: string - default: 'br-int' - help: 'Name of Integration Bridge used by Open vSwitch ' - comment: 'New param' - - - name: neutron_extension_sync_interval - type: integer - default: 600 - help: 'Number of seconds before querying neutron for extensions ' - comment: 'New param' - - - name: neutron_ca_certificates_file - type: string - default: ~ - help: 'Location of ca certificates file to use for neutron client requests. ' - comment: 'New param' - - - name: dhcp_options_enabled - type: boolean - default: false - help: 'Use per-port DHCP options with Neutron ' - comment: 'New param' - - - name: amqp_durable_queues - type: boolean - default: false - help: 'Use durable queues in amqp. ' - comment: 'New param' - - - name: amqp_auto_delete - type: boolean - default: false - help: 'Auto-delete queues in amqp. ' - comment: 'New param' - - - name: qpid_topology_version - type: integer - default: true - help: 'The qpid topology version to use. Version 1 is what was originally used by impl_qpid. Version 2 includes some backwards-incompatible changes that allow broker federation to work. Users should update to version 2 when they are able to take everything down, as it requires a clean break. ' - comment: 'New param' - - - name: matchmaker_heartbeat_freq - type: integer - default: 300 - help: 'Heartbeat frequency ' - comment: 'New param' - - - name: matchmaker_heartbeat_ttl - type: integer - default: 600 - help: 'Heartbeat time-to-live. ' - comment: 'New param' - - - name: pci_alias - type: string - default: '' - help: "An alias for a PCI passthrough device requirement. This allows users to specify the alias in the extra_spec for a flavor, without needing to repeat all the PCI property requirements. For example: pci_alias = { 'name': 'QuicAssist', 'product_id': '0443', 'vendor_id': '8086', 'device_type': 'ACCEL' } defines an alias for the Intel QuickAssist card. (multi valued) (multi valued)" - comment: 'New param' - - - name: pci_passthrough_whitelist - type: string - default: '' - help: "White list of PCI devices available to VMs. For example: pci_passthrough_whitelist = [{'vendor_id': '8086', 'product_id': '0443'}] (multi valued)" - comment: 'New param' - - - name: restrict_isolated_hosts_to_isolated_images - type: boolean - default: true - help: 'Whether to force isolated hosts to run only isolated images ' - comment: 'New param' - - - name: cells.scheduler_weight_classes - type: string_list - default: ['nova.cells.weights.all_weighers'] - help: "Weigher classes the cells scheduler should use. An entry of 'nova.cells.weights.all_weighers'maps to all cell weighers included with nova. " - comment: 'New param' - - - name: cells.ram_weight_multiplier - type: float - default: 10.0 - help: 'Multiplier used for weighing ram. Negative numbers mean to stack vs spread. ' - comment: 'New param' - - - name: injected_network_template - type: string - default: '$pybasedir/nova/virt/interfaces.template' - help: 'Template file for injected network ' - comment: 'New param' - - - name: resize_fs_using_block_device - type: boolean - default: false - help: 'Attempt to resize the filesystem by accessing the image over a block device. This is done by the host and may not be necessary if the image contains a recent version of cloud- init. Possible mechanisms require the nbd driver (for qcow and raw), or loop (for raw). ' - comment: 'New param' - - - name: docker_registry_default_port - type: port - default: 5042 - help: 'Default TCP port to find the docker-registry container ' - comment: 'New param' - - - name: vcpu_pin_set - type: string - default: ~ - help: "Which pcpus can be used by vcpus of instance e.g: '4-12,^8,15' " - comment: 'New param' - - - name: libvirt_images_rbd_pool - type: string - default: 'rbd' - help: 'the RADOS pool in which rbd volumes are stored ' - comment: 'New param' - - - name: libvirt_images_rbd_ceph_conf - type: string - default: '' - help: 'path to the ceph configuration file to use ' - comment: 'New param' - - - name: num_iser_scan_tries - type: integer - default: 3 - help: 'number of times to rescan iSER target to find volume ' - comment: 'New param' - - - name: libvirt_iser_use_multipath - type: boolean - default: false - help: 'use multipath connection of the iSER volume ' - comment: 'New param' - - - name: qemu_allowed_storage_drivers - type: string_list - default: [] - help: 'Protocols listed here will be accessed directly from QEMU. Currently supported protocols: [gluster] ' - comment: 'New param' - - - name: xenapi_use_agent_default - type: boolean - default: false - help: "Determines if the xenapi agent should be used when the image used does not contain a hint to declare if the agent is present or not. The hint is a glance property 'xenapi_use_agent' that has the value 'true' or 'false'. Note that waiting for the agent when it is not present will significantly increase server boot times. " - comment: 'New param' - - - name: xenapi_image_compression_level - type: integer - default: ~ - help: 'Compression level for images, e.g., 9 for gzip -9. Range is 1-9, 9 being most compressed but most CPU intensive on dom0. ' - comment: 'New param' - - - name: xenapi_ipxe_network_name - type: string - default: ~ - help: 'Name of network to use for booting iPXE ISOs ' - comment: 'New param' - - - name: xenapi_ipxe_boot_menu_url - type: string - default: ~ - help: 'URL to the iPXE boot menu ' - comment: 'New param' - - - name: xenapi_ipxe_mkisofs_cmd - type: string - default: 'mkisofs' - help: 'Name and optionally path of the tool used for ISO image creation ' - comment: 'New param' - - - name: cinder_ca_certificates_file - type: string - default: ~ - help: 'Location of ca certificates file to use for cinder client requests. ' - comment: 'New param' - - - name: hyperv.instances_path_share - type: string - default: '' - help: "The name of a Windows share name mapped to the 'instances_path' dir and used by the resize feature to copy files to the target host. If left blank, an administrative share will be used, looking for the same 'instances_path' used locally " - comment: 'New param' - - - name: hyperv.force_hyperv_utils_v1 - type: boolean - default: false - help: 'Force V1 WMI utility classes ' - comment: 'New param' - - - name: hyperv.force_volumeutils_v1 - type: boolean - default: false - help: 'Force V1 volume utility class ' - comment: 'New param' - - - name: hyperv.vswitch_name - type: string - default: ~ - help: 'External virtual switch Name, if not provided, the first external virtual switch is used ' - comment: 'New param' - - - name: hyperv.limit_cpu_features - type: boolean - default: false - help: 'Required for live migration among hosts with different CPU features ' - comment: 'New param' - - - name: hyperv.config_drive_inject_password - type: boolean - default: false - help: 'Sets the admin password in the config drive image ' - comment: 'New param' - - - name: hyperv.qemu_img_cmd - type: string - default: 'qemu-img.exe' - help: 'qemu-img is used to convert between different image types ' - comment: 'New param' - - - name: hyperv.config_drive_cdrom - type: boolean - default: false - help: 'Attaches the Config Drive image as a cdrom drive instead of a disk drive ' - comment: 'New param' - - - name: hyperv.enable_instance_metrics_collection - type: boolean - default: false - help: "Enables metrics collections for an instance by using Hyper-V's metric APIs. Collected data can by retrieved by other apps and services, e.g.: Ceilometer. Requires Hyper-V / Windows Server 2012 and above " - comment: 'New param' - - - name: hyperv.dynamic_memory_ratio - type: float - default: true - help: 'Enables dynamic memory allocation (ballooning) when set to a value greater than 1. The value expresses the ratio between the total RAM assigned to an instance and its startup RAM amount. For example a ratio of 2.0 for an instance with 1024MB of RAM implies 512MB of RAM allocated at startup ' - comment: 'New param' - - - name: hyperv.volume_attach_retry_count - type: integer - default: 10 - help: 'The number of times to retry to attach a volume ' - comment: 'New param' - - - name: hyperv.volume_attach_retry_interval - type: integer - default: 5 - help: 'Interval between volume attachment attempts, in seconds ' - comment: 'New param' - - - name: osapi_v3.extensions_blacklist - type: string_list - default: [] - help: 'A list of v3 API extensions to never load. Specify the extension aliases here. ' - comment: 'New param' - - - name: osapi_v3.extensions_whitelist - type: string_list - default: [] - help: 'If the list is not empty then a v3 API extension will only be loaded if it exists in this list. Specify the extension aliases here. ' - comment: 'New param' - - - name: conductor.workers - type: integer - default: ~ - help: 'Number of workers for OpenStack Conductor service ' - comment: 'New param' - - - name: keymgr.api_class - type: string - default: 'nova.keymgr.conf_key_mgr.ConfKeyManager' - help: 'The full class name of the key manager API class ' - comment: 'New param' - - - name: keymgr.fixed_key - type: string - default: ~ - help: 'Fixed key returned by key manager, specified in hex ' - comment: 'New param' - - - name: upgrade_levels.scheduler - type: string - default: ~ - help: 'Set a version cap for messages sent to scheduler services ' - comment: 'New param' - - - name: cells.reserve_percent - type: float - default: 10.0 - help: 'Percentage of cell capacity to hold in reserve. Affects both memory and disk utilization ' - comment: 'New param' - - - name: cells.cell_type - type: string - default: ~ - help: 'Type of cell: api or compute ' - comment: 'New param' - - - name: cells.mute_child_interval - type: integer - default: 300 - help: 'Number of seconds after which a lack of capability and capacity updates signals the child cell is to be treated as a mute. ' - comment: 'New param' - - - name: cells.bandwidth_update_interval - type: integer - default: 600 - help: 'Seconds between bandwidth updates for cells. ' - comment: 'New param' - - - name: cells.scheduler_filter_classes - type: string_list - default: ['nova.cells.filters.all_filters'] - help: "Filter classes the cells scheduler should use. An entry of 'nova.cells.filters.all_filters'maps to all cells filters included with nova. " - comment: 'New param' - - - name: cells.cells_config - type: string - default: ~ - help: 'Configuration file from which to read cells configuration. If given, overrides reading cells from the database. ' - comment: 'New param' - - - name: cells.mute_weight_multiplier - type: float - default: -10.0 - help: 'Multiplier used to weigh mute children. (The value should be negative.) ' - comment: 'New param' - - - name: cells.mute_weight_value - type: float - default: 1000.0 - help: 'Weight value assigned to mute children. (The value should be positive.) ' - comment: 'New param' - - - name: database.backend - type: string - default: 'sqlalchemy' - help: 'The backend to use for db ' - comment: 'New param' - - - name: database.use_tpool - type: boolean - default: false - help: 'Enable the experimental use of thread pooling for all DB API calls ' - comment: 'New param' - - - name: database.connection - type: string - default: 'sqlite:////nova/openstack/common/db/$sqlite_db' - help: 'The SQLAlchemy connection string used to connect to the database ' - comment: 'New param' - - - name: database.slave_connection - type: string - default: '' - help: 'The SQLAlchemy connection string used to connect to the slave database ' - comment: 'New param' - - - name: database.idle_timeout - type: integer - default: 3600 - help: 'timeout before idle sql connections are reaped ' - comment: 'New param' - - - name: database.min_pool_size - type: integer - default: true - help: 'Minimum number of SQL connections to keep open in a pool ' - comment: 'New param' - - - name: database.max_pool_size - type: integer - default: ~ - help: 'Maximum number of SQL connections to keep open in a pool ' - comment: 'New param' - - - name: database.max_retries - type: integer - default: 10 - help: 'maximum db connection retries during startup. (setting -1 implies an infinite retry count) ' - comment: 'New param' - - - name: database.retry_interval - type: integer - default: 10 - help: 'interval between retries of opening a sql connection ' - comment: 'New param' - - - name: database.max_overflow - type: integer - default: ~ - help: 'If set, use this value for max_overflow with sqlalchemy ' - comment: 'New param' - - - name: database.connection_debug - type: integer - default: false - help: 'Verbosity of SQL debugging information. 0=None, 100=Everything ' - comment: 'New param' - - - name: database.connection_trace - type: boolean - default: false - help: 'Add python stack traces to SQL as comment strings ' - comment: 'New param' - - - name: database.pool_timeout - type: integer - default: ~ - help: 'If set, use this value for pool_timeout with sqlalchemy ' - comment: 'New param' - - - name: image_file_url.filesystems - type: string_list - default: [] - help: 'A list of filesystems that will be configured in this file under the sections image_file_url: ' - comment: 'New param' - - - name: baremetal.pxe_network_config - type: boolean - default: false - help: 'If set, pass the network configuration details to the initramfs via cmdline. ' - comment: 'New param' - - - name: baremetal.pxe_bootfile_name - type: string - default: 'pxelinux.0' - help: 'This gets passed to Neutron as the bootfile dhcp parameter when the dhcp_options_enabled is set. ' - comment: 'New param' - - - name: baremetal.tile_pdu_ip - type: string - default: '10.0.100.1' - help: 'ip address of tilera pdu ' - comment: 'New param' - - - name: baremetal.tile_pdu_mgr - type: string - default: '/tftpboot/pdu_mgr' - help: 'management script for tilera pdu ' - comment: 'New param' - - - name: baremetal.tile_pdu_off - type: integer - default: 2 - help: 'power status of tilera PDU is OFF ' - comment: 'New param' - - - name: baremetal.tile_pdu_on - type: integer - default: true - help: 'power status of tilera PDU is ON ' - comment: 'New param' - - - name: baremetal.tile_pdu_status - type: integer - default: 9 - help: 'power status of tilera PDU ' - comment: 'New param' - - - name: baremetal.tile_power_wait - type: integer - default: 9 - help: 'wait time in seconds until check the result after tilera power operations ' - comment: 'New param' - - - name: baremetal.virtual_power_ssh_port - type: port - default: 22 - help: 'Port to use for ssh to virtual power host ' - comment: 'New param' - - - name: baremetal.virtual_power_host_key - type: string - default: ~ - help: 'ssh key for virtual power host_user ' - comment: 'New param' - - - name: matchmaker_redis.port - type: integer - default: 6379 - help: 'Use this port to connect to redis host. ' - comment: 'New param' - - - name: matchmaker_redis.password - type: string - default: ~ - help: 'Password for Redis server. (optional) ' - comment: 'New param' - - - name: ssl.cert_file - type: string - default: ~ - help: 'Certificate file to use when starting the server securely ' - comment: 'New param' - - - name: upgrade_levels.baseapi - type: string - default: ~ - help: 'Set a version cap for messages sent to the base api in any service ' - comment: 'New param' - - - name: upgrade_levels.intercell - type: string - default: ~ - help: 'Set a version cap for messages sent between cells services ' - comment: 'New param' - - - name: upgrade_levels.cells - type: string - default: ~ - help: 'Set a version cap for messages sent to local cells services ' - comment: 'New param' - - - name: upgrade_levels.compute - type: string - default: ~ - help: 'Set a version cap for messages sent to compute services ' - comment: 'New param' - - - name: upgrade_levels.conductor - type: string - default: ~ - help: 'Set a version cap for messages sent to conductor services ' - comment: 'New param' - - - name: upgrade_levels.console - type: string - default: ~ - help: 'Set a version cap for messages sent to console services ' - comment: 'New param' - - - name: upgrade_levels.consoleauth - type: string - default: ~ - help: 'Set a version cap for messages sent to consoleauth services ' - comment: 'New param' - - - name: upgrade_levels.network - type: string - default: ~ - help: 'Set a version cap for messages sent to network services ' - comment: 'New param' - - - name: matchmaker_ring.ringfile - type: string - default: '/etc/oslo/matchmaker_ring.json' - help: 'Matchmaker ring file (JSON) ' - comment: 'New param' - - - name: vmware.host_ip - type: string - default: ~ - help: 'URL for connection to VMware ESX/VC host. Required if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver. ' - comment: 'New param' - - - name: vmware.host_username - type: string - default: ~ - help: 'Username for connection to VMware ESX/VC host. Used only if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver. ' - comment: 'New param' - - - name: vmware.host_password - type: string - default: ~ - help: 'Password for connection to VMware ESX/VC host. Used only if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver. ' - comment: 'New param' - - - name: vmware.cluster_name - type: string - default: ~ - help: 'Name of a VMware Cluster ComputeResource. Used only if compute_driver is vmwareapi.VMwareVCDriver. (multi valued)' - comment: 'New param' - - - name: vmware.datastore_regex - type: string - default: ~ - help: 'Regex to match the name of a datastore. Used only if compute_driver is vmwareapi.VMwareVCDriver. ' - comment: 'New param' - - - name: vmware.task_poll_interval - type: float - default: 5.0 - help: 'The interval used for polling of remote tasks. Used only if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver. ' - comment: 'New param' - - - name: vmware.api_retry_count - type: integer - default: 10 - help: 'The number of times we retry on failures, e.g., socket error, etc. Used only if compute_driver is vmwareapi.VMwareESXDriver or vmwareapi.VMwareVCDriver. ' - comment: 'New param' - - - name: vmware.vnc_port - type: port - default: 5900 - help: 'VNC starting port ' - comment: 'New param' - - - name: vmware.vnc_port_total - type: integer - default: 10000 - help: 'Total number of VNC ports ' - comment: 'New param' - - - name: vmware.vnc_password - type: string - default: ~ - help: 'DEPRECATED. VNC password. The password-based access to VNC consoles will be removed in the next release. The default value will disable password protection on the VNC console. ' - comment: 'New param' - - - name: vmware.use_linked_clone - type: boolean - default: true - help: 'Whether to use linked clone ' - comment: 'New param' - - - name: vmware.wsdl_location - type: string - default: ~ - help: 'Optional VIM Service WSDL Location e.g http:///vimService.wsdl. Optional over-ride to default location for bug work-arounds ' - comment: 'New param' - - - name: vmware.maximum_objects - type: integer - default: 100 - help: 'The maximum number of ObjectContent data objects that should be returned in a single result. A positive value will cause the operation to suspend the retrieval when the count of objects reaches the specified maximum. The server may still limit the count to something less than the configured value. Any remaining objects may be retrieved with additional requests. ' - comment: 'New param' - -# ==================================================== diff --git a/rubick/schemas/rabbitmq/3.0.0.yml b/rubick/schemas/rabbitmq/3.0.0.yml deleted file mode 100644 index 5435642..0000000 --- a/rubick/schemas/rabbitmq/3.0.0.yml +++ /dev/null @@ -1,54 +0,0 @@ -project: rabbitmq -version: '3.0.0' -parameters: - - - name: tcp_listeners - type: rabbitmq_bind_list - default: [5672] - help: 'List of ports on which to listen for AMQP connections (without SSL)' - - - name: ssl_listeners - type: rabbitmq_bind_list - default: [] - help: 'List of ports on which to listen for AMQP connections (SSL)' - - - name: ssl_options - type: string_list - default: [] - - - name: vm_memory_high_watermark - type: float - default: 0.4 - - - name: vm_memory_high_watermark_paging_ratio - type: float - default: 0.5 - - - name: disk_free_limit - type: integer - default: '50000000' - - - name: log_levels - type: string_list - default: ['{connection, info}'] - - - name: frame_max - type: integer - default: 131072 - - - name: heartbeat - type: integer - default: 600 - - - name: default_vhost - type: string - default: '/' - - - name: default_user - type: string - default: 'guest' - - - name: default_pass - type: string - default: 'guest' - diff --git a/rubick/schemas/rabbitmq/rabbitmq.conf.yml b/rubick/schemas/rabbitmq/rabbitmq.conf.yml deleted file mode 100644 index f8ddf8c..0000000 --- a/rubick/schemas/rabbitmq/rabbitmq.conf.yml +++ /dev/null @@ -1,67 +0,0 @@ -- version: '3.0.0' - checkpoint: true - added: - - - name: tcp_listeners - type: rabbitmq_bind_list - default: [5672] - help: 'List of ports on which to listen for AMQP connections (without SSL)' - comment: 'New param' - - - name: ssl_listeners - type: rabbitmq_bind_list - default: [] - help: 'List of ports on which to listen for AMQP connections (SSL)' - comment: 'New param' - - - name: ssl_options - type: string_list - default: [] - comment: 'New param' - - - name: vm_memory_high_watermark - type: float - default: 0.4 - comment: 'New param' - - - name: vm_memory_high_watermark_paging_ratio - type: float - default: 0.5 - comment: 'New param' - - - name: disk_free_limit - type: integer - default: '50000000' - comment: 'New param' - - - name: log_levels - type: string_list - default: ['{connection, info}'] - comment: 'New param' - - - name: frame_max - type: integer - default: 131072 - comment: 'New param' - - - name: heartbeat - type: integer - default: 600 - comment: 'New param' - - - name: default_vhost - type: string - default: '/' - comment: 'New param' - - - name: default_user - type: string - default: 'guest' - comment: 'New param' - - - name: default_pass - type: string - default: 'guest' - comment: 'New param' - -# ==================================================== diff --git a/rubick/schemas/readme b/rubick/schemas/readme deleted file mode 100644 index 52aad6b..0000000 --- a/rubick/schemas/readme +++ /dev/null @@ -1,3 +0,0 @@ -Examples for schema generator execution: -python rubick/schemas/collector.py cinder 2013.1.3 /usr/lib/python/dist-packages/cinder -python rubick/schemas/collector.py nova 2013.1.3 /usr/lib/python/dist-packages/nova diff --git a/rubick/schemas/swift_account_server/2013.2.1.yml b/rubick/schemas/swift_account_server/2013.2.1.yml deleted file mode 100644 index 9ad2ce8..0000000 --- a/rubick/schemas/swift_account_server/2013.2.1.yml +++ /dev/null @@ -1,237 +0,0 @@ -project: swift_account_server -version: '2013.2.1' -parameters: - - - name: bind_ip - type: string - default: '0.0.0.0' - - - name: bind_port - type: string - default: '6002' - - - name: bind_timeout - type: string - default: '30' - - - name: backlog - type: string - default: '4096' - - - name: user - type: string - default: 'swift' - - - name: swift_dir - type: string - default: '/etc/swift' - - - name: devices - type: string - default: '/srv/node' - - - name: mount_check - type: string - default: 'true' - - - name: disable_fallocate - type: string - default: 'false' - - - name: workers - type: string - default: 'auto' - help: 'Use an integer to override the number of pre-forked processes that will accept connections.' - - - name: max_clients - type: string - default: '1024' - help: 'Maximum concurrent requests per worker' - - - name: account-reaper.log_name - type: string - default: 'account-reaper' - help: "You can override the default log routing for this app here (don't use set!):" - - - name: account-reaper.log_facility - type: string - default: 'LOG_LOCAL0' - help: "You can override the default log routing for this app here (don't use set!):" - - - name: account-reaper.log_level - type: string - default: 'INFO' - help: "You can override the default log routing for this app here (don't use set!):" - - - name: account-reaper.log_address - type: string - default: '/dev/log' - help: "You can override the default log routing for this app here (don't use set!):" - - - name: log_custom_handlers - type: string - default: '' - help: 'comma separated list of functions to call to setup custom log handlers. functions get passed: conf, name, log_to_console, log_route, fmt, logger, adapted_logger' - - - name: log_udp_host - type: string - default: '' - help: 'If set, log_udp_host will override log_address' - - - name: log_udp_port - type: string - default: '514' - help: 'If set, log_udp_host will override log_address' - - - name: log_statsd_host - type: host - default: 'localhost' - help: 'You can enable StatsD logging here:' - - - name: log_statsd_port - type: string - default: '8125' - help: 'You can enable StatsD logging here:' - - - name: log_statsd_default_sample_rate - type: string - default: '1.0' - help: 'You can enable StatsD logging here:' - - - name: log_statsd_sample_rate_factor - type: string - default: '1.0' - help: 'You can enable StatsD logging here:' - - - name: log_statsd_metric_prefix - type: string - default: '' - help: 'You can enable StatsD logging here:' - - - name: db_preallocation - type: string - default: 'off' - help: "If you don't mind the extra disk space usage in overhead, you can turn this on to preallocate disk space with SQLite databases to decrease fragmentation." - - - name: eventlet_debug - type: string - default: 'false' - - - name: fallocate_reserve - type: string - default: '0' - help: "You can set fallocate_reserve to the number of bytes you'd like fallocate to reserve, whether there is space for the given file size or not." - - - name: pipeline:main.pipeline - type: string - default: 'healthcheck recon account-server' - - - name: filter:recon.use - type: string - default: 'egg:swift#recon' - - - name: app:account-server.set log_name - type: string - default: 'account-server' - help: 'You can override the default log routing for this app here:' - - - name: app:account-server.set log_facility - type: string - default: 'LOG_LOCAL0' - help: 'You can override the default log routing for this app here:' - - - name: app:account-server.set log_level - type: string - default: 'INFO' - help: 'You can override the default log routing for this app here:' - - - name: app:account-server.set log_requests - type: string - default: 'true' - help: 'You can override the default log routing for this app here:' - - - name: app:account-server.set log_address - type: string - default: '/dev/log' - help: 'You can override the default log routing for this app here:' - - - name: app:account-server.auto_create_account_prefix - type: string - default: '.' - - - name: app:account-server.replication_server - type: string - default: 'false' - help: "Configure parameter for creating specific server To handle all verbs, including replication verbs, do not specify 'replication_server' (this is the default). To only handle replication, set to a True value (e.g. 'True' or '1'). To handle only non-replication verbs, set to 'False'. Unless you have a separate replication network, you should not specify any value for 'replication_server'." - - - name: filter:healthcheck.disable_path - type: string - default: '' - help: "An optional filesystem path, which if present, will cause the healthcheck URL to return '503 Service Unavailable' with a body of 'DISABLED BY FILE'" - - - name: account-auditor.recon_cache_path - type: string - default: '/var/cache/swift' - - - name: account-replicator.vm_test_mode - type: string - default: 'no' - - - name: account-replicator.per_diff - type: string - default: '1000' - - - name: account-replicator.max_diffs - type: string - default: '100' - - - name: account-reaper.concurrency - type: string - default: '25' - - - name: account-reaper.interval - type: string - default: '3600' - - - name: account-replicator.error_suppression_interval - type: string - default: '60' - help: "How long without an error before a node's error count is reset. This will also be how long before a node is reenabled after suppression is triggered." - - - name: account-replicator.error_suppression_limit - type: string - default: '10' - help: 'How many errors can accumulate before a node is temporarily ignored.' - - - name: account-reaper.node_timeout - type: string - default: '10' - - - name: account-reaper.conn_timeout - type: string - default: '0.5' - - - name: account-replicator.reclaim_age - type: string - default: '604800' - help: 'The replicator also performs reclamation' - - - name: account-replicator.run_pause - type: string - default: '30' - help: 'Time in seconds to wait between replication passes' - - - name: account-auditor.accounts_per_second - type: string - default: '200' - - - name: account-reaper.delay_reaping - type: string - default: '0' - help: 'Normally, the reaper begins deleting account information for deleted accounts immediately; you can set this to delay its work however. The value is in seconds; 2592000 = 30 days for example.' - - - name: account-reaper.reap_warn_after - type: string - default: '2592000' - help: 'If the account fails to be be reaped due to a persistent error, the account reaper will log a message such as: Account has not been reaped since You can search logs for this message if space is not being reclaimed after you delete account(s). Default is 2592000 seconds (30 days). This is in addition to any time requested by delay_reaping.' - diff --git a/rubick/schemas/swift_account_server/swift_account_server.conf.yml b/rubick/schemas/swift_account_server/swift_account_server.conf.yml deleted file mode 100644 index 656f3cf..0000000 --- a/rubick/schemas/swift_account_server/swift_account_server.conf.yml +++ /dev/null @@ -1,289 +0,0 @@ -- version: '2013.2.1' - checkpoint: true - added: - - - name: bind_ip - type: string - default: '0.0.0.0' - comment: 'New param' - - - name: bind_port - type: string - default: '6002' - comment: 'New param' - - - name: bind_timeout - type: string - default: '30' - comment: 'New param' - - - name: backlog - type: string - default: '4096' - comment: 'New param' - - - name: user - type: string - default: 'swift' - comment: 'New param' - - - name: swift_dir - type: string - default: '/etc/swift' - comment: 'New param' - - - name: devices - type: string - default: '/srv/node' - comment: 'New param' - - - name: mount_check - type: string - default: 'true' - comment: 'New param' - - - name: disable_fallocate - type: string - default: 'false' - comment: 'New param' - - - name: workers - type: string - default: 'auto' - help: 'Use an integer to override the number of pre-forked processes that will accept connections.' - comment: 'New param' - - - name: max_clients - type: string - default: '1024' - help: 'Maximum concurrent requests per worker' - comment: 'New param' - - - name: account-reaper.log_name - type: string - default: 'account-reaper' - help: "You can override the default log routing for this app here (don't use set!):" - comment: 'New param' - - - name: account-reaper.log_facility - type: string - default: 'LOG_LOCAL0' - help: "You can override the default log routing for this app here (don't use set!):" - comment: 'New param' - - - name: account-reaper.log_level - type: string - default: 'INFO' - help: "You can override the default log routing for this app here (don't use set!):" - comment: 'New param' - - - name: account-reaper.log_address - type: string - default: '/dev/log' - help: "You can override the default log routing for this app here (don't use set!):" - comment: 'New param' - - - name: log_custom_handlers - type: string - default: '' - help: 'comma separated list of functions to call to setup custom log handlers. functions get passed: conf, name, log_to_console, log_route, fmt, logger, adapted_logger' - comment: 'New param' - - - name: log_udp_host - type: string - default: '' - help: 'If set, log_udp_host will override log_address' - comment: 'New param' - - - name: log_udp_port - type: string - default: '514' - help: 'If set, log_udp_host will override log_address' - comment: 'New param' - - - name: log_statsd_host - type: host - default: 'localhost' - help: 'You can enable StatsD logging here:' - comment: 'New param' - - - name: log_statsd_port - type: string - default: '8125' - help: 'You can enable StatsD logging here:' - comment: 'New param' - - - name: log_statsd_default_sample_rate - type: string - default: '1.0' - help: 'You can enable StatsD logging here:' - comment: 'New param' - - - name: log_statsd_sample_rate_factor - type: string - default: '1.0' - help: 'You can enable StatsD logging here:' - comment: 'New param' - - - name: log_statsd_metric_prefix - type: string - default: '' - help: 'You can enable StatsD logging here:' - comment: 'New param' - - - name: db_preallocation - type: string - default: 'off' - help: "If you don't mind the extra disk space usage in overhead, you can turn this on to preallocate disk space with SQLite databases to decrease fragmentation." - comment: 'New param' - - - name: eventlet_debug - type: string - default: 'false' - comment: 'New param' - - - name: fallocate_reserve - type: string - default: '0' - help: "You can set fallocate_reserve to the number of bytes you'd like fallocate to reserve, whether there is space for the given file size or not." - comment: 'New param' - - - name: 'pipeline:main.pipeline' - type: string - default: 'healthcheck recon account-server' - comment: 'New param' - - - name: 'filter:recon.use' - type: string - default: 'egg:swift#recon' - comment: 'New param' - - - name: 'app:account-server.set log_name' - type: string - default: 'account-server' - help: 'You can override the default log routing for this app here:' - comment: 'New param' - - - name: 'app:account-server.set log_facility' - type: string - default: 'LOG_LOCAL0' - help: 'You can override the default log routing for this app here:' - comment: 'New param' - - - name: 'app:account-server.set log_level' - type: string - default: 'INFO' - help: 'You can override the default log routing for this app here:' - comment: 'New param' - - - name: 'app:account-server.set log_requests' - type: string - default: 'true' - help: 'You can override the default log routing for this app here:' - comment: 'New param' - - - name: 'app:account-server.set log_address' - type: string - default: '/dev/log' - help: 'You can override the default log routing for this app here:' - comment: 'New param' - - - name: 'app:account-server.auto_create_account_prefix' - type: string - default: '.' - comment: 'New param' - - - name: 'app:account-server.replication_server' - type: string - default: 'false' - help: "Configure parameter for creating specific server To handle all verbs, including replication verbs, do not specify 'replication_server' (this is the default). To only handle replication, set to a True value (e.g. 'True' or '1'). To handle only non-replication verbs, set to 'False'. Unless you have a separate replication network, you should not specify any value for 'replication_server'." - comment: 'New param' - - - name: 'filter:healthcheck.disable_path' - type: string - default: '' - help: "An optional filesystem path, which if present, will cause the healthcheck URL to return '503 Service Unavailable' with a body of 'DISABLED BY FILE'" - comment: 'New param' - - - name: account-auditor.recon_cache_path - type: string - default: '/var/cache/swift' - comment: 'New param' - - - name: account-replicator.vm_test_mode - type: string - default: 'no' - comment: 'New param' - - - name: account-replicator.per_diff - type: string - default: '1000' - comment: 'New param' - - - name: account-replicator.max_diffs - type: string - default: '100' - comment: 'New param' - - - name: account-reaper.concurrency - type: string - default: '25' - comment: 'New param' - - - name: account-reaper.interval - type: string - default: '3600' - comment: 'New param' - - - name: account-replicator.error_suppression_interval - type: string - default: '60' - help: "How long without an error before a node's error count is reset. This will also be how long before a node is reenabled after suppression is triggered." - comment: 'New param' - - - name: account-replicator.error_suppression_limit - type: string - default: '10' - help: 'How many errors can accumulate before a node is temporarily ignored.' - comment: 'New param' - - - name: account-reaper.node_timeout - type: string - default: '10' - comment: 'New param' - - - name: account-reaper.conn_timeout - type: string - default: '0.5' - comment: 'New param' - - - name: account-replicator.reclaim_age - type: string - default: '604800' - help: 'The replicator also performs reclamation' - comment: 'New param' - - - name: account-replicator.run_pause - type: string - default: '30' - help: 'Time in seconds to wait between replication passes' - comment: 'New param' - - - name: account-auditor.accounts_per_second - type: string - default: '200' - comment: 'New param' - - - name: account-reaper.delay_reaping - type: string - default: '0' - help: 'Normally, the reaper begins deleting account information for deleted accounts immediately; you can set this to delay its work however. The value is in seconds; 2592000 = 30 days for example.' - comment: 'New param' - - - name: account-reaper.reap_warn_after - type: string - default: '2592000' - help: 'If the account fails to be be reaped due to a persistent error, the account reaper will log a message such as: Account has not been reaped since You can search logs for this message if space is not being reclaimed after you delete account(s). Default is 2592000 seconds (30 days). This is in addition to any time requested by delay_reaping.' - comment: 'New param' - -# ==================================================== diff --git a/rubick/schemas/swift_container_server/2013.2.1.yml b/rubick/schemas/swift_container_server/2013.2.1.yml deleted file mode 100644 index 1083697..0000000 --- a/rubick/schemas/swift_container_server/2013.2.1.yml +++ /dev/null @@ -1,244 +0,0 @@ -project: swift_container_server -version: '2013.2.1' -parameters: - - - name: bind_ip - type: string - default: '0.0.0.0' - - - name: bind_port - type: string - default: '6001' - - - name: bind_timeout - type: string - default: '30' - - - name: backlog - type: string - default: '4096' - - - name: user - type: string - default: 'swift' - - - name: swift_dir - type: string - default: '/etc/swift' - - - name: devices - type: string - default: '/srv/node' - - - name: mount_check - type: string - default: 'true' - - - name: disable_fallocate - type: string - default: 'false' - - - name: workers - type: string - default: 'auto' - help: 'Use an integer to override the number of pre-forked processes that will accept connections.' - - - name: max_clients - type: string - default: '1024' - help: 'Maximum concurrent requests per worker' - - - name: allowed_sync_hosts - type: string - default: '127.0.0.1' - help: 'This is a comma separated list of hosts allowed in the X-Container-Sync-To field for containers.' - - - name: container-sync.log_name - type: string - default: 'container-sync' - help: "You can override the default log routing for this app here (don't use set!):" - - - name: container-sync.log_facility - type: string - default: 'LOG_LOCAL0' - help: "You can override the default log routing for this app here (don't use set!):" - - - name: container-sync.log_level - type: string - default: 'INFO' - help: "You can override the default log routing for this app here (don't use set!):" - - - name: container-sync.log_address - type: string - default: '/dev/log' - help: "You can override the default log routing for this app here (don't use set!):" - - - name: log_custom_handlers - type: string - default: '' - help: 'comma separated list of functions to call to setup custom log handlers. functions get passed: conf, name, log_to_console, log_route, fmt, logger, adapted_logger' - - - name: log_udp_host - type: string - default: '' - help: 'If set, log_udp_host will override log_address' - - - name: log_udp_port - type: string - default: '514' - help: 'If set, log_udp_host will override log_address' - - - name: log_statsd_host - type: host - default: 'localhost' - help: 'You can enable StatsD logging here:' - - - name: log_statsd_port - type: string - default: '8125' - help: 'You can enable StatsD logging here:' - - - name: log_statsd_default_sample_rate - type: string - default: '1.0' - help: 'You can enable StatsD logging here:' - - - name: log_statsd_sample_rate_factor - type: string - default: '1.0' - help: 'You can enable StatsD logging here:' - - - name: log_statsd_metric_prefix - type: string - default: '' - help: 'You can enable StatsD logging here:' - - - name: db_preallocation - type: string - default: 'off' - help: "If you don't mind the extra disk space usage in overhead, you can turn this on to preallocate disk space with SQLite databases to decrease fragmentation." - - - name: eventlet_debug - type: string - default: 'false' - - - name: fallocate_reserve - type: string - default: '0' - help: "You can set fallocate_reserve to the number of bytes you'd like fallocate to reserve, whether there is space for the given file size or not." - - - name: pipeline:main.pipeline - type: string - default: 'healthcheck recon container-server' - - - name: filter:recon.use - type: string - default: 'egg:swift#recon' - - - name: app:container-server.set log_name - type: string - default: 'container-server' - help: 'You can override the default log routing for this app here:' - - - name: app:container-server.set log_facility - type: string - default: 'LOG_LOCAL0' - help: 'You can override the default log routing for this app here:' - - - name: app:container-server.set log_level - type: string - default: 'INFO' - help: 'You can override the default log routing for this app here:' - - - name: app:container-server.set log_requests - type: string - default: 'true' - help: 'You can override the default log routing for this app here:' - - - name: app:container-server.set log_address - type: string - default: '/dev/log' - help: 'You can override the default log routing for this app here:' - - - name: container-updater.node_timeout - type: string - default: '3' - - - name: container-updater.conn_timeout - type: string - default: '0.5' - - - name: app:container-server.allow_versions - type: string - default: 'false' - - - name: app:container-server.auto_create_account_prefix - type: string - default: '.' - - - name: app:container-server.replication_server - type: string - default: 'false' - help: "Configure parameter for creating specific server To handle all verbs, including replication verbs, do not specify 'replication_server' (this is the default). To only handle replication, set to a True value (e.g. 'True' or '1'). To handle only non-replication verbs, set to 'False'. Unless you have a separate replication network, you should not specify any value for 'replication_server'." - - - name: filter:healthcheck.disable_path - type: string - default: '' - help: "An optional filesystem path, which if present, will cause the healthcheck URL to return '503 Service Unavailable' with a body of 'DISABLED BY FILE'" - - - name: container-auditor.recon_cache_path - type: string - default: '/var/cache/swift' - help: 'containers_per_second = 200' - - - name: container-replicator.vm_test_mode - type: string - default: 'no' - - - name: container-replicator.per_diff - type: string - default: '1000' - - - name: container-replicator.max_diffs - type: string - default: '100' - - - name: container-updater.concurrency - type: string - default: '4' - - - name: container-sync.interval - type: string - default: '300' - help: 'Will sync each container at most once per interval' - - - name: container-replicator.reclaim_age - type: string - default: '604800' - help: 'The replicator also performs reclamation' - - - name: container-replicator.run_pause - type: string - default: '30' - help: 'Time in seconds to wait between replication passes' - - - name: container-updater.slowdown - type: string - default: '0.01' - help: 'slowdown will sleep that amount between containers' - - - name: container-updater.account_suppression_time - type: string - default: '60' - help: 'Seconds to suppress updating an account that has generated an error' - - - name: container-sync.sync_proxy - type: string - default: 'http://127.0.0.1:8888' - help: 'If you need to use an HTTP Proxy, set it here; defaults to no proxy.' - - - name: container-sync.container_time - type: string - default: '60' - help: 'Maximum amount of time to spend syncing each container per pass' - diff --git a/rubick/schemas/swift_container_server/swift_container_server.conf.yml b/rubick/schemas/swift_container_server/swift_container_server.conf.yml deleted file mode 100644 index 1ea95de..0000000 --- a/rubick/schemas/swift_container_server/swift_container_server.conf.yml +++ /dev/null @@ -1,297 +0,0 @@ -- version: '2013.2.1' - checkpoint: true - added: - - - name: bind_ip - type: string - default: '0.0.0.0' - comment: 'New param' - - - name: bind_port - type: string - default: '6001' - comment: 'New param' - - - name: bind_timeout - type: string - default: '30' - comment: 'New param' - - - name: backlog - type: string - default: '4096' - comment: 'New param' - - - name: user - type: string - default: 'swift' - comment: 'New param' - - - name: swift_dir - type: string - default: '/etc/swift' - comment: 'New param' - - - name: devices - type: string - default: '/srv/node' - comment: 'New param' - - - name: mount_check - type: string - default: 'true' - comment: 'New param' - - - name: disable_fallocate - type: string - default: 'false' - comment: 'New param' - - - name: workers - type: string - default: 'auto' - help: 'Use an integer to override the number of pre-forked processes that will accept connections.' - comment: 'New param' - - - name: max_clients - type: string - default: '1024' - help: 'Maximum concurrent requests per worker' - comment: 'New param' - - - name: allowed_sync_hosts - type: string - default: '127.0.0.1' - help: 'This is a comma separated list of hosts allowed in the X-Container-Sync-To field for containers.' - comment: 'New param' - - - name: container-sync.log_name - type: string - default: 'container-sync' - help: "You can override the default log routing for this app here (don't use set!):" - comment: 'New param' - - - name: container-sync.log_facility - type: string - default: 'LOG_LOCAL0' - help: "You can override the default log routing for this app here (don't use set!):" - comment: 'New param' - - - name: container-sync.log_level - type: string - default: 'INFO' - help: "You can override the default log routing for this app here (don't use set!):" - comment: 'New param' - - - name: container-sync.log_address - type: string - default: '/dev/log' - help: "You can override the default log routing for this app here (don't use set!):" - comment: 'New param' - - - name: log_custom_handlers - type: string - default: '' - help: 'comma separated list of functions to call to setup custom log handlers. functions get passed: conf, name, log_to_console, log_route, fmt, logger, adapted_logger' - comment: 'New param' - - - name: log_udp_host - type: string - default: '' - help: 'If set, log_udp_host will override log_address' - comment: 'New param' - - - name: log_udp_port - type: string - default: '514' - help: 'If set, log_udp_host will override log_address' - comment: 'New param' - - - name: log_statsd_host - type: host - default: 'localhost' - help: 'You can enable StatsD logging here:' - comment: 'New param' - - - name: log_statsd_port - type: string - default: '8125' - help: 'You can enable StatsD logging here:' - comment: 'New param' - - - name: log_statsd_default_sample_rate - type: string - default: '1.0' - help: 'You can enable StatsD logging here:' - comment: 'New param' - - - name: log_statsd_sample_rate_factor - type: string - default: '1.0' - help: 'You can enable StatsD logging here:' - comment: 'New param' - - - name: log_statsd_metric_prefix - type: string - default: '' - help: 'You can enable StatsD logging here:' - comment: 'New param' - - - name: db_preallocation - type: string - default: 'off' - help: "If you don't mind the extra disk space usage in overhead, you can turn this on to preallocate disk space with SQLite databases to decrease fragmentation." - comment: 'New param' - - - name: eventlet_debug - type: string - default: 'false' - comment: 'New param' - - - name: fallocate_reserve - type: string - default: '0' - help: "You can set fallocate_reserve to the number of bytes you'd like fallocate to reserve, whether there is space for the given file size or not." - comment: 'New param' - - - name: 'pipeline:main.pipeline' - type: string - default: 'healthcheck recon container-server' - comment: 'New param' - - - name: 'filter:recon.use' - type: string - default: 'egg:swift#recon' - comment: 'New param' - - - name: 'app:container-server.set log_name' - type: string - default: 'container-server' - help: 'You can override the default log routing for this app here:' - comment: 'New param' - - - name: 'app:container-server.set log_facility' - type: string - default: 'LOG_LOCAL0' - help: 'You can override the default log routing for this app here:' - comment: 'New param' - - - name: 'app:container-server.set log_level' - type: string - default: 'INFO' - help: 'You can override the default log routing for this app here:' - comment: 'New param' - - - name: 'app:container-server.set log_requests' - type: string - default: 'true' - help: 'You can override the default log routing for this app here:' - comment: 'New param' - - - name: 'app:container-server.set log_address' - type: string - default: '/dev/log' - help: 'You can override the default log routing for this app here:' - comment: 'New param' - - - name: container-updater.node_timeout - type: string - default: '3' - comment: 'New param' - - - name: container-updater.conn_timeout - type: string - default: '0.5' - comment: 'New param' - - - name: 'app:container-server.allow_versions' - type: string - default: 'false' - comment: 'New param' - - - name: 'app:container-server.auto_create_account_prefix' - type: string - default: '.' - comment: 'New param' - - - name: 'app:container-server.replication_server' - type: string - default: 'false' - help: "Configure parameter for creating specific server To handle all verbs, including replication verbs, do not specify 'replication_server' (this is the default). To only handle replication, set to a True value (e.g. 'True' or '1'). To handle only non-replication verbs, set to 'False'. Unless you have a separate replication network, you should not specify any value for 'replication_server'." - comment: 'New param' - - - name: 'filter:healthcheck.disable_path' - type: string - default: '' - help: "An optional filesystem path, which if present, will cause the healthcheck URL to return '503 Service Unavailable' with a body of 'DISABLED BY FILE'" - comment: 'New param' - - - name: container-auditor.recon_cache_path - type: string - default: '/var/cache/swift' - help: 'containers_per_second = 200' - comment: 'New param' - - - name: container-replicator.vm_test_mode - type: string - default: 'no' - comment: 'New param' - - - name: container-replicator.per_diff - type: string - default: '1000' - comment: 'New param' - - - name: container-replicator.max_diffs - type: string - default: '100' - comment: 'New param' - - - name: container-updater.concurrency - type: string - default: '4' - comment: 'New param' - - - name: container-sync.interval - type: string - default: '300' - help: 'Will sync each container at most once per interval' - comment: 'New param' - - - name: container-replicator.reclaim_age - type: string - default: '604800' - help: 'The replicator also performs reclamation' - comment: 'New param' - - - name: container-replicator.run_pause - type: string - default: '30' - help: 'Time in seconds to wait between replication passes' - comment: 'New param' - - - name: container-updater.slowdown - type: string - default: '0.01' - help: 'slowdown will sleep that amount between containers' - comment: 'New param' - - - name: container-updater.account_suppression_time - type: string - default: '60' - help: 'Seconds to suppress updating an account that has generated an error' - comment: 'New param' - - - name: container-sync.sync_proxy - type: string - default: 'http://127.0.0.1:8888' - help: 'If you need to use an HTTP Proxy, set it here; defaults to no proxy.' - comment: 'New param' - - - name: container-sync.container_time - type: string - default: '60' - help: 'Maximum amount of time to spend syncing each container per pass' - comment: 'New param' - -# ==================================================== diff --git a/rubick/schemas/swift_object_server/2013.2.1.yml b/rubick/schemas/swift_object_server/2013.2.1.yml deleted file mode 100644 index 2274b9d..0000000 --- a/rubick/schemas/swift_object_server/2013.2.1.yml +++ /dev/null @@ -1,316 +0,0 @@ -project: swift_object_server -version: '2013.2.1' -parameters: - - - name: bind_ip - type: string - default: '0.0.0.0' - - - name: bind_port - type: string - default: '6000' - - - name: bind_timeout - type: string - default: '30' - - - name: backlog - type: string - default: '4096' - - - name: user - type: string - default: 'swift' - - - name: swift_dir - type: string - default: '/etc/swift' - - - name: devices - type: string - default: '/srv/node' - - - name: mount_check - type: string - default: 'true' - - - name: disable_fallocate - type: string - default: 'false' - - - name: expiring_objects_container_divisor - type: string - default: '86400' - - - name: workers - type: string - default: 'auto' - help: 'Use an integer to override the number of pre-forked processes that will accept connections.' - - - name: max_clients - type: string - default: '1024' - help: 'Maximum concurrent requests per worker' - - - name: object-auditor.log_name - type: string - default: 'object-auditor' - help: "You can override the default log routing for this app here (don't use set!):" - - - name: object-auditor.log_facility - type: string - default: 'LOG_LOCAL0' - help: "You can override the default log routing for this app here (don't use set!):" - - - name: object-auditor.log_level - type: string - default: 'INFO' - help: "You can override the default log routing for this app here (don't use set!):" - - - name: object-auditor.log_address - type: string - default: '/dev/log' - help: "You can override the default log routing for this app here (don't use set!):" - - - name: log_custom_handlers - type: string - default: '' - help: 'comma separated list of functions to call to setup custom log handlers. functions get passed: conf, name, log_to_console, log_route, fmt, logger, adapted_logger' - - - name: log_udp_host - type: string - default: '' - help: 'If set, log_udp_host will override log_address' - - - name: log_udp_port - type: string - default: '514' - help: 'If set, log_udp_host will override log_address' - - - name: log_statsd_host - type: host - default: 'localhost' - help: 'You can enable StatsD logging here:' - - - name: log_statsd_port - type: string - default: '8125' - help: 'You can enable StatsD logging here:' - - - name: log_statsd_default_sample_rate - type: string - default: '1.0' - help: 'You can enable StatsD logging here:' - - - name: log_statsd_sample_rate_factor - type: string - default: '1.0' - help: 'You can enable StatsD logging here:' - - - name: log_statsd_metric_prefix - type: string - default: '' - help: 'You can enable StatsD logging here:' - - - name: eventlet_debug - type: string - default: 'false' - - - name: fallocate_reserve - type: string - default: '0' - help: "You can set fallocate_reserve to the number of bytes you'd like fallocate to reserve, whether there is space for the given file size or not." - - - name: pipeline:main.pipeline - type: string - default: 'healthcheck recon object-server' - - - name: filter:recon.use - type: string - default: 'egg:swift#recon' - - - name: app:object-server.set log_name - type: string - default: 'object-server' - help: 'You can override the default log routing for this app here:' - - - name: app:object-server.set log_facility - type: string - default: 'LOG_LOCAL0' - help: 'You can override the default log routing for this app here:' - - - name: app:object-server.set log_level - type: string - default: 'INFO' - help: 'You can override the default log routing for this app here:' - - - name: app:object-server.set log_requests - type: string - default: 'true' - help: 'You can override the default log routing for this app here:' - - - name: app:object-server.set log_address - type: string - default: '/dev/log' - help: 'You can override the default log routing for this app here:' - - - name: object-updater.node_timeout - type: string - default: '10' - - - name: object-updater.conn_timeout - type: string - default: '0.5' - - - name: app:object-server.network_chunk_size - type: string - default: '65536' - - - name: app:object-server.disk_chunk_size - type: string - default: '65536' - - - name: app:object-server.max_upload_time - type: string - default: '86400' - - - name: app:object-server.slow - type: string - default: '0' - - - name: app:object-server.keep_cache_size - type: string - default: '5424880' - help: 'Objects smaller than this are not evicted from the buffercache once read' - - - name: app:object-server.keep_cache_private - type: string - default: 'false' - help: 'If true, objects for authenticated GET requests may be kept in buffer cache if small enough' - - - name: app:object-server.mb_per_sync - type: string - default: '512' - help: 'on PUTs, sync data every n MB' - - - name: app:object-server.allowed_headers - type: string - default: 'Content-Disposition, Content-Encoding, X-Delete-At, X-Object-Manifest, X-Static-Large-Object' - help: 'Comma separated list of headers that can be set in metadata on an object. This list is in addition to X-Object-Meta-* headers and cannot include Content-Type, etag, Content-Length, or deleted' - - - name: app:object-server.auto_create_account_prefix - type: string - default: '.' - - - name: app:object-server.replication_server - type: string - default: 'false' - help: "Configure parameter for creating specific server To handle all verbs, including replication verbs, do not specify 'replication_server' (this is the default). To only handle replication, set to a True value (e.g. 'True' or '1'). To handle only non-replication verbs, set to 'False'. Unless you have a separate replication network, you should not specify any value for 'replication_server'." - - - name: app:object-server.threads_per_disk - type: string - default: '0' - help: "Configure parameter for creating specific server To handle all verbs, including replication verbs, do not specify 'replication_server' (this is the default). To only handle replication, set to a True value (e.g. 'True' or '1'). To handle only non-replication verbs, set to 'False'. Unless you have a separate replication network, you should not specify any value for 'replication_server'. A value of 0 means 'don't use thread pools'. A reasonable starting point is 4." - - - name: filter:healthcheck.disable_path - type: string - default: '' - help: "An optional filesystem path, which if present, will cause the healthcheck URL to return '503 Service Unavailable' with a body of 'DISABLED BY FILE'" - - - name: object-auditor.recon_cache_path - type: string - default: '/var/cache/swift' - - - name: filter:recon.recon_lock_path - type: string - default: '/var/lock' - - - name: object-replicator.vm_test_mode - type: string - default: 'no' - - - name: object-replicator.daemonize - type: string - default: 'on' - - - name: object-replicator.run_pause - type: string - default: '30' - - - name: object-updater.concurrency - type: string - default: '1' - - - name: object-replicator.stats_interval - type: string - default: '300' - - - name: object-replicator.rsync_timeout - type: string - default: '900' - help: 'max duration of a partition rsync' - - - name: object-replicator.rsync_bwlimit - type: string - default: '0' - help: 'bandwith limit for rsync in kB/s. 0 means unlimited' - - - name: object-replicator.rsync_io_timeout - type: string - default: '30' - help: 'passed to rsync for io op timeout' - - - name: object-replicator.http_timeout - type: string - default: '60' - help: 'max duration of an http request' - - - name: object-replicator.lockup_timeout - type: string - default: '1800' - help: 'attempts to kill all workers if nothing replicates for lockup_timeout seconds' - - - name: object-replicator.reclaim_age - type: string - default: '604800' - help: 'The replicator also performs reclamation' - - - name: object-replicator.ring_check_interval - type: string - default: '15' - - - name: object-replicator.rsync_error_log_line_length - type: string - default: '0' - help: 'limits how long rsync error log lines are 0 means to log the entire line' - - - name: object-updater.interval - type: string - default: '300' - - - name: object-updater.slowdown - type: string - default: '0.01' - help: 'slowdown will sleep that amount between objects' - - - name: object-auditor.files_per_second - type: string - default: '20' - - - name: object-auditor.bytes_per_second - type: string - default: '10000000' - - - name: object-auditor.log_time - type: string - default: '3600' - - - name: object-auditor.zero_byte_files_per_second - type: string - default: '50' - - - name: object-auditor.object_size_stats - type: string - default: '' - help: 'Takes a comma separated list of ints. If set, the object auditor will increment a counter for every object whose size is <= to the given break points and report the result after a full scan.' - diff --git a/rubick/schemas/swift_object_server/swift_object_server.conf.yml b/rubick/schemas/swift_object_server/swift_object_server.conf.yml deleted file mode 100644 index 4f379e1..0000000 --- a/rubick/schemas/swift_object_server/swift_object_server.conf.yml +++ /dev/null @@ -1,386 +0,0 @@ -- version: '2013.2.1' - checkpoint: true - added: - - - name: bind_ip - type: string - default: '0.0.0.0' - comment: 'New param' - - - name: bind_port - type: string - default: '6000' - comment: 'New param' - - - name: bind_timeout - type: string - default: '30' - comment: 'New param' - - - name: backlog - type: string - default: '4096' - comment: 'New param' - - - name: user - type: string - default: 'swift' - comment: 'New param' - - - name: swift_dir - type: string - default: '/etc/swift' - comment: 'New param' - - - name: devices - type: string - default: '/srv/node' - comment: 'New param' - - - name: mount_check - type: string - default: 'true' - comment: 'New param' - - - name: disable_fallocate - type: string - default: 'false' - comment: 'New param' - - - name: expiring_objects_container_divisor - type: string - default: '86400' - comment: 'New param' - - - name: workers - type: string - default: 'auto' - help: 'Use an integer to override the number of pre-forked processes that will accept connections.' - comment: 'New param' - - - name: max_clients - type: string - default: '1024' - help: 'Maximum concurrent requests per worker' - comment: 'New param' - - - name: object-auditor.log_name - type: string - default: 'object-auditor' - help: "You can override the default log routing for this app here (don't use set!):" - comment: 'New param' - - - name: object-auditor.log_facility - type: string - default: 'LOG_LOCAL0' - help: "You can override the default log routing for this app here (don't use set!):" - comment: 'New param' - - - name: object-auditor.log_level - type: string - default: 'INFO' - help: "You can override the default log routing for this app here (don't use set!):" - comment: 'New param' - - - name: object-auditor.log_address - type: string - default: '/dev/log' - help: "You can override the default log routing for this app here (don't use set!):" - comment: 'New param' - - - name: log_custom_handlers - type: string - default: '' - help: 'comma separated list of functions to call to setup custom log handlers. functions get passed: conf, name, log_to_console, log_route, fmt, logger, adapted_logger' - comment: 'New param' - - - name: log_udp_host - type: string - default: '' - help: 'If set, log_udp_host will override log_address' - comment: 'New param' - - - name: log_udp_port - type: string - default: '514' - help: 'If set, log_udp_host will override log_address' - comment: 'New param' - - - name: log_statsd_host - type: host - default: 'localhost' - help: 'You can enable StatsD logging here:' - comment: 'New param' - - - name: log_statsd_port - type: string - default: '8125' - help: 'You can enable StatsD logging here:' - comment: 'New param' - - - name: log_statsd_default_sample_rate - type: string - default: '1.0' - help: 'You can enable StatsD logging here:' - comment: 'New param' - - - name: log_statsd_sample_rate_factor - type: string - default: '1.0' - help: 'You can enable StatsD logging here:' - comment: 'New param' - - - name: log_statsd_metric_prefix - type: string - default: '' - help: 'You can enable StatsD logging here:' - comment: 'New param' - - - name: eventlet_debug - type: string - default: 'false' - comment: 'New param' - - - name: fallocate_reserve - type: string - default: '0' - help: "You can set fallocate_reserve to the number of bytes you'd like fallocate to reserve, whether there is space for the given file size or not." - comment: 'New param' - - - name: 'pipeline:main.pipeline' - type: string - default: 'healthcheck recon object-server' - comment: 'New param' - - - name: 'filter:recon.use' - type: string - default: 'egg:swift#recon' - comment: 'New param' - - - name: 'app:object-server.set log_name' - type: string - default: 'object-server' - help: 'You can override the default log routing for this app here:' - comment: 'New param' - - - name: 'app:object-server.set log_facility' - type: string - default: 'LOG_LOCAL0' - help: 'You can override the default log routing for this app here:' - comment: 'New param' - - - name: 'app:object-server.set log_level' - type: string - default: 'INFO' - help: 'You can override the default log routing for this app here:' - comment: 'New param' - - - name: 'app:object-server.set log_requests' - type: string - default: 'true' - help: 'You can override the default log routing for this app here:' - comment: 'New param' - - - name: 'app:object-server.set log_address' - type: string - default: '/dev/log' - help: 'You can override the default log routing for this app here:' - comment: 'New param' - - - name: object-updater.node_timeout - type: string - default: '10' - comment: 'New param' - - - name: object-updater.conn_timeout - type: string - default: '0.5' - comment: 'New param' - - - name: 'app:object-server.network_chunk_size' - type: string - default: '65536' - comment: 'New param' - - - name: 'app:object-server.disk_chunk_size' - type: string - default: '65536' - comment: 'New param' - - - name: 'app:object-server.max_upload_time' - type: string - default: '86400' - comment: 'New param' - - - name: 'app:object-server.slow' - type: string - default: '0' - comment: 'New param' - - - name: 'app:object-server.keep_cache_size' - type: string - default: '5424880' - help: 'Objects smaller than this are not evicted from the buffercache once read' - comment: 'New param' - - - name: 'app:object-server.keep_cache_private' - type: string - default: 'false' - help: 'If true, objects for authenticated GET requests may be kept in buffer cache if small enough' - comment: 'New param' - - - name: 'app:object-server.mb_per_sync' - type: string - default: '512' - help: 'on PUTs, sync data every n MB' - comment: 'New param' - - - name: 'app:object-server.allowed_headers' - type: string - default: 'Content-Disposition, Content-Encoding, X-Delete-At, X-Object-Manifest, X-Static-Large-Object' - help: 'Comma separated list of headers that can be set in metadata on an object. This list is in addition to X-Object-Meta-* headers and cannot include Content-Type, etag, Content-Length, or deleted' - comment: 'New param' - - - name: 'app:object-server.auto_create_account_prefix' - type: string - default: '.' - comment: 'New param' - - - name: 'app:object-server.replication_server' - type: string - default: 'false' - help: "Configure parameter for creating specific server To handle all verbs, including replication verbs, do not specify 'replication_server' (this is the default). To only handle replication, set to a True value (e.g. 'True' or '1'). To handle only non-replication verbs, set to 'False'. Unless you have a separate replication network, you should not specify any value for 'replication_server'." - comment: 'New param' - - - name: 'app:object-server.threads_per_disk' - type: string - default: '0' - help: "Configure parameter for creating specific server To handle all verbs, including replication verbs, do not specify 'replication_server' (this is the default). To only handle replication, set to a True value (e.g. 'True' or '1'). To handle only non-replication verbs, set to 'False'. Unless you have a separate replication network, you should not specify any value for 'replication_server'. A value of 0 means 'don't use thread pools'. A reasonable starting point is 4." - comment: 'New param' - - - name: 'filter:healthcheck.disable_path' - type: string - default: '' - help: "An optional filesystem path, which if present, will cause the healthcheck URL to return '503 Service Unavailable' with a body of 'DISABLED BY FILE'" - comment: 'New param' - - - name: object-auditor.recon_cache_path - type: string - default: '/var/cache/swift' - comment: 'New param' - - - name: 'filter:recon.recon_lock_path' - type: string - default: '/var/lock' - comment: 'New param' - - - name: object-replicator.vm_test_mode - type: string - default: 'no' - comment: 'New param' - - - name: object-replicator.daemonize - type: string - default: 'on' - comment: 'New param' - - - name: object-replicator.run_pause - type: string - default: '30' - comment: 'New param' - - - name: object-updater.concurrency - type: string - default: '1' - comment: 'New param' - - - name: object-replicator.stats_interval - type: string - default: '300' - comment: 'New param' - - - name: object-replicator.rsync_timeout - type: string - default: '900' - help: 'max duration of a partition rsync' - comment: 'New param' - - - name: object-replicator.rsync_bwlimit - type: string - default: '0' - help: 'bandwith limit for rsync in kB/s. 0 means unlimited' - comment: 'New param' - - - name: object-replicator.rsync_io_timeout - type: string - default: '30' - help: 'passed to rsync for io op timeout' - comment: 'New param' - - - name: object-replicator.http_timeout - type: string - default: '60' - help: 'max duration of an http request' - comment: 'New param' - - - name: object-replicator.lockup_timeout - type: string - default: '1800' - help: 'attempts to kill all workers if nothing replicates for lockup_timeout seconds' - comment: 'New param' - - - name: object-replicator.reclaim_age - type: string - default: '604800' - help: 'The replicator also performs reclamation' - comment: 'New param' - - - name: object-replicator.ring_check_interval - type: string - default: '15' - comment: 'New param' - - - name: object-replicator.rsync_error_log_line_length - type: string - default: '0' - help: 'limits how long rsync error log lines are 0 means to log the entire line' - comment: 'New param' - - - name: object-updater.interval - type: string - default: '300' - comment: 'New param' - - - name: object-updater.slowdown - type: string - default: '0.01' - help: 'slowdown will sleep that amount between objects' - comment: 'New param' - - - name: object-auditor.files_per_second - type: string - default: '20' - comment: 'New param' - - - name: object-auditor.bytes_per_second - type: string - default: '10000000' - comment: 'New param' - - - name: object-auditor.log_time - type: string - default: '3600' - comment: 'New param' - - - name: object-auditor.zero_byte_files_per_second - type: string - default: '50' - comment: 'New param' - - - name: object-auditor.object_size_stats - type: string - default: '' - help: 'Takes a comma separated list of ints. If set, the object auditor will increment a counter for every object whose size is <= to the given break points and report the result after a full scan.' - comment: 'New param' - -# ==================================================== diff --git a/rubick/schemas/swift_proxy_server/2013.2.1.yml b/rubick/schemas/swift_proxy_server/2013.2.1.yml deleted file mode 100644 index ccb3e68..0000000 --- a/rubick/schemas/swift_proxy_server/2013.2.1.yml +++ /dev/null @@ -1,625 +0,0 @@ -project: swift_proxy_server -version: '2013.2.1' -parameters: - - - name: bind_ip - type: string - default: '0.0.0.0' - - - name: bind_port - type: string - default: '80' - - - name: bind_timeout - type: string - default: '30' - - - name: backlog - type: string - default: '4096' - - - name: swift_dir - type: string - default: '/etc/swift' - - - name: user - type: string - default: 'swift' - - - name: workers - type: string - default: 'auto' - help: "Use an integer to override the number of pre-forked processes that will accept connections. Should default to the number of effective cpu cores in the system. It's worth noting that individual workers will use many eventlet co-routines to service multiple concurrent requests." - - - name: max_clients - type: string - default: '1024' - help: 'Maximum concurrent requests per worker' - - - name: cert_file - type: string - default: '/etc/swift/proxy.crt' - help: 'Set the following two lines to enable SSL. This is for testing only.' - - - name: key_file - type: string - default: '/etc/swift/proxy.key' - help: 'Set the following two lines to enable SSL. This is for testing only.' - - - name: log_name - type: string - default: 'swift' - help: 'You can specify default log routing here if you want:' - - - name: log_facility - type: string - default: 'LOG_LOCAL0' - help: 'You can specify default log routing here if you want:' - - - name: log_level - type: string - default: 'INFO' - help: 'You can specify default log routing here if you want:' - - - name: log_headers - type: string - default: 'false' - help: 'You can specify default log routing here if you want:' - - - name: log_address - type: string - default: '/dev/log' - help: 'You can specify default log routing here if you want:' - - - name: trans_id_suffix - type: string - default: '' - help: 'This optional suffix (default is empty) that would be appended to the swift transaction id allows one to easily figure out from which cluster that X-Trans-Id belongs to. This is very useful when one is managing more than one swift cluster.' - - - name: log_custom_handlers - type: string - default: '' - help: 'comma separated list of functions to call to setup custom log handlers. functions get passed: conf, name, log_to_console, log_route, fmt, logger, adapted_logger' - - - name: log_udp_host - type: string - default: '' - help: 'If set, log_udp_host will override log_address' - - - name: log_udp_port - type: string - default: '514' - help: 'If set, log_udp_host will override log_address' - - - name: log_statsd_host - type: host - default: 'localhost' - help: 'You can enable StatsD logging here:' - - - name: log_statsd_port - type: string - default: '8125' - help: 'You can enable StatsD logging here:' - - - name: log_statsd_default_sample_rate - type: string - default: '1.0' - help: 'You can enable StatsD logging here:' - - - name: log_statsd_sample_rate_factor - type: string - default: '1.0' - help: 'You can enable StatsD logging here:' - - - name: log_statsd_metric_prefix - type: string - default: '' - help: 'You can enable StatsD logging here:' - - - name: cors_allow_origin - type: string - default: '' - help: 'Use a comma separated list of full url (http://foo.bar:1234,https://foo.bar)' - - - name: client_timeout - type: string - default: '60' - - - name: eventlet_debug - type: string - default: 'false' - - - name: pipeline:main.pipeline - type: string - default: 'catch_errors healthcheck proxy-logging cache bulk slo ratelimit tempauth container-quotas account-quotas proxy-logging proxy-server' - - - name: filter:account-quotas.use - type: string - default: 'egg:swift#account_quotas' - - - name: filter:cname_lookup.set log_name - type: string - default: 'cname_lookup' - help: 'Note: this middleware requires python-dnspython You can override the default log routing for this filter here:' - - - name: filter:cname_lookup.set log_facility - type: string - default: 'LOG_LOCAL0' - help: 'Note: this middleware requires python-dnspython You can override the default log routing for this filter here:' - - - name: filter:cname_lookup.set log_level - type: string - default: 'INFO' - help: 'Note: this middleware requires python-dnspython You can override the default log routing for this filter here:' - - - name: filter:cname_lookup.set log_address - type: string - default: '/dev/log' - help: 'Note: this middleware requires python-dnspython You can override the default log routing for this filter here:' - - - name: app:proxy-server.log_handoffs - type: string - default: 'true' - - - name: app:proxy-server.recheck_account_existence - type: string - default: '60' - - - name: app:proxy-server.recheck_container_existence - type: string - default: '60' - - - name: app:proxy-server.object_chunk_size - type: string - default: '8192' - - - name: app:proxy-server.client_chunk_size - type: string - default: '8192' - - - name: app:proxy-server.node_timeout - type: string - default: '10' - - - name: app:proxy-server.conn_timeout - type: string - default: '0.5' - - - name: app:proxy-server.error_suppression_interval - type: string - default: '60' - help: "How long without an error before a node's error count is reset. This will also be how long before a node is reenabled after suppression is triggered." - - - name: app:proxy-server.error_suppression_limit - type: string - default: '10' - help: 'How many errors can accumulate before a node is temporarily ignored.' - - - name: app:proxy-server.allow_account_management - type: string - default: 'false' - help: "If set to 'true' any authorized user may create and delete accounts; if 'false' no one, even authorized, can." - - - name: app:proxy-server.object_post_as_copy - type: string - default: 'true' - help: "Set object_post_as_copy = false to turn on fast posts where only the metadata changes are stored anew and the original data file is kept in place. This makes for quicker posts; but since the container metadata isn't updated in this mode, features like container sync won't be able to sync posts." - - - name: app:proxy-server.account_autocreate - type: string - default: 'false' - help: "If set to 'true' authorized accounts that do not yet exist within the Swift cluster will be automatically created." - - - name: app:proxy-server.max_containers_per_account - type: string - default: '0' - help: 'If set to a positive value, trying to create a container when the account already has at least this maximum containers will result in a 403 Forbidden. Note: This is a soft limit, meaning a user might exceed the cap for recheck_account_existence before the 403s kick in.' - - - name: app:proxy-server.max_containers_whitelist - type: string - default: '' - help: 'This is a comma separated list of account hashes that ignore the max_containers_per_account cap.' - - - name: app:proxy-server.deny_host_headers - type: string - default: '' - help: 'Comma separated list of Host headers to which the proxy will deny requests.' - - - name: app:proxy-server.auto_create_account_prefix - type: string - default: '.' - help: 'Prefix used when automatically creating accounts.' - - - name: app:proxy-server.put_queue_depth - type: string - default: '10' - help: 'Depth of the proxy put queue.' - - - name: app:proxy-server.rate_limit_after_segment - type: string - default: '10' - help: 'Start rate-limiting object segment serving after the Nth segment of a segmented object.' - - - name: app:proxy-server.rate_limit_segments_per_sec - type: string - default: '1' - help: 'Once segment rate-limiting kicks in for an object, limit segments served to N per second.' - - - name: app:proxy-server.sorting_method - type: string - default: 'shuffle' - help: "Storage nodes can be chosen at random (shuffle), by using timing measurements (timing), or by using an explicit match (affinity). Using timing measurements may allow for lower overall latency, while using affinity allows for finer control. In both the timing and affinity cases, equally-sorting nodes are still randomly chosen to spread load. The valid values for sorting_method are 'affinity', 'shuffle', and 'timing'." - - - name: app:proxy-server.timing_expiry - type: string - default: '300' - help: "If the 'timing' sorting_method is used, the timings will only be valid for the number of seconds configured by timing_expiry." - - - name: app:proxy-server.allow_static_large_object - type: string - default: 'true' - help: "If set to false will treat objects with X-Static-Large-Object header set as a regular object on GETs, i.e. will return that object's contents. Should be set to false if slo is not used in pipeline." - - - name: app:proxy-server.max_large_object_get_time - type: string - default: '86400' - help: 'The maximum time (seconds) that a large object connection is allowed to last.' - - - name: app:proxy-server.request_node_count - type: string - default: '2 * replicas' - help: "Set to the number of nodes to contact for a normal request. You can use '* replicas' at the end to have it use the number given times the number of replicas for the ring being used for the request." - - - name: app:proxy-server.read_affinity - type: string - default: '' - help: 'Example: first read from region 1 zone 1, then region 1 zone 2, then anything in region 2, then everything else: read_affinity = r1z1=100, r1z2=200, r2=300 Default is empty, meaning no preference.' - - - name: app:proxy-server.write_affinity - type: string - default: '' - help: 'Example: try to write to regions 1 and 2 before writing to any other nodes: write_affinity = r1, r2 Default is empty, meaning no preference.' - - - name: app:proxy-server.write_affinity_node_count - type: string - default: '2 * replicas' - help: "The number of local (as governed by the write_affinity setting) nodes to attempt to contact first, before any non-local ones. You can use '* replicas' at the end to have it use the number given times the number of replicas for the ring being used for the request." - - - name: app:proxy-server.swift_owner_headers - type: string - default: 'x-container-read, x-container-write, x-container-sync-key, x-container-sync-to, x-account-meta-temp-url-key, x-account-meta-temp-url-key-2' - help: 'These are the headers whose values will only be shown to swift_owners. The exact definition of a swift_owner is up to the auth system in use, but usually indicates administrative responsibilities.' - - - name: filter:cname_lookup.set log_headers - type: string - default: 'false' - help: 'Note: this middleware requires python-dnspython You can override the default log routing for this filter here:' - - - name: filter:tempauth.reseller_prefix - type: string - default: 'AUTH' - help: 'The reseller prefix will verify a token begins with this prefix before even attempting to validate it. Also, with authorization, only Swift storage accounts with this prefix will be authorized by this middleware. Useful if multiple auth systems are in use for one Swift cluster.' - - - name: filter:tempauth.auth_prefix - type: string - default: '/auth/' - help: 'The auth prefix will cause requests beginning with this prefix to be routed to the auth subsystem, for granting tokens, etc.' - - - name: filter:tempauth.token_life - type: string - default: '86400' - help: 'The auth prefix will cause requests beginning with this prefix to be routed to the auth subsystem, for granting tokens, etc.' - - - name: filter:tempauth.allow_overrides - type: string - default: 'true' - help: "This allows middleware higher in the WSGI pipeline to override auth processing, useful for middleware such as tempurl and formpost. If you know you're not going to use such middleware and you want a bit of extra security, you can set this to false." - - - name: filter:tempauth.storage_url_scheme - type: string - default: 'default' - help: 'This specifies what scheme to return with storage urls: http, https, or default (chooses based on what the server is running as) This can be useful with an SSL load balancer in front of a non-SSL server.' - - - name: filter:tempauth.user_admin_admin - type: string - default: 'admin .admin .reseller_admin' - help: 'Lastly, you need to list all the accounts/users you want here. The format is: user__ = [group] [group] [...] [storage_url] or if you want underscores in or , you can base64 encode them (with no equal signs) and use this format: user64__ = [group] [group] [...] [storage_url] There are special groups of: .reseller_admin = can do anything to any account for this auth .admin = can do anything within the account If neither of these groups are specified, the user can only access containers that have been explicitly allowed for them by a .admin or .reseller_admin. The trailing optional storage_url allows you to specify an alternate url to hand back to the user upon authentication. If not specified, this defaults to $HOST/v1/_ where $HOST will do its best to resolve to what the requester would need to use to reach this host. Here are example entries, required for running the tests:' - - - name: filter:tempauth.user_test_tester - type: string - default: 'testing .admin' - help: 'Lastly, you need to list all the accounts/users you want here. The format is: user__ = [group] [group] [...] [storage_url] or if you want underscores in or , you can base64 encode them (with no equal signs) and use this format: user64__ = [group] [group] [...] [storage_url] There are special groups of: .reseller_admin = can do anything to any account for this auth .admin = can do anything within the account If neither of these groups are specified, the user can only access containers that have been explicitly allowed for them by a .admin or .reseller_admin. The trailing optional storage_url allows you to specify an alternate url to hand back to the user upon authentication. If not specified, this defaults to $HOST/v1/_ where $HOST will do its best to resolve to what the requester would need to use to reach this host. Here are example entries, required for running the tests:' - - - name: filter:tempauth.user_test2_tester2 - type: string - default: 'testing2 .admin' - help: 'Lastly, you need to list all the accounts/users you want here. The format is: user__ = [group] [group] [...] [storage_url] or if you want underscores in or , you can base64 encode them (with no equal signs) and use this format: user64__ = [group] [group] [...] [storage_url] There are special groups of: .reseller_admin = can do anything to any account for this auth .admin = can do anything within the account If neither of these groups are specified, the user can only access containers that have been explicitly allowed for them by a .admin or .reseller_admin. The trailing optional storage_url allows you to specify an alternate url to hand back to the user upon authentication. If not specified, this defaults to $HOST/v1/_ where $HOST will do its best to resolve to what the requester would need to use to reach this host. Here are example entries, required for running the tests:' - - - name: filter:tempauth.user_test_tester3 - type: string - default: 'testing3' - help: 'Lastly, you need to list all the accounts/users you want here. The format is: user__ = [group] [group] [...] [storage_url] or if you want underscores in or , you can base64 encode them (with no equal signs) and use this format: user64__ = [group] [group] [...] [storage_url] There are special groups of: .reseller_admin = can do anything to any account for this auth .admin = can do anything within the account If neither of these groups are specified, the user can only access containers that have been explicitly allowed for them by a .admin or .reseller_admin. The trailing optional storage_url allows you to specify an alternate url to hand back to the user upon authentication. If not specified, this defaults to $HOST/v1/_ where $HOST will do its best to resolve to what the requester would need to use to reach this host. Here are example entries, required for running the tests:' - - - name: filter:tempauth.paste.filter_factory - type: string - default: 'keystoneclient.middleware.auth_token:filter_factory' - help: '[filter:authtoken]' - - - name: filter:tempauth.auth_host - type: string - default: 'keystonehost' - help: '[filter:authtoken]' - - - name: filter:tempauth.auth_port - type: string - default: '35357' - help: '[filter:authtoken]' - - - name: filter:tempauth.auth_protocol - type: string - default: 'http' - help: '[filter:authtoken]' - - - name: filter:tempauth.auth_uri - type: string - default: 'http://keystonehost:5000/' - help: '[filter:authtoken]' - - - name: filter:tempauth.admin_tenant_name - type: string - default: 'service' - help: '[filter:authtoken]' - - - name: filter:tempauth.admin_user - type: string - default: 'swift' - help: '[filter:authtoken]' - - - name: filter:tempauth.admin_password - type: string - default: 'password' - help: '[filter:authtoken]' - - - name: filter:tempauth.delay_auth_decision - type: string - default: '1' - help: '[filter:authtoken]' - - - name: filter:tempauth.cache - type: string - default: 'swift.cache' - help: '[filter:authtoken]' - - - name: filter:tempauth.operator_roles - type: string - default: 'admin, swiftoperator' - help: '[filter:keystoneauth] Operator roles is the role which user would be allowed to manage a tenant and be able to create container or give ACL to others.' - - - name: filter:tempauth.reseller_admin_role - type: string - default: 'ResellerAdmin' - help: '[filter:keystoneauth] Operator roles is the role which user would be allowed to manage a tenant and be able to create container or give ACL to others. The reseller admin role has the ability to create and delete accounts' - - - name: filter:healthcheck.disable_path - type: string - default: '' - help: "An optional filesystem path, which if present, will cause the healthcheck URL to return '503 Service Unavailable' with a body of 'DISABLED BY FILE'. This facility may be used to temporarily remove a Swift node from a load balancer pool during maintenance or upgrade (remove the file to allow the node back into the load balancer pool)." - - - name: filter:cache.memcache_servers - type: string - default: '127.0.0.1:11211' - help: 'If not set here, the value for memcache_servers will be read from memcache.conf (see memcache.conf-sample) or lacking that file, it will default to the value below. You can specify multiple servers separated with commas, as in: 10.1.2.3:11211,10.1.2.4:11211' - - - name: filter:cache.memcache_serialization_support - type: string - default: '2' - help: 'Sets how memcache values are serialized and deserialized: 0 = older, insecure pickle serialization 1 = json serialization but pickles can still be read (still insecure) 2 = json serialization only (secure and the default) If not set here, the value for memcache_serialization_support will be read from /etc/swift/memcache.conf (see memcache.conf-sample). To avoid an instant full cache flush, existing installations should upgrade with 0, then set to 1 and reload, then after some time (24 hours) set to 2 and reload. In the future, the ability to use pickle serialization will be removed.' - - - name: filter:ratelimit.clock_accuracy - type: string - default: '1000' - help: "clock_accuracy should represent how accurate the proxy servers' system clocks are with each other. 1000 means that all the proxies' clock are accurate to each other within 1 millisecond. No ratelimit should be higher than the clock accuracy." - - - name: filter:ratelimit.max_sleep_time_seconds - type: string - default: '60' - - - name: filter:ratelimit.log_sleep_time_seconds - type: string - default: '0' - help: 'log_sleep_time_seconds of 0 means disabled' - - - name: filter:ratelimit.rate_buffer_seconds - type: string - default: '5' - help: "allows for slow rates (e.g. running up to 5 sec's behind) to catch up." - - - name: filter:ratelimit.account_ratelimit - type: string - default: '0' - help: 'account_ratelimit of 0 means disabled' - - - name: filter:ratelimit.account_whitelist - type: string - default: 'a,b' - help: 'these are comma separated lists of account names' - - - name: filter:ratelimit.account_blacklist - type: string - default: 'c,d' - help: 'these are comma separated lists of account names' - - - name: filter:ratelimit.with container_limit_x - type: string - default: 'r' - - - name: filter:ratelimit.container_ratelimit_0 - type: string - default: '100' - help: 'for containers of size x limit write requests per second to r. The container rate will be linearly interpolated from the values given. With the values below, a container of size 5 will get a rate of 75.' - - - name: filter:ratelimit.container_ratelimit_10 - type: string - default: '50' - help: 'for containers of size x limit write requests per second to r. The container rate will be linearly interpolated from the values given. With the values below, a container of size 5 will get a rate of 75.' - - - name: filter:ratelimit.container_ratelimit_50 - type: string - default: '20' - help: 'for containers of size x limit write requests per second to r. The container rate will be linearly interpolated from the values given. With the values below, a container of size 5 will get a rate of 75.' - - - name: filter:ratelimit.container_listing_ratelimit_0 - type: string - default: '100' - help: 'Similarly to the above container-level write limits, the following will limit container GET (listing) requests.' - - - name: filter:ratelimit.container_listing_ratelimit_10 - type: string - default: '50' - help: 'Similarly to the above container-level write limits, the following will limit container GET (listing) requests.' - - - name: filter:ratelimit.container_listing_ratelimit_50 - type: string - default: '20' - help: 'Similarly to the above container-level write limits, the following will limit container GET (listing) requests.' - - - name: filter:cname_lookup.storage_domain - type: string - default: 'example.com' - - - name: filter:domain_remap.path_root - type: string - default: 'v1' - - - name: filter:domain_remap.reseller_prefixes - type: string - default: 'AUTH' - - - name: filter:cname_lookup.lookup_depth - type: string - default: '1' - - - name: filter:tempurl.methods - type: string - default: 'GET HEAD PUT' - help: 'The methods allowed with Temp URLs.' - - - name: filter:tempurl.incoming_remove_headers - type: string - default: 'x-timestamp' - help: "The headers to remove from incoming requests. Simply a whitespace delimited list of header names and names can optionally end with '*' to indicate a prefix match. incoming_allow_headers is a list of exceptions to these removals." - - - name: filter:tempurl.incoming_allow_headers - type: string - default: '' - help: "The headers allowed as exceptions to incoming_remove_headers. Simply a whitespace delimited list of header names and names can optionally end with '*' to indicate a prefix match." - - - name: filter:tempurl.outgoing_remove_headers - type: string - default: 'x-object-meta-*' - help: "The headers to remove from outgoing responses. Simply a whitespace delimited list of header names and names can optionally end with '*' to indicate a prefix match. outgoing_allow_headers is a list of exceptions to these removals." - - - name: filter:name_check.forbidden_chars - type: string - default: "\\'\"`<>" - - - name: filter:name_check.maximum_length - type: string - default: '255' - - - name: filter:name_check.forbidden_regexp - type: string - default: '/\\./|/\\.\\./|/\\.$|/\\.\\.$' - - - name: filter:list-endpoints.list_endpoints_path - type: string - default: '/endpoints/' - - - name: filter:proxy-logging.access_log_name - type: string - default: 'swift' - help: "If not set, logging directives from [DEFAULT] without 'access_' will be used" - - - name: filter:proxy-logging.access_log_facility - type: string - default: 'LOG_LOCAL0' - help: "If not set, logging directives from [DEFAULT] without 'access_' will be used" - - - name: filter:proxy-logging.access_log_level - type: string - default: 'INFO' - help: "If not set, logging directives from [DEFAULT] without 'access_' will be used" - - - name: filter:proxy-logging.access_log_address - type: string - default: '/dev/log' - help: "If not set, logging directives from [DEFAULT] without 'access_' will be used" - - - name: filter:proxy-logging.access_log_udp_host - type: string - default: '' - help: 'If set, access_log_udp_host will override access_log_address' - - - name: filter:proxy-logging.access_log_udp_port - type: string - default: '514' - help: 'If set, access_log_udp_host will override access_log_address' - - - name: filter:proxy-logging.access_log_statsd_host - type: host - default: 'localhost' - help: 'You can use log_statsd_* from [DEFAULT] or override them here:' - - - name: filter:proxy-logging.access_log_statsd_port - type: string - default: '8125' - help: 'You can use log_statsd_* from [DEFAULT] or override them here:' - - - name: filter:proxy-logging.access_log_statsd_default_sample_rate - type: string - default: '1.0' - help: 'You can use log_statsd_* from [DEFAULT] or override them here:' - - - name: filter:proxy-logging.access_log_statsd_sample_rate_factor - type: string - default: '1.0' - help: 'You can use log_statsd_* from [DEFAULT] or override them here:' - - - name: filter:proxy-logging.access_log_statsd_metric_prefix - type: string - default: '' - help: 'You can use log_statsd_* from [DEFAULT] or override them here:' - - - name: filter:proxy-logging.access_log_headers - type: string - default: 'false' - help: 'You can use log_statsd_* from [DEFAULT] or override them here:' - - - name: filter:bulk.max_containers_per_extraction - type: string - default: '10000' - - - name: filter:bulk.max_failed_extractions - type: string - default: '1000' - - - name: filter:bulk.max_deletes_per_request - type: string - default: '10000' - - - name: filter:bulk.yield_frequency - type: string - default: '60' - - - name: filter:slo.max_manifest_segments - type: string - default: '1000' - - - name: filter:slo.max_manifest_size - type: string - default: '2097152' - - - name: filter:slo.min_segment_size - type: string - default: '1048576' - diff --git a/rubick/schemas/swift_proxy_server/swift_proxy_server.conf.yml b/rubick/schemas/swift_proxy_server/swift_proxy_server.conf.yml deleted file mode 100644 index 23e77f0..0000000 --- a/rubick/schemas/swift_proxy_server/swift_proxy_server.conf.yml +++ /dev/null @@ -1,757 +0,0 @@ -- version: '2013.2.1' - checkpoint: true - added: - - - name: bind_ip - type: string - default: '0.0.0.0' - comment: 'New param' - - - name: bind_port - type: string - default: '80' - comment: 'New param' - - - name: bind_timeout - type: string - default: '30' - comment: 'New param' - - - name: backlog - type: string - default: '4096' - comment: 'New param' - - - name: swift_dir - type: string - default: '/etc/swift' - comment: 'New param' - - - name: user - type: string - default: 'swift' - comment: 'New param' - - - name: workers - type: string - default: 'auto' - help: "Use an integer to override the number of pre-forked processes that will accept connections. Should default to the number of effective cpu cores in the system. It's worth noting that individual workers will use many eventlet co-routines to service multiple concurrent requests." - comment: 'New param' - - - name: max_clients - type: string - default: '1024' - help: 'Maximum concurrent requests per worker' - comment: 'New param' - - - name: cert_file - type: string - default: '/etc/swift/proxy.crt' - help: 'Set the following two lines to enable SSL. This is for testing only.' - comment: 'New param' - - - name: key_file - type: string - default: '/etc/swift/proxy.key' - help: 'Set the following two lines to enable SSL. This is for testing only.' - comment: 'New param' - - - name: log_name - type: string - default: 'swift' - help: 'You can specify default log routing here if you want:' - comment: 'New param' - - - name: log_facility - type: string - default: 'LOG_LOCAL0' - help: 'You can specify default log routing here if you want:' - comment: 'New param' - - - name: log_level - type: string - default: 'INFO' - help: 'You can specify default log routing here if you want:' - comment: 'New param' - - - name: log_headers - type: string - default: 'false' - help: 'You can specify default log routing here if you want:' - comment: 'New param' - - - name: log_address - type: string - default: '/dev/log' - help: 'You can specify default log routing here if you want:' - comment: 'New param' - - - name: trans_id_suffix - type: string - default: '' - help: 'This optional suffix (default is empty) that would be appended to the swift transaction id allows one to easily figure out from which cluster that X-Trans-Id belongs to. This is very useful when one is managing more than one swift cluster.' - comment: 'New param' - - - name: log_custom_handlers - type: string - default: '' - help: 'comma separated list of functions to call to setup custom log handlers. functions get passed: conf, name, log_to_console, log_route, fmt, logger, adapted_logger' - comment: 'New param' - - - name: log_udp_host - type: string - default: '' - help: 'If set, log_udp_host will override log_address' - comment: 'New param' - - - name: log_udp_port - type: string - default: '514' - help: 'If set, log_udp_host will override log_address' - comment: 'New param' - - - name: log_statsd_host - type: host - default: 'localhost' - help: 'You can enable StatsD logging here:' - comment: 'New param' - - - name: log_statsd_port - type: string - default: '8125' - help: 'You can enable StatsD logging here:' - comment: 'New param' - - - name: log_statsd_default_sample_rate - type: string - default: '1.0' - help: 'You can enable StatsD logging here:' - comment: 'New param' - - - name: log_statsd_sample_rate_factor - type: string - default: '1.0' - help: 'You can enable StatsD logging here:' - comment: 'New param' - - - name: log_statsd_metric_prefix - type: string - default: '' - help: 'You can enable StatsD logging here:' - comment: 'New param' - - - name: cors_allow_origin - type: string - default: '' - help: 'Use a comma separated list of full url (http://foo.bar:1234,https://foo.bar)' - comment: 'New param' - - - name: client_timeout - type: string - default: '60' - comment: 'New param' - - - name: eventlet_debug - type: string - default: 'false' - comment: 'New param' - - - name: 'pipeline:main.pipeline' - type: string - default: 'catch_errors healthcheck proxy-logging cache bulk slo ratelimit tempauth container-quotas account-quotas proxy-logging proxy-server' - comment: 'New param' - - - name: 'filter:account-quotas.use' - type: string - default: 'egg:swift#account_quotas' - comment: 'New param' - - - name: 'filter:cname_lookup.set log_name' - type: string - default: 'cname_lookup' - help: 'Note: this middleware requires python-dnspython You can override the default log routing for this filter here:' - comment: 'New param' - - - name: 'filter:cname_lookup.set log_facility' - type: string - default: 'LOG_LOCAL0' - help: 'Note: this middleware requires python-dnspython You can override the default log routing for this filter here:' - comment: 'New param' - - - name: 'filter:cname_lookup.set log_level' - type: string - default: 'INFO' - help: 'Note: this middleware requires python-dnspython You can override the default log routing for this filter here:' - comment: 'New param' - - - name: 'filter:cname_lookup.set log_address' - type: string - default: '/dev/log' - help: 'Note: this middleware requires python-dnspython You can override the default log routing for this filter here:' - comment: 'New param' - - - name: 'app:proxy-server.log_handoffs' - type: string - default: 'true' - comment: 'New param' - - - name: 'app:proxy-server.recheck_account_existence' - type: string - default: '60' - comment: 'New param' - - - name: 'app:proxy-server.recheck_container_existence' - type: string - default: '60' - comment: 'New param' - - - name: 'app:proxy-server.object_chunk_size' - type: string - default: '8192' - comment: 'New param' - - - name: 'app:proxy-server.client_chunk_size' - type: string - default: '8192' - comment: 'New param' - - - name: 'app:proxy-server.node_timeout' - type: string - default: '10' - comment: 'New param' - - - name: 'app:proxy-server.conn_timeout' - type: string - default: '0.5' - comment: 'New param' - - - name: 'app:proxy-server.error_suppression_interval' - type: string - default: '60' - help: "How long without an error before a node's error count is reset. This will also be how long before a node is reenabled after suppression is triggered." - comment: 'New param' - - - name: 'app:proxy-server.error_suppression_limit' - type: string - default: '10' - help: 'How many errors can accumulate before a node is temporarily ignored.' - comment: 'New param' - - - name: 'app:proxy-server.allow_account_management' - type: string - default: 'false' - help: "If set to 'true' any authorized user may create and delete accounts; if 'false' no one, even authorized, can." - comment: 'New param' - - - name: 'app:proxy-server.object_post_as_copy' - type: string - default: 'true' - help: "Set object_post_as_copy = false to turn on fast posts where only the metadata changes are stored anew and the original data file is kept in place. This makes for quicker posts; but since the container metadata isn't updated in this mode, features like container sync won't be able to sync posts." - comment: 'New param' - - - name: 'app:proxy-server.account_autocreate' - type: string - default: 'false' - help: "If set to 'true' authorized accounts that do not yet exist within the Swift cluster will be automatically created." - comment: 'New param' - - - name: 'app:proxy-server.max_containers_per_account' - type: string - default: '0' - help: 'If set to a positive value, trying to create a container when the account already has at least this maximum containers will result in a 403 Forbidden. Note: This is a soft limit, meaning a user might exceed the cap for recheck_account_existence before the 403s kick in.' - comment: 'New param' - - - name: 'app:proxy-server.max_containers_whitelist' - type: string - default: '' - help: 'This is a comma separated list of account hashes that ignore the max_containers_per_account cap.' - comment: 'New param' - - - name: 'app:proxy-server.deny_host_headers' - type: string - default: '' - help: 'Comma separated list of Host headers to which the proxy will deny requests.' - comment: 'New param' - - - name: 'app:proxy-server.auto_create_account_prefix' - type: string - default: '.' - help: 'Prefix used when automatically creating accounts.' - comment: 'New param' - - - name: 'app:proxy-server.put_queue_depth' - type: string - default: '10' - help: 'Depth of the proxy put queue.' - comment: 'New param' - - - name: 'app:proxy-server.rate_limit_after_segment' - type: string - default: '10' - help: 'Start rate-limiting object segment serving after the Nth segment of a segmented object.' - comment: 'New param' - - - name: 'app:proxy-server.rate_limit_segments_per_sec' - type: string - default: '1' - help: 'Once segment rate-limiting kicks in for an object, limit segments served to N per second.' - comment: 'New param' - - - name: 'app:proxy-server.sorting_method' - type: string - default: 'shuffle' - help: "Storage nodes can be chosen at random (shuffle), by using timing measurements (timing), or by using an explicit match (affinity). Using timing measurements may allow for lower overall latency, while using affinity allows for finer control. In both the timing and affinity cases, equally-sorting nodes are still randomly chosen to spread load. The valid values for sorting_method are 'affinity', 'shuffle', and 'timing'." - comment: 'New param' - - - name: 'app:proxy-server.timing_expiry' - type: string - default: '300' - help: "If the 'timing' sorting_method is used, the timings will only be valid for the number of seconds configured by timing_expiry." - comment: 'New param' - - - name: 'app:proxy-server.allow_static_large_object' - type: string - default: 'true' - help: "If set to false will treat objects with X-Static-Large-Object header set as a regular object on GETs, i.e. will return that object's contents. Should be set to false if slo is not used in pipeline." - comment: 'New param' - - - name: 'app:proxy-server.max_large_object_get_time' - type: string - default: '86400' - help: 'The maximum time (seconds) that a large object connection is allowed to last.' - comment: 'New param' - - - name: 'app:proxy-server.request_node_count' - type: string - default: '2 * replicas' - help: "Set to the number of nodes to contact for a normal request. You can use '* replicas' at the end to have it use the number given times the number of replicas for the ring being used for the request." - comment: 'New param' - - - name: 'app:proxy-server.read_affinity' - type: string - default: '' - help: 'Example: first read from region 1 zone 1, then region 1 zone 2, then anything in region 2, then everything else: read_affinity = r1z1=100, r1z2=200, r2=300 Default is empty, meaning no preference.' - comment: 'New param' - - - name: 'app:proxy-server.write_affinity' - type: string - default: '' - help: 'Example: try to write to regions 1 and 2 before writing to any other nodes: write_affinity = r1, r2 Default is empty, meaning no preference.' - comment: 'New param' - - - name: 'app:proxy-server.write_affinity_node_count' - type: string - default: '2 * replicas' - help: "The number of local (as governed by the write_affinity setting) nodes to attempt to contact first, before any non-local ones. You can use '* replicas' at the end to have it use the number given times the number of replicas for the ring being used for the request." - comment: 'New param' - - - name: 'app:proxy-server.swift_owner_headers' - type: string - default: 'x-container-read, x-container-write, x-container-sync-key, x-container-sync-to, x-account-meta-temp-url-key, x-account-meta-temp-url-key-2' - help: 'These are the headers whose values will only be shown to swift_owners. The exact definition of a swift_owner is up to the auth system in use, but usually indicates administrative responsibilities.' - comment: 'New param' - - - name: 'filter:cname_lookup.set log_headers' - type: string - default: 'false' - help: 'Note: this middleware requires python-dnspython You can override the default log routing for this filter here:' - comment: 'New param' - - - name: 'filter:tempauth.reseller_prefix' - type: string - default: 'AUTH' - help: 'The reseller prefix will verify a token begins with this prefix before even attempting to validate it. Also, with authorization, only Swift storage accounts with this prefix will be authorized by this middleware. Useful if multiple auth systems are in use for one Swift cluster.' - comment: 'New param' - - - name: 'filter:tempauth.auth_prefix' - type: string - default: '/auth/' - help: 'The auth prefix will cause requests beginning with this prefix to be routed to the auth subsystem, for granting tokens, etc.' - comment: 'New param' - - - name: 'filter:tempauth.token_life' - type: string - default: '86400' - help: 'The auth prefix will cause requests beginning with this prefix to be routed to the auth subsystem, for granting tokens, etc.' - comment: 'New param' - - - name: 'filter:tempauth.allow_overrides' - type: string - default: 'true' - help: "This allows middleware higher in the WSGI pipeline to override auth processing, useful for middleware such as tempurl and formpost. If you know you're not going to use such middleware and you want a bit of extra security, you can set this to false." - comment: 'New param' - - - name: 'filter:tempauth.storage_url_scheme' - type: string - default: 'default' - help: 'This specifies what scheme to return with storage urls: http, https, or default (chooses based on what the server is running as) This can be useful with an SSL load balancer in front of a non-SSL server.' - comment: 'New param' - - - name: 'filter:tempauth.user_admin_admin' - type: string - default: 'admin .admin .reseller_admin' - help: 'Lastly, you need to list all the accounts/users you want here. The format is: user__ = [group] [group] [...] [storage_url] or if you want underscores in or , you can base64 encode them (with no equal signs) and use this format: user64__ = [group] [group] [...] [storage_url] There are special groups of: .reseller_admin = can do anything to any account for this auth .admin = can do anything within the account If neither of these groups are specified, the user can only access containers that have been explicitly allowed for them by a .admin or .reseller_admin. The trailing optional storage_url allows you to specify an alternate url to hand back to the user upon authentication. If not specified, this defaults to $HOST/v1/_ where $HOST will do its best to resolve to what the requester would need to use to reach this host. Here are example entries, required for running the tests:' - comment: 'New param' - - - name: 'filter:tempauth.user_test_tester' - type: string - default: 'testing .admin' - help: 'Lastly, you need to list all the accounts/users you want here. The format is: user__ = [group] [group] [...] [storage_url] or if you want underscores in or , you can base64 encode them (with no equal signs) and use this format: user64__ = [group] [group] [...] [storage_url] There are special groups of: .reseller_admin = can do anything to any account for this auth .admin = can do anything within the account If neither of these groups are specified, the user can only access containers that have been explicitly allowed for them by a .admin or .reseller_admin. The trailing optional storage_url allows you to specify an alternate url to hand back to the user upon authentication. If not specified, this defaults to $HOST/v1/_ where $HOST will do its best to resolve to what the requester would need to use to reach this host. Here are example entries, required for running the tests:' - comment: 'New param' - - - name: 'filter:tempauth.user_test2_tester2' - type: string - default: 'testing2 .admin' - help: 'Lastly, you need to list all the accounts/users you want here. The format is: user__ = [group] [group] [...] [storage_url] or if you want underscores in or , you can base64 encode them (with no equal signs) and use this format: user64__ = [group] [group] [...] [storage_url] There are special groups of: .reseller_admin = can do anything to any account for this auth .admin = can do anything within the account If neither of these groups are specified, the user can only access containers that have been explicitly allowed for them by a .admin or .reseller_admin. The trailing optional storage_url allows you to specify an alternate url to hand back to the user upon authentication. If not specified, this defaults to $HOST/v1/_ where $HOST will do its best to resolve to what the requester would need to use to reach this host. Here are example entries, required for running the tests:' - comment: 'New param' - - - name: 'filter:tempauth.user_test_tester3' - type: string - default: 'testing3' - help: 'Lastly, you need to list all the accounts/users you want here. The format is: user__ = [group] [group] [...] [storage_url] or if you want underscores in or , you can base64 encode them (with no equal signs) and use this format: user64__ = [group] [group] [...] [storage_url] There are special groups of: .reseller_admin = can do anything to any account for this auth .admin = can do anything within the account If neither of these groups are specified, the user can only access containers that have been explicitly allowed for them by a .admin or .reseller_admin. The trailing optional storage_url allows you to specify an alternate url to hand back to the user upon authentication. If not specified, this defaults to $HOST/v1/_ where $HOST will do its best to resolve to what the requester would need to use to reach this host. Here are example entries, required for running the tests:' - comment: 'New param' - - - name: 'filter:tempauth.paste.filter_factory' - type: string - default: 'keystoneclient.middleware.auth_token:filter_factory' - help: '[filter:authtoken]' - comment: 'New param' - - - name: 'filter:tempauth.auth_host' - type: string - default: 'keystonehost' - help: '[filter:authtoken]' - comment: 'New param' - - - name: 'filter:tempauth.auth_port' - type: string - default: '35357' - help: '[filter:authtoken]' - comment: 'New param' - - - name: 'filter:tempauth.auth_protocol' - type: string - default: 'http' - help: '[filter:authtoken]' - comment: 'New param' - - - name: 'filter:tempauth.auth_uri' - type: string - default: 'http://keystonehost:5000/' - help: '[filter:authtoken]' - comment: 'New param' - - - name: 'filter:tempauth.admin_tenant_name' - type: string - default: 'service' - help: '[filter:authtoken]' - comment: 'New param' - - - name: 'filter:tempauth.admin_user' - type: string - default: 'swift' - help: '[filter:authtoken]' - comment: 'New param' - - - name: 'filter:tempauth.admin_password' - type: string - default: 'password' - help: '[filter:authtoken]' - comment: 'New param' - - - name: 'filter:tempauth.delay_auth_decision' - type: string - default: '1' - help: '[filter:authtoken]' - comment: 'New param' - - - name: 'filter:tempauth.cache' - type: string - default: 'swift.cache' - help: '[filter:authtoken]' - comment: 'New param' - - - name: 'filter:tempauth.operator_roles' - type: string - default: 'admin, swiftoperator' - help: '[filter:keystoneauth] Operator roles is the role which user would be allowed to manage a tenant and be able to create container or give ACL to others.' - comment: 'New param' - - - name: 'filter:tempauth.reseller_admin_role' - type: string - default: 'ResellerAdmin' - help: '[filter:keystoneauth] Operator roles is the role which user would be allowed to manage a tenant and be able to create container or give ACL to others. The reseller admin role has the ability to create and delete accounts' - comment: 'New param' - - - name: 'filter:healthcheck.disable_path' - type: string - default: '' - help: "An optional filesystem path, which if present, will cause the healthcheck URL to return '503 Service Unavailable' with a body of 'DISABLED BY FILE'. This facility may be used to temporarily remove a Swift node from a load balancer pool during maintenance or upgrade (remove the file to allow the node back into the load balancer pool)." - comment: 'New param' - - - name: 'filter:cache.memcache_servers' - type: string - default: '127.0.0.1:11211' - help: 'If not set here, the value for memcache_servers will be read from memcache.conf (see memcache.conf-sample) or lacking that file, it will default to the value below. You can specify multiple servers separated with commas, as in: 10.1.2.3:11211,10.1.2.4:11211' - comment: 'New param' - - - name: 'filter:cache.memcache_serialization_support' - type: string - default: '2' - help: 'Sets how memcache values are serialized and deserialized: 0 = older, insecure pickle serialization 1 = json serialization but pickles can still be read (still insecure) 2 = json serialization only (secure and the default) If not set here, the value for memcache_serialization_support will be read from /etc/swift/memcache.conf (see memcache.conf-sample). To avoid an instant full cache flush, existing installations should upgrade with 0, then set to 1 and reload, then after some time (24 hours) set to 2 and reload. In the future, the ability to use pickle serialization will be removed.' - comment: 'New param' - - - name: 'filter:ratelimit.clock_accuracy' - type: string - default: '1000' - help: "clock_accuracy should represent how accurate the proxy servers' system clocks are with each other. 1000 means that all the proxies' clock are accurate to each other within 1 millisecond. No ratelimit should be higher than the clock accuracy." - comment: 'New param' - - - name: 'filter:ratelimit.max_sleep_time_seconds' - type: string - default: '60' - comment: 'New param' - - - name: 'filter:ratelimit.log_sleep_time_seconds' - type: string - default: '0' - help: 'log_sleep_time_seconds of 0 means disabled' - comment: 'New param' - - - name: 'filter:ratelimit.rate_buffer_seconds' - type: string - default: '5' - help: "allows for slow rates (e.g. running up to 5 sec's behind) to catch up." - comment: 'New param' - - - name: 'filter:ratelimit.account_ratelimit' - type: string - default: '0' - help: 'account_ratelimit of 0 means disabled' - comment: 'New param' - - - name: 'filter:ratelimit.account_whitelist' - type: string - default: 'a,b' - help: 'these are comma separated lists of account names' - comment: 'New param' - - - name: 'filter:ratelimit.account_blacklist' - type: string - default: 'c,d' - help: 'these are comma separated lists of account names' - comment: 'New param' - - - name: 'filter:ratelimit.with container_limit_x' - type: string - default: 'r' - comment: 'New param' - - - name: 'filter:ratelimit.container_ratelimit_0' - type: string - default: '100' - help: 'for containers of size x limit write requests per second to r. The container rate will be linearly interpolated from the values given. With the values below, a container of size 5 will get a rate of 75.' - comment: 'New param' - - - name: 'filter:ratelimit.container_ratelimit_10' - type: string - default: '50' - help: 'for containers of size x limit write requests per second to r. The container rate will be linearly interpolated from the values given. With the values below, a container of size 5 will get a rate of 75.' - comment: 'New param' - - - name: 'filter:ratelimit.container_ratelimit_50' - type: string - default: '20' - help: 'for containers of size x limit write requests per second to r. The container rate will be linearly interpolated from the values given. With the values below, a container of size 5 will get a rate of 75.' - comment: 'New param' - - - name: 'filter:ratelimit.container_listing_ratelimit_0' - type: string - default: '100' - help: 'Similarly to the above container-level write limits, the following will limit container GET (listing) requests.' - comment: 'New param' - - - name: 'filter:ratelimit.container_listing_ratelimit_10' - type: string - default: '50' - help: 'Similarly to the above container-level write limits, the following will limit container GET (listing) requests.' - comment: 'New param' - - - name: 'filter:ratelimit.container_listing_ratelimit_50' - type: string - default: '20' - help: 'Similarly to the above container-level write limits, the following will limit container GET (listing) requests.' - comment: 'New param' - - - name: 'filter:cname_lookup.storage_domain' - type: string - default: 'example.com' - comment: 'New param' - - - name: 'filter:domain_remap.path_root' - type: string - default: 'v1' - comment: 'New param' - - - name: 'filter:domain_remap.reseller_prefixes' - type: string - default: 'AUTH' - comment: 'New param' - - - name: 'filter:cname_lookup.lookup_depth' - type: string - default: '1' - comment: 'New param' - - - name: 'filter:tempurl.methods' - type: string - default: 'GET HEAD PUT' - help: 'The methods allowed with Temp URLs.' - comment: 'New param' - - - name: 'filter:tempurl.incoming_remove_headers' - type: string - default: 'x-timestamp' - help: "The headers to remove from incoming requests. Simply a whitespace delimited list of header names and names can optionally end with '*' to indicate a prefix match. incoming_allow_headers is a list of exceptions to these removals." - comment: 'New param' - - - name: 'filter:tempurl.incoming_allow_headers' - type: string - default: '' - help: "The headers allowed as exceptions to incoming_remove_headers. Simply a whitespace delimited list of header names and names can optionally end with '*' to indicate a prefix match." - comment: 'New param' - - - name: 'filter:tempurl.outgoing_remove_headers' - type: string - default: 'x-object-meta-*' - help: "The headers to remove from outgoing responses. Simply a whitespace delimited list of header names and names can optionally end with '*' to indicate a prefix match. outgoing_allow_headers is a list of exceptions to these removals." - comment: 'New param' - - - name: 'filter:name_check.forbidden_chars' - type: string - default: "\\'\"`<>" - comment: 'New param' - - - name: 'filter:name_check.maximum_length' - type: string - default: '255' - comment: 'New param' - - - name: 'filter:name_check.forbidden_regexp' - type: string - default: '/\\./|/\\.\\./|/\\.$|/\\.\\.$' - comment: 'New param' - - - name: 'filter:list-endpoints.list_endpoints_path' - type: string - default: '/endpoints/' - comment: 'New param' - - - name: 'filter:proxy-logging.access_log_name' - type: string - default: 'swift' - help: "If not set, logging directives from [DEFAULT] without 'access_' will be used" - comment: 'New param' - - - name: 'filter:proxy-logging.access_log_facility' - type: string - default: 'LOG_LOCAL0' - help: "If not set, logging directives from [DEFAULT] without 'access_' will be used" - comment: 'New param' - - - name: 'filter:proxy-logging.access_log_level' - type: string - default: 'INFO' - help: "If not set, logging directives from [DEFAULT] without 'access_' will be used" - comment: 'New param' - - - name: 'filter:proxy-logging.access_log_address' - type: string - default: '/dev/log' - help: "If not set, logging directives from [DEFAULT] without 'access_' will be used" - comment: 'New param' - - - name: 'filter:proxy-logging.access_log_udp_host' - type: string - default: '' - help: 'If set, access_log_udp_host will override access_log_address' - comment: 'New param' - - - name: 'filter:proxy-logging.access_log_udp_port' - type: string - default: '514' - help: 'If set, access_log_udp_host will override access_log_address' - comment: 'New param' - - - name: 'filter:proxy-logging.access_log_statsd_host' - type: host - default: 'localhost' - help: 'You can use log_statsd_* from [DEFAULT] or override them here:' - comment: 'New param' - - - name: 'filter:proxy-logging.access_log_statsd_port' - type: string - default: '8125' - help: 'You can use log_statsd_* from [DEFAULT] or override them here:' - comment: 'New param' - - - name: 'filter:proxy-logging.access_log_statsd_default_sample_rate' - type: string - default: '1.0' - help: 'You can use log_statsd_* from [DEFAULT] or override them here:' - comment: 'New param' - - - name: 'filter:proxy-logging.access_log_statsd_sample_rate_factor' - type: string - default: '1.0' - help: 'You can use log_statsd_* from [DEFAULT] or override them here:' - comment: 'New param' - - - name: 'filter:proxy-logging.access_log_statsd_metric_prefix' - type: string - default: '' - help: 'You can use log_statsd_* from [DEFAULT] or override them here:' - comment: 'New param' - - - name: 'filter:proxy-logging.access_log_headers' - type: string - default: 'false' - help: 'You can use log_statsd_* from [DEFAULT] or override them here:' - comment: 'New param' - - - name: 'filter:bulk.max_containers_per_extraction' - type: string - default: '10000' - comment: 'New param' - - - name: 'filter:bulk.max_failed_extractions' - type: string - default: '1000' - comment: 'New param' - - - name: 'filter:bulk.max_deletes_per_request' - type: string - default: '10000' - comment: 'New param' - - - name: 'filter:bulk.yield_frequency' - type: string - default: '60' - comment: 'New param' - - - name: 'filter:slo.max_manifest_segments' - type: string - default: '1000' - comment: 'New param' - - - name: 'filter:slo.max_manifest_size' - type: string - default: '2097152' - comment: 'New param' - - - name: 'filter:slo.min_segment_size' - type: string - default: '1048576' - comment: 'New param' - -# ==================================================== diff --git a/rubick/schemas/yaml_utils.py b/rubick/schemas/yaml_utils.py deleted file mode 100644 index 853970e..0000000 --- a/rubick/schemas/yaml_utils.py +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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 yaml_string(s, allowSimple=False): - if "'" in s: - return '"%s"' % s.replace('\\', '\\\\').replace('"', '\\"') - else: - if not allowSimple or any([c in s for c in " :,"]): - return "'%s'" % s - else: - return s - - -def yaml_value(x): - if x is None: - return '~' - elif x is True: - return 'true' - elif x is False: - return 'false' - elif isinstance(x, str): - return yaml_string(x) - else: - return repr(x) diff --git a/rubick/templates/validation_error.html b/rubick/templates/validation_error.html deleted file mode 100644 index 78db8bd..0000000 --- a/rubick/templates/validation_error.html +++ /dev/null @@ -1,29 +0,0 @@ -{% extends "bootstrap/base.html" %} -{% import "bootstrap/wtf.html" as wtf %} - -{% block title %}OpenStack Validator Result{% endblock %} - -{% block content %} -

- -{% endblock %} - diff --git a/rubick/templates/validation_form.html b/rubick/templates/validation_form.html deleted file mode 100644 index 4bfc417..0000000 --- a/rubick/templates/validation_form.html +++ /dev/null @@ -1,13 +0,0 @@ -{% extends "bootstrap/base.html" %} -{% import "bootstrap/wtf.html" as wtf %} - -{% block title %}OpenStack Validator{% endblock %} - -{% block content %} -
-

OpenStack Validator

- {{ wtf.quick_form(form, action='/validation', method='POST', button_map={'launch': 'primary'}) }} -
- -{% endblock %} - diff --git a/rubick/templates/validation_result.html b/rubick/templates/validation_result.html deleted file mode 100644 index 56b6de7..0000000 --- a/rubick/templates/validation_result.html +++ /dev/null @@ -1,65 +0,0 @@ -{% extends "bootstrap/base.html" %} -{% import "bootstrap/wtf.html" as wtf %} - -{% block title %}OpenStack Validator Result{% endblock %} - -{% block content %} -
-

OpenStack Validation Result

- -

Hosts

-
    - {% for host in openstack.hosts %} -
  • - {{ host.name }} -
      - {% for component in host.components %} -
    • {{ component.name }} version {{ component.version }}
    • - {% endfor %} -
    -
  • - {% endfor %} -
- -

Issues

-
    - {% for group, issues in grouped_issues %} -
  • - - {% if group %} - {{ group }} - {% else %} - General issues - {% endif %} - -
      - {% for issue in issues %} -
    • - {{ issue.type | capitalize }} - {{ issue.message }} - {% if issue.mark %} - (line {{ issue.mark.line+1 }} column {{ issue.mark.column+1 }}) - {% endif %} -
    • - {% endfor %} -
    -
  • - {% endfor %} -
- -
-
- {{ form.hidden_tag() }} - - {{ wtf.form_field(form.nodes) }} - {{ wtf.form_field(form.username) }} - {{ wtf.form_field(form.private_key) }} -
- - New inspection -
- -
- -{% endblock %} - diff --git a/rubick/templates/validation_state.html b/rubick/templates/validation_state.html deleted file mode 100644 index 6b85c82..0000000 --- a/rubick/templates/validation_state.html +++ /dev/null @@ -1,23 +0,0 @@ -{% extends "bootstrap/base.html" %} - -{% block title %}OpenStack Validation{% endblock %} - -{% block content %} -
-

OpenStack Validation Result

- -

- Job state is {{ state }} -

- - - -
- -{% endblock %} - - diff --git a/rubick/test_config_schema_registry.py b/rubick/test_config_schema_registry.py deleted file mode 100644 index b4012d2..0000000 --- a/rubick/test_config_schema_registry.py +++ /dev/null @@ -1,88 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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 unittest -from contextlib import contextmanager - -from rubick.schema import ConfigSchemaRegistry -from rubick.common import find, Version - - -class TestConfigSchemaLoader(object): - def __init__(self): - super(TestConfigSchemaLoader, self).__init__() - self._records = [] - - @contextmanager - def version(self, version, checkpoint=False): - self._current_version = dict(version=version, checkpoint=checkpoint, - added=[], removed=[]) - self._records.append(self._current_version) - yield - self._current_version = None - - def param(self, name, type, default=None, description=None): - self._current_version['added'].append( - dict(name=name, type=type, default=default, - description=description)) - - def removed_param(self, name): - self._current_version['removed'].append(name) - - def load(self, project, configname): - return self._records - - -class ConfigSchemaRegistryTests(unittest.TestCase): - - def test_sample(self): - loader = TestConfigSchemaLoader() - with loader.version('1.0.0', checkpoint=True): - loader.param('verbose', type='boolean') - loader.param('rabbit_host', type='address') - - with loader.version('1.1.0'): - loader.param('verbose', type='boolean', default=False) - loader.removed_param('rabbit_host') - - schema10 = ConfigSchemaRegistry.get_schema( - project='nova', version='1.0.0', schema_loader=loader) - - self.assertEqual(Version('1.0.0'), schema10.version) - self.assertEqual('ini', schema10.format) - - def find_param(params, name): - return find(params, lambda p: p.name == name) - - verbose_param = find_param(schema10.parameters, 'verbose') - self.assertIsNotNone(verbose_param) - self.assertEqual('boolean', verbose_param.type) - self.assertEqual(None, verbose_param.default) - - rabbit_host_param = find_param(schema10.parameters, 'rabbit_host') - self.assertIsNotNone(rabbit_host_param) - self.assertEqual('address', rabbit_host_param.type) - - schema11 = ConfigSchemaRegistry.get_schema( - project='nova', version='1.1.0', schema_loader=loader) - - verbose_param11 = find_param(schema11.parameters, 'verbose') - self.assertIsNotNone(verbose_param11) - self.assertEqual(False, verbose_param11.default) - - rabbit_host_param11 = find_param(schema11.parameters, 'rabbit_host') - self.assertIsNone(rabbit_host_param11) - - -if __name__ == '__main__': - unittest.main() diff --git a/rubick/test_configuration.py b/rubick/test_configuration.py deleted file mode 100644 index 9a2b384..0000000 --- a/rubick/test_configuration.py +++ /dev/null @@ -1,315 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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 unittest - -from rubick.config_model import Configuration -from rubick.schema import ConfigSchema, ConfigParameterSchema, \ - InvalidValueError - - -class ConfigurationTests(unittest.TestCase): - section = 'section1' - param = 'param1' - fullparam = '%s.%s' % (section, param) - value = 'foobar' - default_value = 'bar123' - - def test_empty(self): - c = Configuration() - self.assertIsNone(c.get('section1.param1')) - - def test_storage(self): - c = Configuration() - c.set(self.fullparam, self.value) - - self.assertEqual(self.value, c.get(self.fullparam)) - - def test_parameter_names_containing_sections(self): - c = Configuration() - c.set(self.fullparam, self.value) - - self.assertEqual( - self.value, c.get('%s.%s' % - (self.section, self.param))) - - def test_parameter_with_default_section(self): - c = Configuration() - c.set(self.param, self.value) - - self.assertEqual(self.value, c.get(self.param)) - - def test_explicit_default_on_get(self): - c = Configuration() - override_value = '12345' - - self.assertEqual( - override_value, - c.get(self.fullparam, - default=override_value)) - - def test_default(self): - c = Configuration() - c.set_default(self.fullparam, self.default_value) - - self.assertEqual(self.default_value, c.get(self.fullparam)) - - def test_normal_overrides_default(self): - c = Configuration() - c.set(self.fullparam, self.value) - c.set_default(self.fullparam, self.default_value) - - self.assertEqual(self.value, c.get(self.fullparam)) - - def test_contains(self): - c = Configuration() - self.assertFalse(c.contains(self.fullparam)) - - def test_contains_default(self): - c = Configuration() - c.set_default(self.fullparam, self.default_value) - - self.assertTrue(c.contains(self.fullparam)) - self.assertFalse(c.contains(self.fullparam, ignoreDefault=True)) - - def test_contains_normal(self): - c = Configuration() - c.set(self.fullparam, self.value) - - self.assertTrue(c.contains(self.fullparam)) - self.assertTrue(c.contains(self.fullparam, ignoreDefault=True)) - - def test_is_default_returns_false_if_param_missing(self): - c = Configuration() - self.assertFalse(c.is_default(self.fullparam)) - - def test_is_default_returns_true_if_only_default_value_set(self): - c = Configuration() - c.set_default(self.fullparam, self.default_value) - - self.assertTrue(c.is_default(self.fullparam)) - - def test_is_default_returns_false_if_normal_value_set(self): - c = Configuration() - c.set(self.fullparam, self.value) - - self.assertFalse(c.is_default(self.fullparam)) - - def test_is_default_returns_false_if_both_values_set(self): - c = Configuration() - c.set_default(self.fullparam, self.default_value) - c.set(self.fullparam, self.value) - - self.assertFalse(c.is_default(self.fullparam)) - - def test_subsection_set(self): - c = Configuration() - c.section(self.section).set(self.param, self.value) - - self.assertEqual(self.value, c.get(self.fullparam)) - - def test_keys(self): - c = Configuration() - c.set_default('section1.param1', '123') - c.set('section2.param1', '456') - - self.assertEqual(['section1', 'section2'], sorted(c.keys())) - - def test_subsection_keys(self): - c = Configuration() - c.set_default('%s.param1' % self.section, '123') - c.set('%s.param2' % self.section, '456') - - self.assertEqual( - ['param1', 'param2'], sorted(c.section(self.section).keys())) - - def test_subsection_items(self): - c = Configuration() - c.set('%s.param1' % self.section, 'value1') - c.set_default('%s.param2' % self.section, 'value2') - - self.assertEqual( - [('param1', 'value1'), ('param2', 'value2')], - sorted(c.section(self.section).items())) - - def test_subsection_get(self): - c = Configuration() - - c.set(self.fullparam, self.value) - - cs = c.section(self.section) - self.assertEqual(self.value, cs.get(self.param)) - - def test_getitem(self): - c = Configuration() - c.set(self.fullparam, self.value) - - self.assertEqual(self.value, c[self.fullparam]) - - def test_subsection_getitem(self): - c = Configuration() - c.set(self.fullparam, self.value) - - cs = c.section(self.section) - - self.assertEqual(self.value, cs[self.param]) - - def test_setitem(self): - c = Configuration() - - c[self.fullparam] = self.value - - self.assertEqual(self.value, c.get(self.fullparam)) - - def test_subsection_setitem(self): - c = Configuration() - - cs = c.section(self.section) - - cs[self.param] = self.value - - self.assertEqual(self.value, c.get(self.fullparam)) - - def test_section_in(self): - c = Configuration() - - self.assertFalse(self.section in c) - - c.set(self.fullparam, self.value) - self.assertTrue(self.section in c) - - def test_subsection_contains(self): - c = Configuration() - - c.set('section1.param1', '123') - c.set_default('section2.param2', '234') - - self.assertTrue('param1' in c.section('section1')) - self.assertTrue('param2' in c.section('section2')) - self.assertFalse('param1' in c.section('section2')) - - def test_returns_section_object_even_if_section_doesnot_exist(self): - c = Configuration() - self.assertIsNotNone(c.section('foo')) - - def test_template_substitution(self): - c = Configuration() - c.set('a', 'x') - c.set('b', '$a') - c.set('c', '$b') - - self.assertEqual('x', c.get('c')) - - def test_cycle_template_substitution_resolves_in_empty_string(self): - c = Configuration() - c.set('a', 'a$c') - c.set('b', 'b$a') - c.set('c', 'c$b') - - self.assertEqual('cba', c.get('c')) - - def test_getting_raw_values(self): - c = Configuration() - - c.set('a', '$b') - c.set('b', 'x') - - self.assertEqual('$b', c.get('a', raw=True)) - - def test_typed_params(self): - schema = ConfigSchema('test', '1.0', 'ini', [ - ConfigParameterSchema('param1', type='integer', section='DEFAULT') - ]) - - c = Configuration(schema) - - c.set('param1', '123') - - self.assertEqual(123, c.get('param1')) - - def test_typed_params_update(self): - schema = ConfigSchema('test', '1.0', 'ini', [ - ConfigParameterSchema('param1', type='integer', section='DEFAULT') - ]) - - c = Configuration(schema) - - c.set('param1', '123') - - self.assertEqual(123, c.get('param1')) - - c.set('param1', '456') - - self.assertEqual(456, c.get('param1')) - - def test_type_for_unknown_param(self): - schema = ConfigSchema('test', '1.0', 'ini', []) - - c = Configuration(schema) - - c.set('param1', '123') - - self.assertEqual('123', c.get('param1')) - - def test_typed_param_with_invalid_value_returns_string_value(self): - schema = ConfigSchema('test', '1.0', 'ini', [ - ConfigParameterSchema('param1', type='integer', section='DEFAULT') - ]) - - c = Configuration(schema) - - c.set('param1', '123a') - - self.assertEqual('123a', c.get('param1')) - - def test_getting_typed_param_raw_value(self): - schema = ConfigSchema('test', '1.0', 'ini', [ - ConfigParameterSchema('param1', type='integer', section='DEFAULT') - ]) - - c = Configuration(schema) - - c.set('param1', '123') - - self.assertEqual('123', c.get('param1', raw=True)) - - def test_validate_returns_none_if_value_is_valid(self): - schema = ConfigSchema('test', '1.0', 'ini', [ - ConfigParameterSchema('param1', type='integer', section='DEFAULT') - ]) - - c = Configuration(schema) - - c.set('param1', '123') - - self.assertIsNone(c.validate('param1')) - - def test_validate_returns_error_if_valid_is_invalid(self): - schema = ConfigSchema('test', '1.0', 'ini', [ - ConfigParameterSchema('param1', type='integer', section='DEFAULT') - ]) - - c = Configuration(schema) - - c.set('param1', 'abc') - - self.assertTrue(isinstance(c.validate('param1'), InvalidValueError)) - - def test_validate_returns_none_for_unknown_param(self): - schema = ConfigSchema('test', '1.0', 'ini', []) - - c = Configuration(schema) - - c.set('param1', '123') - - self.assertIsNone(c.validate('param1')) diff --git a/rubick/test_mark.py b/rubick/test_mark.py deleted file mode 100644 index 5d69007..0000000 --- a/rubick/test_mark.py +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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 rubick.common import Mark - -import unittest - - -class MarkTests(unittest.TestCase): - - def test_creation(self): - m = Mark('nova.conf', 3, 5) - self.assertEqual('nova.conf', m.source) - self.assertEqual(3, m.line) - self.assertEqual(5, m.column) - - def test_merge(self): - m1 = Mark('nova.conf', 3, 5) - m2 = Mark('unknown', 2, 7) - - m = m1.merge(m2) - - self.assertEqual(m1.source, m.source) - self.assertEqual(m1.line + m2.line, m.line) - self.assertEqual(m1.column + m2.column, m.column) diff --git a/rubick/test_type_validators.py b/rubick/test_type_validators.py deleted file mode 100644 index d18bcd2..0000000 --- a/rubick/test_type_validators.py +++ /dev/null @@ -1,379 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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 rubick.common import Issue, MarkedIssue -from rubick.schema import TypeValidatorRegistry - -import unittest - - -class TypeValidatorTestHelper(object): - def setUp(self): - super(TypeValidatorTestHelper, self).setUp() - self.validator = TypeValidatorRegistry.get_validator(self.type_name) - - def assertValid(self, value, type_args={}): - self.assertNotIsInstance( - self.validator.validate(value, **type_args), Issue) - - def assertInvalid(self, value, type_args={}): - self.assertIsInstance( - self.validator.validate(value, **type_args), Issue) - - -class StringTypeValidatorTests(TypeValidatorTestHelper, unittest.TestCase): - type_name = 'string' - - def test_empty_string_passes(self): - self.assertValid('') - - def test_validation_always_passes(self): - self.assertValid('foo bar') - - def test_should_return_same_string_if_valid(self): - s = 'foo bar' - self.assertEqual(s, self.validator.validate(s)) - - -class EnumTypeValidatorTests(TypeValidatorTestHelper, unittest.TestCase): - type_name = 'enum' - - def test_listed_value(self): - self.assertValid('foo', type_args={'values': ['foo', 'bar']}) - - def test_unlisted_value(self): - self.assertInvalid('baz', type_args={'values': ['foo', 'bar']}) - - def test_with_no_values_returns_error(self): - self.assertInvalid('foo') - - -class BooleanTypeValidatorTests(TypeValidatorTestHelper, unittest.TestCase): - type_name = 'boolean' - - def test_True(self): - v = self.validator.validate('True') - self.assertEqual(True, v) - - def test_False(self): - v = self.validator.validate('False') - self.assertEqual(False, v) - - def test_other_values_produce_error(self): - self.assertInvalid('foo') - - -class IntegerTypeValidatorTests(TypeValidatorTestHelper, unittest.TestCase): - type_name = 'integer' - - def test_positive_values_are_valid(self): - self.assertValid('123') - - def test_zero_is_valid(self): - self.assertValid('0') - - def test_negative_values_are_valid(self): - self.assertValid('-123') - - def test_leading_whitespace_is_ignored(self): - self.assertValid(' 5') - - def test_trailing_whitespace_is_ignored(self): - self.assertValid('7 ') - - def test_non_digits_are_invalid(self): - self.assertInvalid('12a45') - - def test_invalid_char_error_contains_proper_column_in_mark(self): - error = self.validator.validate('12a45') - self.assertIsInstance(error, MarkedIssue) - self.assertEqual(3, error.mark.column) - - def test_invalid_char_error_contains_proper_column_if_leading_whitespaces( - self): - error = self.validator.validate(' 12a45') - self.assertIsInstance(error, MarkedIssue) - self.assertEqual(5, error.mark.column) - - def test_returns_integer_if_valid(self): - v = self.validator.validate('123') - self.assertEqual(123, v) - - -class HostAddressTypeValidatorTests(TypeValidatorTestHelper, - unittest.TestCase): - type_name = 'host_address' - - def test_ipv4_address(self): - self.assertValid('127.0.0.1') - - def test_returns_address(self): - s = '10.0.0.1' - v = self.validator.validate(s) - self.assertEqual(s, v) - - def test_value_with_less_than_4_numbers_separated_by_dots(self): - self.assertInvalid('10.0.0') - - def test_ipv4_like_string_with_numbers_greater_than_255(self): - self.assertInvalid('10.0.256.1') - - def test_host_name(self): - self.assertValid('foo.bar.baz') - - def test_host_with_empty_parts(self): - self.assertInvalid('.foo.bar') - self.assertInvalid('foo..bar') - self.assertInvalid('foo.bar.') - - def test_host_parts_with_invalid_chars(self): - self.assertInvalid('foo.ba r.baz') - self.assertInvalid('foo.x_y.bar') - - def test_host_with_single_host_label(self): - self.assertValid('foo') - - def test_host_part_starting_with_non_letter(self): - self.assertInvalid('123foo') - - def test_host_that_ends_with_a_hyphen(self): - self.assertInvalid('foo-') - - def test_mark_should_point_to_incorrect_symbol(self): - e = self.validator.validate('') - self.assertEqual(0, e.mark.column) - - e = self.validator.validate('123foo') - self.assertEqual(0, e.mark.column) - - e = self.validator.validate('foo-') - self.assertEqual(3, e.mark.column) - - e = self.validator.validate('foo.bar.-baz') - self.assertEqual(8, e.mark.column) - - -class NetworkAddressTypeValidatorTests(TypeValidatorTestHelper, - unittest.TestCase): - type_name = 'network_address' - - def test_ipv4_network(self): - self.assertValid('127.0.0.1/24') - - def test_returns_address(self): - s = '10.0.0.1/32' - v = self.validator.validate(s) - self.assertEqual(s, v) - - def test_value_with_less_than_4_numbers_separated_by_dots(self): - self.assertInvalid('10.0.0/24') - - def test_ipv4_like_string_with_numbers_greater_than_255(self): - self.assertInvalid('10.0.256.1/24') - - def test_no_prefix_length(self): - self.assertInvalid('10.0.0.0') - self.assertInvalid('10.0.0.0/') - - def test_non_integer_prefix_length(self): - self.assertInvalid('10.0.0.0/1a') - - def test_prefix_greater_than_32(self): - self.assertInvalid('10.0.0.0/33') - - -class NetworkMaskTypeValidatorTests(TypeValidatorTestHelper, - unittest.TestCase): - type_name = 'network_mask' - - def test_mask(self): - self.assertValid('255.255.255.0') - - def test_returns_mask(self): - s = '255.255.255.0' - v = self.validator.validate(s) - self.assertEqual(s, v) - - def test_mask_with_nonsubsequent_bits_is_invalid(self): - self.assertInvalid('255.123.255.0') - - def test_invalid_format(self): - self.assertInvalid('foo') - - -class PortTypeValidatorTests(TypeValidatorTestHelper, unittest.TestCase): - type_name = 'port' - - def test_empty(self): - self.assertInvalid('') - - def test_positive_integer(self): - self.assertValid('123') - - def test_zero_invalid(self): - self.assertInvalid('0') - - def test_negatives_are_invalid(self): - self.assertInvalid('-1') - - def test_values_greater_than_65535_are_invalid(self): - self.assertInvalid('65536') - - def test_low_boundary_is_valid(self): - self.assertValid('1') - - def test_high_boundary_is_valid(self): - self.assertValid('65535') - - def test_non_digits_are_invalid(self): - self.assertInvalid('12a5') - - def test_leading_and_or_trailing_whitespace_is_ignored(self): - self.assertValid(' 123') - self.assertValid('456 ') - self.assertValid(' 123 ') - - def test_returns_integer_if_valid(self): - v = self.validator.validate('123') - self.assertEqual(123, v) - - -class HostAndPortTypeValidatorTests(TypeValidatorTestHelper, - unittest.TestCase): - type_name = 'host_and_port' - - def test_ipv4_address(self): - self.assertValid('127.0.0.1:80') - - def test_returns_address(self): - s = '10.0.0.1:80' - v = self.validator.validate(s) - self.assertEqual(('10.0.0.1', 80), v) - - def test_value_with_less_than_4_numbers_separated_by_dots(self): - self.assertInvalid('10.0.0:1234') - - def test_ipv4_like_string_with_numbers_greater_than_255(self): - self.assertInvalid('10.0.256.1:1234') - - def test_no_port(self): - self.assertInvalid('10.0.0.1') - self.assertInvalid('10.0.0.1:') - - def test_port_is_not_an_integer(self): - self.assertInvalid('10.0.0.1:abc') - - def test_port_is_greater_than_65535(self): - self.assertInvalid('10.0.0.1:65536') - - -class RegexTypeValidatorTests(TypeValidatorTestHelper, unittest.TestCase): - type_name = 'regex' - - def test_valid_regex(self): - self.assertValid('\d+\.\d+\.\d+\.\d+') - - def test_invalid_regex(self): - self.assertInvalid('(\d+') - - -class StringListTypeValidatorTests(TypeValidatorTestHelper, unittest.TestCase): - type_name = 'string_list' - - def test_empty_value(self): - v = self.validator.validate('') - self.assertEqual([], v) - - def test_single_value(self): - v = self.validator.validate(' foo bar ') - - self.assertIsInstance(v, list) - self.assertEqual('foo bar', v[0]) - self.assertEqual(1, len(v)) - - def test_list_of_values(self): - v = self.validator.validate(' foo bar, baz ') - - self.assertIsInstance(v, list) - self.assertEqual('foo bar', v[0]) - self.assertEqual('baz', v[1]) - self.assertEqual(2, len(v)) - - -class StringDictTypeValidatorTests(TypeValidatorTestHelper, unittest.TestCase): - type_name = 'string_dict' - - def test_empty_value(self): - v = self.validator.validate('') - self.assertEqual({}, v) - - def test_single_value(self): - v = self.validator.validate(' foo: bar ') - - self.assertIsInstance(v, dict) - self.assertEqual('bar', v['foo']) - self.assertEqual(1, len(v)) - - def test_list_of_values(self): - v = self.validator.validate(' foo: bar, baz: 123 ') - - self.assertIsInstance(v, dict) - self.assertEqual('bar', v['foo']) - self.assertEqual('123', v['baz']) - self.assertEqual(2, len(v)) - - -class RabbitmqBindValidatorTest(TypeValidatorTestHelper, unittest.TestCase): - type_name = 'rabbitmq_bind' - - def test_empty_value_is_an_error(self): - self.assertInvalid('') - - def test_integer(self): - v = self.validator.validate('123') - - self.assertEqual(('0.0.0.0', 123), v) - - def test_integer_outside_port_range(self): - self.assertInvalid('65536') - - def test_host_port(self): - v = self.validator.validate('{"127.0.0.1",8080}') - - self.assertEqual(('127.0.0.1', 8080), v) - - -class RabbitmqListValidatorTest(TypeValidatorTestHelper, unittest.TestCase): - type_name = 'rabbitmq_bind_list' - - def test_empty(self): - self.assertInvalid('') - - def test_empty_list(self): - v = self.validator.validate('[]') - - self.assertEqual([], v) - - def test_single_entry(self): - v = self.validator.validate('[123]') - - self.assertEqual([('0.0.0.0', 123)], v) - - def test_multiple_entries(self): - v = self.validator.validate('[1080,{"localhost",8080}]') - - self.assertEqual([('0.0.0.0', 1080), ('localhost', 8080)], v) - - -if __name__ == '__main__': - unittest.main() diff --git a/rubick/test_version.py b/rubick/test_version.py deleted file mode 100644 index 7900f3a..0000000 --- a/rubick/test_version.py +++ /dev/null @@ -1,76 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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 rubick.common import Version - -import unittest - - -class VersionTests(unittest.TestCase): - - def test_creation_from_components(self): - v = Version(1, 3, 7) - self.assertEqual(1, v.major) - self.assertEqual(3, v.minor) - self.assertEqual(7, v.maintenance) - - def test_creation_from_string(self): - v = Version('1.2.12') - self.assertEqual(1, v.major) - self.assertEqual(2, v.minor) - self.assertEqual(12, v.maintenance) - - def test_creation_from_string_with_less_parts(self): - v = Version('1.2') - self.assertEqual(1, v.major) - self.assertEqual(2, v.minor) - self.assertEqual(0, v.maintenance) - - v = Version('12') - self.assertEqual(12, v.major) - self.assertEqual(0, v.minor) - self.assertEqual(0, v.maintenance) - - def test_creation_from_other_version(self): - v = Version('1.2.3') - v2 = Version(v) - self.assertEqual(1, v2.major) - self.assertEqual(2, v2.minor) - self.assertEqual(3, v2.maintenance) - - def test_equility(self): - v1 = Version('1.2.3') - v2 = Version(1, 2, 3) - v3 = Version(1, 2, 4) - - self.assertTrue(v1 == v2) - self.assertFalse(v1 == v3) - - def test_non_equility(self): - v1 = Version('1.2.3') - v2 = Version(1, 2, 3) - v3 = Version(1, 2, 4) - - self.assertFalse(v1 != v2) - self.assertTrue(v1 != v3) - - def test_comparision(self): - v1 = Version('1.2.3') - v2 = Version(1, 1, 5) - - self.assertTrue(v1 > v2) - self.assertFalse(v1 < v2) - - -if __name__ == '__main__': - unittest.main() diff --git a/rubick/utils.py b/rubick/utils.py deleted file mode 100644 index ac969cd..0000000 --- a/rubick/utils.py +++ /dev/null @@ -1,47 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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 collections -import functools - - -class memoized(object): - - '''Decorator. Caches a function's return value each time it is called. - If called later with the same arguments, the cached value is returned - (not reevaluated). - ''' - - def __init__(self, func): - self.func = func - self.cache = {} - - def __call__(self, *args): - if not isinstance(args, collections.Hashable): - # uncacheable. a list, for instance. - # better to not cache than blow up. - return self.func(*args) - if args in self.cache: - return self.cache[args] - else: - value = self.func(*args) - self.cache[args] = value - return value - - def __repr__(self): - '''Return the function's docstring.''' - return self.func.__doc__ - - def __get__(self, obj, objtype): - '''Support instance methods.''' - return functools.partial(self.__call__, obj) diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 5573bae..0000000 --- a/setup.cfg +++ /dev/null @@ -1,22 +0,0 @@ -[metadata] -name = rubick -version = 1.0 -summary = OpenStack configuration inspector -description-file = - README.md -author = MirantisLabs -author-email = labs-all@mirantis.com -home-page = http://mirantis.com/ -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 :: 2.7 - -[files] -packages = - rubick - joker diff --git a/setup.py b/setup.py deleted file mode 100644 index 457ba79..0000000 --- a/setup.py +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (c) 2014 Mirantis Inc. -# -# 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() diff --git a/test-requirements.txt b/test-requirements.txt deleted file mode 100644 index 5e1c9ce..0000000 --- a/test-requirements.txt +++ /dev/null @@ -1,9 +0,0 @@ -pep8==1.4.5 -pyflakes==0.7.2 -flake8==2.0 -hacking>=0.5.6,<0.8 - -coverage -python-subunit -testrepository>=0.0.17 -testtools>=0.9.32 diff --git a/tox.ini b/tox.ini deleted file mode 100644 index 8982f0d..0000000 --- a/tox.ini +++ /dev/null @@ -1,40 +0,0 @@ -[tox] -minversion = 1.6 -envlist = py26,py27,py33,pep8 -skipsdist = True - -[testenv] -install_command = pip install -U {opts} {packages} -setenv = VIRTUAL_ENV={envdir} -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt -commands = - python setup.py testr --slowest --testr-args='{posargs}' - -[tox:jenkins] -sitepackages = True -downloadcache = ~/cache/pip - -[testenv:pep8] -sitepackages = False -commands = - flake8 {posargs} - -[testenv:cover] -# Also do not run test_coverage_ext tests while gathering coverage as those -# tests conflict with coverage. -setenv = VIRTUAL_ENV={envdir} -commands = - python setup.py testr --coverage \ - --testr-args='^(?!.*test.*coverage).*$' - -[testenv:venv] -commands = {posargs} - -[flake8] -# TODO(ogelbukh): enforce H306 -# We will be ignoring line length limit until we apply for incubation -# E501: line too long -# H306: imports not in alphabetical order -ignore = E501,H306 -exclude = .venv,.git,.tox,dist,lib/python*,*egg,build diff --git a/vagrant/cookbooks/rubick/recipes/default.rb b/vagrant/cookbooks/rubick/recipes/default.rb deleted file mode 100644 index 27f491c..0000000 --- a/vagrant/cookbooks/rubick/recipes/default.rb +++ /dev/null @@ -1,21 +0,0 @@ -package 'build-essential' -package 'mongodb-server' -package 'redis-server' -package 'python-pip' -package 'tmux' - -bash 'Install python dependencies' do - code 'pip install -r requirements.txt' - cwd '/vagrant' -end - -bash 'Run application' do - code <<-EOS - if ! tmux has-session -t dev; then - tmux new-session -d -s dev "honcho start" - fi - EOS - user 'vagrant' - cwd '/vagrant' -end -

ICRMF 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