devstack/tools/update_clouds_yaml.py
Federico Ressi 21a10d3499 Use python3 as default python command
After Python 2 is getting unsupported, new distros
like CentOS 8 and RHEL8 have stopped providing 'python'
package forcing user to decide which alternative to
use by installing 'python2' or 'python3.x' package
and then setting python alternative.

This change is intended to make using python3 command as
much as possible and use it as default 'python' alternative
where needed.

The final goals motivating this change are:
 - stop using python2 as much as possible
 - help adding support for CentOS 8 and RHEL8

Change-Id: I1e90db987c0bfa6206c211e066be03ea8738ad3f
2020-02-17 17:03:47 +00:00

109 lines
3.7 KiB
Python
Executable File

#!/usr/bin/env python3
# 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,
},
}
if args.os_project_name and args.os_system_scope:
print(
"WARNING: os_project_name and os_system_scope were both"
" given. os_system_scope will take priority.")
if args.os_project_name and not args.os_system_scope:
self._cloud_data['auth']['project_name'] = args.os_project_name
if args.os_identity_api_version == '3' and not args.os_system_scope:
self._cloud_data['auth']['user_domain_id'] = 'default'
self._cloud_data['auth']['project_domain_id'] = 'default'
if args.os_system_scope:
self._cloud_data['auth']['system_scope'] = args.os_system_scope
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='3')
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')
parser.add_argument('--os-system-scope')
args = parser.parse_args()
update_clouds_yaml = UpdateCloudsYaml(args)
update_clouds_yaml.run()
if __name__ == "__main__":
main()