devstack/tools/update_clouds_yaml.py

101 lines
3.3 KiB
Python
Executable File

#!/usr/bin/env python
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
# Update the clouds.yaml file.
import argparse
import os.path
import yaml
class UpdateCloudsYaml(object):
def __init__(self, args):
if args.file:
self._clouds_path = args.file
self._create_directory = False
else:
self._clouds_path = os.path.expanduser(
'~/.config/openstack/clouds.yaml')
self._create_directory = True
self._clouds = {}
self._cloud = args.os_cloud
self._cloud_data = {
'region_name': args.os_region_name,
'identity_api_version': args.os_identity_api_version,
'volume_api_version': args.os_volume_api_version,
'auth': {
'auth_url': args.os_auth_url,
'username': args.os_username,
'password': args.os_password,
'project_name': args.os_project_name,
},
}
if args.os_identity_api_version == '3':
self._cloud_data['auth']['user_domain_id'] = 'default'
self._cloud_data['auth']['project_domain_id'] = 'default'
if args.os_cacert:
self._cloud_data['cacert'] = args.os_cacert
def run(self):
self._read_clouds()
self._update_clouds()
self._write_clouds()
def _read_clouds(self):
try:
with open(self._clouds_path) as clouds_file:
self._clouds = yaml.load(clouds_file)
except IOError:
# The user doesn't have a clouds.yaml file.
print("The user clouds.yaml file didn't exist.")
self._clouds = {}
def _update_clouds(self):
self._clouds.setdefault('clouds', {})[self._cloud] = self._cloud_data
def _write_clouds(self):
if self._create_directory:
clouds_dir = os.path.dirname(self._clouds_path)
os.makedirs(clouds_dir)
with open(self._clouds_path, 'w') as clouds_file:
yaml.dump(self._clouds, clouds_file, default_flow_style=False)
def main():
parser = argparse.ArgumentParser('Update clouds.yaml file.')
parser.add_argument('--file')
parser.add_argument('--os-cloud', required=True)
parser.add_argument('--os-region-name', default='RegionOne')
parser.add_argument('--os-identity-api-version', default='3')
parser.add_argument('--os-volume-api-version', default='2')
parser.add_argument('--os-cacert')
parser.add_argument('--os-auth-url', required=True)
parser.add_argument('--os-username', required=True)
parser.add_argument('--os-password', required=True)
parser.add_argument('--os-project-name', required=True)
args = parser.parse_args()
update_clouds_yaml = UpdateCloudsYaml(args)
update_clouds_yaml.run()
if __name__ == "__main__":
main()