add script module for tricircle options
add script module for tricircle options Change-Id: If2224b8760229020020bcda6e43d029b8af7a813
This commit is contained in:
parent
72fb1af940
commit
9ed9344fc2
44
script/README.md
Executable file
44
script/README.md
Executable file
@ -0,0 +1,44 @@
|
||||
Tricircle Configuration Options Updating Module
|
||||
===============================================
|
||||
|
||||
In Tricircle Project, we added many options in the *.conf files for cascading, these options
|
||||
among nova, glance, neutron, cinder. When deploy the cascading environment, these options should
|
||||
be modified based on the deployment context(IP, tenant, user, password etc.), so we have to
|
||||
modify each install scripts(/installation) every time for deployment because the options is
|
||||
configured by these scripts. It is inconvenient.
|
||||
|
||||
This script module is created in order to managing the options in *.conf with a centralized way.
|
||||
It is independent of the installation scripts, but the scripts can invoke the function in it to
|
||||
finish the options' configuration.
|
||||
|
||||
Composition
|
||||
------
|
||||
* **config.py**: the implementation to execute options updating, using python build-in lib:ConfigParser.
|
||||
* **tricircle.cfg**: the options you want to update are stored here.
|
||||
* **exec.sh**: a very simple shell commend to invoke the python code.
|
||||
|
||||
Usage
|
||||
-------
|
||||
- Format of the tricircle.cfg
|
||||
|
||||
The tricircle.cfg is standard python config file(like nova.conf in /etc/nova), it contains
|
||||
sections and options in each section like what the *.conf is in it. The only difference is
|
||||
the **Naming Conventions** of the section:
|
||||
|
||||
+ Every section name start with the openstack service config-file name
|
||||
(nova/neutron/glance-api/cinder);
|
||||
|
||||
+ If the option to be updated needs in a special section in *.conf, the special section
|
||||
(keystone_authtoken e.g) should be added to the end of the section name with '_' ahead of
|
||||
it. For example, if the 'auth_host' option in nova.conf need be updated, it should in
|
||||
'nova_keystone_authtoken' section in the tricircle.cfg.
|
||||
|
||||
- Execution
|
||||
|
||||
After you configured the options in tricircle.cfg, run the commend:
|
||||
```python config.py [openstack-service-name]```
|
||||
If you want update all services' options in tricircle.cfg, run ```python config.py all```.
|
||||
|
||||
+ **Note**: you can execute multiple times for an option with different value and do
|
||||
not worry about it appears multiple times in *.conf, only the latest value in the conf
|
||||
file.
|
1
script/__init__.py
Executable file
1
script/__init__.py
Executable file
@ -0,0 +1 @@
|
||||
__author__ = 'openstack'
|
113
script/config.py
Executable file
113
script/config.py
Executable file
@ -0,0 +1,113 @@
|
||||
# Copyright (c) 2014 OpenStack Foundation.
|
||||
# All Rights Reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# @author: Jia Dong, HuaWei
|
||||
|
||||
import ConfigParser
|
||||
import os
|
||||
import sys
|
||||
|
||||
DEFAULT_CFG_FILE_PATHS = {
|
||||
'nova': {'nova': '/etc/nova/nova.conf'},
|
||||
'glance': {
|
||||
'api': '/etc/glance/glance-api.conf',
|
||||
'registry': '/etc/glance/glance-registry.conf',
|
||||
'sync': '/etc/glance/glance-sync.conf'
|
||||
},
|
||||
'cinder': {'cinder': '/etc/cinder/cinder.conf'}
|
||||
}
|
||||
|
||||
|
||||
class TricircleConfig(object):
|
||||
CFG_FILE = "tricircle.cfg"
|
||||
|
||||
def __init__(self):
|
||||
self.cf = ConfigParser.ConfigParser()
|
||||
self.cf.read(self.CFG_FILE)
|
||||
|
||||
def update_options(self, module_name, module_cfg_file_paths=None):
|
||||
"""
|
||||
module_name like 'nova', 'glance-api' etc.
|
||||
"""
|
||||
cfg_mapping = module_cfg_file_paths if module_cfg_file_paths \
|
||||
else DEFAULT_CFG_FILE_PATHS.get(module_name, None)
|
||||
|
||||
if not cfg_mapping:
|
||||
print 'Abort, no cfg_file for module %s' \
|
||||
' has configured.' % module_name
|
||||
return
|
||||
options = {}
|
||||
for cfg_mod in cfg_mapping:
|
||||
|
||||
sub_mod = cfg_mod
|
||||
sub_file_path = cfg_mapping[sub_mod]
|
||||
sub_module_name = module_name + '-' + sub_mod if module_name != sub_mod \
|
||||
else module_name
|
||||
options[sub_module_name] = {}
|
||||
|
||||
sections = filter(lambda x: x.startswith(sub_module_name),
|
||||
self.cf.sections())
|
||||
for section in sections:
|
||||
module_section = section[len(sub_module_name):] or 'DEFAULT'
|
||||
module_section = module_section[1:] \
|
||||
if module_section[0] == '_' else module_section
|
||||
|
||||
_options = {}
|
||||
module_options = self.cf.items(section, raw=True)
|
||||
for pair in module_options:
|
||||
_options[pair[0]] = pair[1]
|
||||
options[sub_module_name][module_section] = _options
|
||||
|
||||
if options[sub_module_name]:
|
||||
print '>>> Start updating %s config: ' % sub_module_name
|
||||
TricircleConfig._replace_cfg(options[sub_module_name], sub_file_path)
|
||||
print 'Finish updating %s config. <<< ' % sub_module_name
|
||||
|
||||
@staticmethod
|
||||
def _replace_cfg(options, file_path):
|
||||
if not (file_path and os.path.isfile(file_path)):
|
||||
print 'file_path %s not exists or not a file' % file_path
|
||||
mod_cf = ConfigParser.SafeConfigParser()
|
||||
mod_cf.read(file_path)
|
||||
sections = mod_cf.sections()
|
||||
for _section in options:
|
||||
if _section not in sections and _section != 'DEFAULT':
|
||||
mod_cf.add_section(_section)
|
||||
|
||||
for option in options[_section]:
|
||||
mod_cf.set(_section, option, options[_section][option])
|
||||
|
||||
mod_cf.write(open(file_path, 'w'))
|
||||
print 'Done'
|
||||
|
||||
|
||||
def main():
|
||||
module = sys.argv[1]
|
||||
print module
|
||||
if not module:
|
||||
print 'The input parameters not exists.'
|
||||
try:
|
||||
config = TricircleConfig()
|
||||
if module.upper() == 'ALL':
|
||||
for mod in ('nova', 'glance', 'cinder', 'neutron'):
|
||||
config.update_options(mod)
|
||||
else:
|
||||
config.update_options(module)
|
||||
except Exception as e:
|
||||
print e
|
||||
print 'Update tricircle %s config options fails' % module
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
3
script/exec.sh
Executable file
3
script/exec.sh
Executable file
@ -0,0 +1,3 @@
|
||||
#!/bin/sh
|
||||
|
||||
python config.py all
|
72
script/tricircle.cfg
Executable file
72
script/tricircle.cfg
Executable file
@ -0,0 +1,72 @@
|
||||
[glance-api]
|
||||
sync_enabled=True
|
||||
sync_server_port=9595
|
||||
sync_server_host=127.0.0.1
|
||||
show_multiple_locations=True
|
||||
|
||||
[glance-api_keystone_authtoken]
|
||||
service_host=127.0.0.1
|
||||
auth_host=127.0.0.1
|
||||
auth_uri=http://127.0.0.1:5000/
|
||||
admin_tenant_name=service
|
||||
admin_user=glance
|
||||
admin_password=openstack
|
||||
|
||||
[glance-sync]
|
||||
sync_strategy=All
|
||||
cascading_endpoint_url=http://<glance-endpoint-url>/
|
||||
snapshot_region_names=<region_names(A, B...) for vm snapshot>
|
||||
|
||||
[glance-sync_keystone_authtoken]
|
||||
auth_host=127.0.0.1
|
||||
admin_tenant_name=service
|
||||
admin_user=glance
|
||||
admin_password=openstack
|
||||
|
||||
[nova]
|
||||
vif_plugging_timeout=0
|
||||
vif_plugging_is_fatal=False
|
||||
nova_admin_username=admin
|
||||
nova_admin_password=openstack
|
||||
nova_admin_tenant_name=admin
|
||||
proxy_region_name=<CascadedRegion>
|
||||
cascading_nova_url=http://127.0.0.1:8774/v2
|
||||
cascaded_nova_url=http://127.0.0.1:8774/v2
|
||||
cascaded_neutron_url=http://127.0.0.1:9696
|
||||
cascaded_glance_flag=True
|
||||
cascaded_glance_url=http://127.0.0.1:9292
|
||||
os_region_name=<CascadingRegion>
|
||||
keystone_auth_url=http://127.0.0.1:5000/v2.0/
|
||||
cinder_endpoint_template=http://127.0.0.1:8776/v2/%(project_id)s
|
||||
compute_manager=nova.compute.manager_proxy.ComputeManager
|
||||
image_copy_dest_location_url=file:///var/lib/glance/images
|
||||
image_copy_dest_host=127.0.0.1
|
||||
image_copy_dest_user=glance
|
||||
image_copy_dest_password=openstack
|
||||
image_copy_source_location_url=file:///var/lib/glance/images
|
||||
image_copy_source_host=127.0.0.1
|
||||
image_copy_source_user=glance
|
||||
image_copy_source_password=openstack
|
||||
|
||||
[nova_keystone_authtoken]
|
||||
auth_uri = http://127.0.0.1:5000
|
||||
auth_host = 127.0.0.1
|
||||
admin_tenant_name = service
|
||||
admin_user = nova
|
||||
admin_password = openstack
|
||||
|
||||
[cinder]
|
||||
volume_manager=cinder.volume.cinder_proxy.CinderProxy
|
||||
volume_sync_interval=5
|
||||
voltype_sync_interval=3600
|
||||
periodic_interval=5
|
||||
cinder_tenant_name=admin
|
||||
cinder_username=admin
|
||||
cinder_password=1234
|
||||
keystone_auth_url=http://127.0.0.1:5000/v2.0/
|
||||
glance_cascading_flag=False
|
||||
cascading_glance_url=127.0.0.1:9292
|
||||
cascaded_glance_url=http://127.0.0.1:9292
|
||||
cascaded_cinder_url=http://127.0.0.1:8776/v2/%(project_id)s
|
||||
cascaded_region_name=Region_AZ
|
||||
cascaded_available_zone=AZ
|
Loading…
Reference in New Issue
Block a user