openshift_upgrade_config.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. # vim: expandtab:tabstop=4:shiftwidth=4
  4. """Ansible module for modifying OpenShift configs during an upgrade"""
  5. import os
  6. import shutil
  7. import yaml
  8. from datetime import datetime
  9. DOCUMENTATION = '''
  10. ---
  11. module: openshift_upgrade_config
  12. short_description: OpenShift Upgrade Config
  13. author: Jason DeTiberus
  14. requirements: [ ]
  15. '''
  16. EXAMPLES = '''
  17. '''
  18. def get_cfg_dir():
  19. """Return the correct config directory to use."""
  20. cfg_path = '/etc/origin/'
  21. if not os.path.exists(cfg_path):
  22. cfg_path = '/etc/openshift/'
  23. return cfg_path
  24. def upgrade_master_3_0_to_3_1(backup):
  25. """Main upgrade method for 3.0 to 3.1."""
  26. changed = False
  27. # Facts do not get transferred to the hosts where custom modules run,
  28. # need to make some assumptions here.
  29. master_config = os.path.join(get_cfg_dir(), 'master/master-config.yaml')
  30. master_cfg_file = open(master_config, 'r')
  31. config = yaml.safe_load(master_cfg_file.read())
  32. master_cfg_file.close()
  33. # Remove v1beta3 from apiLevels:
  34. if 'apiLevels' in config and \
  35. 'v1beta3' in config['apiLevels']:
  36. config['apiLevels'].remove('v1beta3')
  37. changed = True
  38. if 'apiLevels' in config['kubernetesMasterConfig'] and \
  39. 'v1beta3' in config['kubernetesMasterConfig']['apiLevels']:
  40. config['kubernetesMasterConfig']['apiLevels'].remove('v1beta3')
  41. changed = True
  42. # Add the new master proxy client certs:
  43. # TODO: re-enable this once these certs are generated during upgrade:
  44. # if 'proxyClientInfo' not in config['kubernetesMasterConfig']:
  45. # config['kubernetesMasterConfig']['proxyClientInfo'] = {
  46. # 'certFile': 'master.proxy-client.crt',
  47. # 'keyFile': 'master.proxy-client.key'
  48. # }
  49. if changed:
  50. if backup:
  51. timestamp = datetime.now().strftime('%Y%m%d%H%M%S')
  52. basedir = os.path.split(master_config)[0]
  53. backup_file = os.path.join(basedir, 'master-config.yaml.bak-%s'
  54. % timestamp)
  55. shutil.copyfile(master_config, backup_file)
  56. # Write the modified config:
  57. out_file = open(master_config, 'w')
  58. out_file.write(yaml.safe_dump(config, default_flow_style=False))
  59. out_file.close()
  60. return changed
  61. def upgrade_master(from_version, to_version, backup):
  62. """Upgrade entry point."""
  63. if from_version == '3.0':
  64. if to_version == '3.1':
  65. return upgrade_master_3_0_to_3_1(backup)
  66. def main():
  67. """ main """
  68. # disabling pylint errors for global-variable-undefined and invalid-name
  69. # for 'global module' usage, since it is required to use ansible_facts
  70. # pylint: disable=global-variable-undefined, invalid-name
  71. global module
  72. module = AnsibleModule(
  73. argument_spec=dict(
  74. from_version=dict(required=True, choices=['3.0']),
  75. to_version=dict(required=True, choices=['3.1']),
  76. role=dict(required=True, choices=['master']),
  77. backup=dict(required=False, default=True, type='bool')
  78. ),
  79. supports_check_mode=True,
  80. )
  81. from_version = module.params['from_version']
  82. to_version = module.params['to_version']
  83. role = module.params['role']
  84. backup = module.params['backup']
  85. changed = False
  86. if role == 'master':
  87. changed = upgrade_master(from_version, to_version, backup)
  88. return module.exit_json(changed=changed)
  89. # ignore pylint errors related to the module_utils import
  90. # pylint: disable=redefined-builtin, unused-wildcard-import, wildcard-import
  91. # import module snippets
  92. from ansible.module_utils.basic import *
  93. if __name__ == '__main__':
  94. main()