summaryrefslogtreecommitdiffstats
path: root/playbooks/adhoc/upgrades/library
diff options
context:
space:
mode:
Diffstat (limited to 'playbooks/adhoc/upgrades/library')
-rwxr-xr-xplaybooks/adhoc/upgrades/library/openshift_upgrade_config.py121
1 files changed, 79 insertions, 42 deletions
diff --git a/playbooks/adhoc/upgrades/library/openshift_upgrade_config.py b/playbooks/adhoc/upgrades/library/openshift_upgrade_config.py
index 60f4fd8b8..a6721bb92 100755
--- a/playbooks/adhoc/upgrades/library/openshift_upgrade_config.py
+++ b/playbooks/adhoc/upgrades/library/openshift_upgrade_config.py
@@ -5,11 +5,8 @@
"""Ansible module for modifying OpenShift configs during an upgrade"""
import os
-import shutil
import yaml
-from datetime import datetime
-
DOCUMENTATION = '''
---
module: openshift_upgrade_config
@@ -20,75 +17,106 @@ requirements: [ ]
EXAMPLES = '''
'''
-def get_cfg_dir():
- """Return the correct config directory to use."""
- cfg_path = '/etc/origin/'
- if not os.path.exists(cfg_path):
- cfg_path = '/etc/openshift/'
- return cfg_path
+def modify_api_levels(level_list, remove, ensure, msg_prepend='',
+ msg_append=''):
+ """ modify_api_levels """
+ changed = False
+ changes = []
+
+ if not isinstance(remove, list):
+ remove = []
+ if not isinstance(ensure, list):
+ ensure = []
+
+ if not isinstance(level_list, list):
+ new_list = []
+ changed = True
+ changes.append("%s created missing %s" % (msg_prepend, msg_append))
+ else:
+ new_list = level_list
+ for level in remove:
+ if level in new_list:
+ new_list.remove(level)
+ changed = True
+ changes.append("%s removed %s %s" % (msg_prepend, level, msg_append))
-def upgrade_master_3_0_to_3_1(backup):
+ for level in ensure:
+ if level not in new_list:
+ new_list.append(level)
+ changed = True
+ changes.append("%s added %s %s" % (msg_prepend, level, msg_append))
+
+ return {'new_list': new_list, 'changed': changed, 'changes': changes}
+
+
+def upgrade_master_3_0_to_3_1(ansible_module, config_base, backup):
"""Main upgrade method for 3.0 to 3.1."""
- changed = False
+ changes = []
# Facts do not get transferred to the hosts where custom modules run,
# need to make some assumptions here.
- master_config = os.path.join(get_cfg_dir(), 'master/master-config.yaml')
+ master_config = os.path.join(config_base, 'master/master-config.yaml')
master_cfg_file = open(master_config, 'r')
config = yaml.safe_load(master_cfg_file.read())
master_cfg_file.close()
- # Remove v1beta3 from apiLevels:
- if 'apiLevels' in config and \
- 'v1beta3' in config['apiLevels']:
- config['apiLevels'].remove('v1beta3')
- changed = True
- if 'apiLevels' in config['kubernetesMasterConfig'] and \
- 'v1beta3' in config['kubernetesMasterConfig']['apiLevels']:
- config['kubernetesMasterConfig']['apiLevels'].remove('v1beta3')
- changed = True
- # Add the new master proxy client certs:
- # TODO: re-enable this once these certs are generated during upgrade:
-# if 'proxyClientInfo' not in config['kubernetesMasterConfig']:
-# config['kubernetesMasterConfig']['proxyClientInfo'] = {
-# 'certFile': 'master.proxy-client.crt',
-# 'keyFile': 'master.proxy-client.key'
-# }
+ # Remove unsupported api versions and ensure supported api versions from
+ # master config
+ unsupported_levels = ['v1beta1', 'v1beta2', 'v1beta3']
+ supported_levels = ['v1']
+
+ result = modify_api_levels(config.get('apiLevels'), unsupported_levels,
+ supported_levels, 'master-config.yaml:', 'from apiLevels')
+ if result['changed']:
+ config['apiLevels'] = result['new_list']
+ changes.append(result['changes'])
+
+ if 'kubernetesMasterConfig' in config and 'apiLevels' in config['kubernetesMasterConfig']:
+ config['kubernetesMasterConfig'].pop('apiLevels')
+ changes.append('master-config.yaml: removed kubernetesMasterConfig.apiLevels')
- if changed:
+ # Add proxyClientInfo to master-config
+ if 'proxyClientInfo' not in config['kubernetesMasterConfig']:
+ config['kubernetesMasterConfig']['proxyClientInfo'] = {
+ 'certFile': 'master.proxy-client.crt',
+ 'keyFile': 'master.proxy-client.key'
+ }
+ changes.append("master-config.yaml: added proxyClientInfo")
+
+ if len(changes) > 0:
if backup:
- timestamp = datetime.now().strftime('%Y%m%d%H%M%S')
- basedir = os.path.split(master_config)[0]
- backup_file = os.path.join(basedir, 'master-config.yaml.bak-%s'
- % timestamp)
- shutil.copyfile(master_config, backup_file)
+ # TODO: Check success:
+ ansible_module.backup_local(master_config)
+
# Write the modified config:
out_file = open(master_config, 'w')
out_file.write(yaml.safe_dump(config, default_flow_style=False))
out_file.close()
- return changed
+ return changes
-def upgrade_master(from_version, to_version, backup):
+def upgrade_master(ansible_module, config_base, from_version, to_version, backup):
"""Upgrade entry point."""
if from_version == '3.0':
if to_version == '3.1':
- return upgrade_master_3_0_to_3_1(backup)
+ return upgrade_master_3_0_to_3_1(ansible_module, config_base, backup)
def main():
""" main """
# disabling pylint errors for global-variable-undefined and invalid-name
# for 'global module' usage, since it is required to use ansible_facts
- # pylint: disable=global-variable-undefined, invalid-name
+ # pylint: disable=global-variable-undefined, invalid-name,
+ # redefined-outer-name
global module
module = AnsibleModule(
argument_spec=dict(
+ config_base=dict(required=True),
from_version=dict(required=True, choices=['3.0']),
to_version=dict(required=True, choices=['3.1']),
role=dict(required=True, choices=['master']),
@@ -101,12 +129,21 @@ def main():
to_version = module.params['to_version']
role = module.params['role']
backup = module.params['backup']
+ config_base = module.params['config_base']
- changed = False
- if role == 'master':
- changed = upgrade_master(from_version, to_version, backup)
+ try:
+ changes = []
+ if role == 'master':
+ changes = upgrade_master(module, config_base, from_version,
+ to_version, backup)
+
+ changed = len(changes) > 0
+ return module.exit_json(changed=changed, changes=changes)
- return module.exit_json(changed=changed)
+ # ignore broad-except error to avoid stack trace to ansible user
+ # pylint: disable=broad-except
+ except Exception, e:
+ return module.fail_json(msg=str(e))
# ignore pylint errors related to the module_utils import
# pylint: disable=redefined-builtin, unused-wildcard-import, wildcard-import