1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
#!/usr/bin/python
# -*- coding: utf-8 -*-
# vim: expandtab:tabstop=4:shiftwidth=4
"""Ansible module for modifying OpenShift configs during an upgrade"""
import os
import shutil
import yaml
from datetime import datetime
DOCUMENTATION = '''
---
module: openshift_upgrade_config
short_description: OpenShift Upgrade Config
author: Jason DeTiberus
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 upgrade_master_3_0_to_3_1(backup):
"""Main upgrade method for 3.0 to 3.1."""
changed = False
# 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_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'
# }
if changed:
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)
# 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
def upgrade_master(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)
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
global module
module = AnsibleModule(
argument_spec=dict(
from_version=dict(required=True, choices=['3.0']),
to_version=dict(required=True, choices=['3.1']),
role=dict(required=True, choices=['master']),
backup=dict(required=False, default=True, type='bool')
),
supports_check_mode=True,
)
from_version = module.params['from_version']
to_version = module.params['to_version']
role = module.params['role']
backup = module.params['backup']
changed = False
if role == 'master':
changed = upgrade_master(from_version, to_version, backup)
return module.exit_json(changed=changed)
# ignore pylint errors related to the module_utils import
# pylint: disable=redefined-builtin, unused-wildcard-import, wildcard-import
# import module snippets
from ansible.module_utils.basic import *
if __name__ == '__main__':
main()
|