summaryrefslogtreecommitdiffstats
path: root/playbooks/adhoc/upgrades/library/openshift_upgrade_config.py
blob: f41c6fb59b4752f36cd2669001cc9b49c64e9a21 (plain)
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
#!/usr/bin/python
# -*- coding: utf-8 -*-
# vim: expandtab:tabstop=4:shiftwidth=4

import os
import shutil
import yaml

from datetime import datetime

"""Ansible module for modifying OpenShift configs during an upgrade"""

DOCUMENTATION = '''
---
module: openshift_upgrade_config
short_description: OpenShift Upgrade Config
author: Jason DeTiberus
requirements: [ ]
'''
EXAMPLES = '''
'''

def get_cfg_dir():
    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):
    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')

    f = open(master_config, 'r')
    config = yaml.safe_load(f.read())
    f.close()

    # Remove v1beta3 from apiLevels:
    if 'apiLevels' in config and \
        'v1beta3' in config['apiLevels']:
            config['apiLevels'].remove('v1beta3')
            changed = True
    if 'kubernetesMasterConfig' in config and \
        'apiLevels' in config['kubernetesMasterConfig'] and \
        'v1beta3' in config['kubernetesMasterConfig']['apiLevels']:
            config['kubernetesMasterConfig']['apiLevels'].remove('v1beta3')
            changed = True

    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):
    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()