From c38bd418e0940deb5fb3f57583d1e6d0019962cf Mon Sep 17 00:00:00 2001 From: Samuel Munilla Date: Thu, 11 Aug 2016 14:58:40 -0400 Subject: Bug 1358951 - Error loading config, no such key: 'deployment' when using previously valid answers file Update the quick installer to automatically convert from the old config file format to the new format. --- utils/src/ooinstall/oo_config.py | 38 +++++++++++++++++++++++++++++++++++--- utils/test/cli_installer_tests.py | 1 + utils/test/fixture.py | 1 + 3 files changed, 37 insertions(+), 3 deletions(-) (limited to 'utils') diff --git a/utils/src/ooinstall/oo_config.py b/utils/src/ooinstall/oo_config.py index 69ad2b4c5..cc6f7b041 100644 --- a/utils/src/ooinstall/oo_config.py +++ b/utils/src/ooinstall/oo_config.py @@ -165,6 +165,7 @@ class OOConfig(object): self._set_defaults() +# pylint: disable=too-many-branches def _read_config(self): try: if os.path.exists(self.config_path): @@ -176,6 +177,10 @@ class OOConfig(object): if 'Description' in self.settings: self._upgrade_legacy_config() + + if loaded_config.get('version', '') == 'v1': + loaded_config = self._upgrade_v1_config(loaded_config) + try: host_list = loaded_config['deployment']['hosts'] role_list = loaded_config['deployment']['roles'] @@ -236,9 +241,36 @@ class OOConfig(object): self.settings['variant'] = 'openshift-enterprise' self.settings['variant_version'] = '3.0' - def _upgrade_v1_config(self): - #TODO write code to upgrade old config - return + def _upgrade_v1_config(self, config): + new_config_data = {} + new_config_data['deployment'] = {} + new_config_data['deployment']['hosts'] = [] + new_config_data['deployment']['roles'] = {} + new_config_data['deployment']['variables'] = {} + + role_list = {} + + if config.get('ansible_ssh_user', False): + new_config_data['deployment']['ansible_ssh_user'] = config['ansible_ssh_user'] + + for host in config['hosts']: + host_props = {} + host_props['roles'] = [] + host_props['connect_to'] = host['connect_to'] + + for prop in ['ip', 'public_ip', 'hostname', 'public_hostname', 'containerized', 'preconfigured']: + host_props[prop] = host.get(prop, None) + + for role in ['master', 'node', 'master_lb', 'storage', 'etcd']: + if host.get(role, False): + host_props['roles'].append(role) + role_list[role] = '' + + new_config_data['deployment']['hosts'].append(host_props) + + new_config_data['deployment']['roles'] = role_list + + return new_config_data def _set_defaults(self): diff --git a/utils/test/cli_installer_tests.py b/utils/test/cli_installer_tests.py index 0556e52a1..8e4c3c4c6 100644 --- a/utils/test/cli_installer_tests.py +++ b/utils/test/cli_installer_tests.py @@ -101,6 +101,7 @@ MOCK_FACTS_QUICKHA = { # Missing connect_to on some hosts: BAD_CONFIG = """ variant: %s +version: v2 deployment: ansible_ssh_user: root hosts: diff --git a/utils/test/fixture.py b/utils/test/fixture.py index b2a0a7134..a883e5c56 100644 --- a/utils/test/fixture.py +++ b/utils/test/fixture.py @@ -12,6 +12,7 @@ SAMPLE_CONFIG = """ variant: %s variant_version: 3.3 master_routingconfig_subdomain: example.com +version: v2 deployment: ansible_ssh_user: root hosts: -- cgit v1.2.3 From 2bb4266be4f3e30f4ab1b22354bbeb68f3432df7 Mon Sep 17 00:00:00 2001 From: Samuel Munilla Date: Fri, 19 Aug 2016 15:51:13 -0400 Subject: a-o-i: Remove Legacy Config Upgrade Remove the automatic upgrade of the 3.0 configuration file format and add some better error messaging that points the user at the docs. --- utils/docs/config.md | 57 +++++++++++++++++++++------------------ utils/src/ooinstall/oo_config.py | 42 +++++++++-------------------- utils/test/cli_installer_tests.py | 5 ++++ utils/test/oo_config_tests.py | 22 +++------------ 4 files changed, 52 insertions(+), 74 deletions(-) (limited to 'utils') diff --git a/utils/docs/config.md b/utils/docs/config.md index 2729f8d37..3677ffe2e 100644 --- a/utils/docs/config.md +++ b/utils/docs/config.md @@ -7,31 +7,38 @@ The default location this config file will be written to ~/.config/openshift/ins ## Example ``` -version: v1 +version: v2 variant: openshift-enterprise -variant_version: 3.0 -ansible_ssh_user: root -hosts: -- ip: 10.0.0.1 - hostname: master-private.example.com - public_ip: 24.222.0.1 - public_hostname: master.example.com - master: true - node: true - containerized: true - connect_to: 24.222.0.1 -- ip: 10.0.0.2 - hostname: node1-private.example.com - public_ip: 24.222.0.2 - public_hostname: node1.example.com - node: true - connect_to: 10.0.0.2 -- ip: 10.0.0.3 - hostname: node2-private.example.com - public_ip: 24.222.0.3 - public_hostname: node2.example.com - node: true - connect_to: 10.0.0.3 +variant_version: 3.3 +deployment: + ansible_ssh_user: root + hosts: + - connect_to: 24.222.0.1 + ip: 10.0.0.1 + hostname: master-private.example.com + public_ip: 24.222.0.1 + public_hostname: master.example.com + roles: + - master + - node + containerized: true + - connect_to: 10.0.0.2 + ip: 10.0.0.2 + hostname: node1-private.example.com + public_ip: 24.222.0.2 + public_hostname: node1.example.com + roles: + - node + - connect_to: 10.0.0.3 + ip: 10.0.0.3 + hostname: node2-private.example.com + public_ip: 24.222.0.3 + public_hostname: node2.example.com + roles: + - node + roles: + master: + node: ``` ## Primary Settings @@ -76,5 +83,3 @@ Defines the user ansible will use to ssh to remote systems for gathering facts a ### ansible_log_path Default: /tmp/ansible.log - - diff --git a/utils/src/ooinstall/oo_config.py b/utils/src/ooinstall/oo_config.py index cc6f7b041..f2990662e 100644 --- a/utils/src/ooinstall/oo_config.py +++ b/utils/src/ooinstall/oo_config.py @@ -167,16 +167,23 @@ class OOConfig(object): # pylint: disable=too-many-branches def _read_config(self): + def _print_read_config_error(error, path='the configuration file'): + message = """ +Error loading config. {}. + +See https://docs.openshift.com/enterprise/latest/install_config/install/quick_install.html#defining-an-installation-configuration-file +for information on creating a configuration file or delete {} and re-run the installer. +""" + print message.format(error, path) + try: if os.path.exists(self.config_path): with open(self.config_path, 'r') as cfgfile: loaded_config = yaml.safe_load(cfgfile.read()) - # Use the presence of a Description as an indicator this is - # a legacy config file: - if 'Description' in self.settings: - self._upgrade_legacy_config() - + if not 'version' in loaded_config: + _print_read_config_error('Legacy configuration file found', self.config_path) + sys.exit(0) if loaded_config.get('version', '') == 'v1': loaded_config = self._upgrade_v1_config(loaded_config) @@ -185,7 +192,7 @@ class OOConfig(object): host_list = loaded_config['deployment']['hosts'] role_list = loaded_config['deployment']['roles'] except KeyError as e: - print "Error loading config, no such key: {}".format(e) + _print_read_config_error("No such key: {}".format(e), self.config_path) sys.exit(0) for setting in CONFIG_PERSIST_SETTINGS: @@ -218,29 +225,6 @@ class OOConfig(object): raise OOConfigFileError( 'Config file "{}" is not a valid YAML document'.format(self.config_path)) - def _upgrade_legacy_config(self): - new_hosts = [] - remove_settings = ['validated_facts', 'Description', 'Name', - 'Subscription', 'Vendor', 'Version', 'masters', 'nodes'] - - if 'validated_facts' in self.settings: - for key, value in self.settings['validated_facts'].iteritems(): - value['connect_to'] = key - if 'masters' in self.settings and key in self.settings['masters']: - value['master'] = True - if 'nodes' in self.settings and key in self.settings['nodes']: - value['node'] = True - new_hosts.append(value) - self.settings['hosts'] = new_hosts - - for s in remove_settings: - if s in self.settings: - del self.settings[s] - - # A legacy config implies openshift-enterprise 3.0: - self.settings['variant'] = 'openshift-enterprise' - self.settings['variant_version'] = '3.0' - def _upgrade_v1_config(self, config): new_config_data = {} new_config_data['deployment'] = {} diff --git a/utils/test/cli_installer_tests.py b/utils/test/cli_installer_tests.py index 8e4c3c4c6..6d9d443ff 100644 --- a/utils/test/cli_installer_tests.py +++ b/utils/test/cli_installer_tests.py @@ -133,6 +133,7 @@ deployment: QUICKHA_CONFIG = """ variant: %s +version: v2 deployment: ansible_ssh_user: root hosts: @@ -190,6 +191,7 @@ deployment: QUICKHA_2_MASTER_CONFIG = """ variant: %s +version: v2 deployment: ansible_ssh_user: root hosts: @@ -239,6 +241,7 @@ deployment: QUICKHA_CONFIG_REUSED_LB = """ variant: %s +version: v2 deployment: ansible_ssh_user: root hosts: @@ -282,6 +285,7 @@ deployment: QUICKHA_CONFIG_NO_LB = """ variant: %s +version: v2 deployment: ansible_ssh_user: root hosts: @@ -324,6 +328,7 @@ deployment: QUICKHA_CONFIG_PRECONFIGURED_LB = """ variant: %s +version: v2 deployment: ansible_ssh_user: root hosts: diff --git a/utils/test/oo_config_tests.py b/utils/test/oo_config_tests.py index f82d55b05..b5068cc14 100644 --- a/utils/test/oo_config_tests.py +++ b/utils/test/oo_config_tests.py @@ -13,6 +13,7 @@ from ooinstall.oo_config import OOConfig, Host, OOConfigInvalidHostError SAMPLE_CONFIG = """ variant: openshift-enterprise variant_version: 3.3 +version: v2 deployment: ansible_ssh_user: root hosts: @@ -43,27 +44,9 @@ deployment: node: """ -# Used to test automatic upgrading of config: -LEGACY_CONFIG = """ -Description: This is the configuration file for the OpenShift Ansible-Based Installer. -Name: OpenShift Ansible-Based Installer Configuration -Subscription: {type: none} -Vendor: OpenShift Community -Version: 0.0.1 -ansible_config: /tmp/notreal/ansible.cfg -ansible_inventory_directory: /tmp/notreal/.config/openshift/.ansible -ansible_log_path: /tmp/ansible.log -ansible_plugins_directory: /tmp/notreal/.python-eggs/ooinstall-3.0.0-py2.7.egg-tmp/ooinstall/ansible_plugins -masters: [10.0.0.1] -nodes: [10.0.0.2, 10.0.0.3] -validated_facts: - 10.0.0.1: {hostname: master-private.example.com, ip: 10.0.0.1, public_hostname: master.example.com, public_ip: 24.222.0.1} - 10.0.0.2: {hostname: node1-private.example.com, ip: 10.0.0.2, public_hostname: node1.example.com, public_ip: 24.222.0.2} - 10.0.0.3: {hostname: node2-private.example.com, ip: 10.0.0.3, public_hostname: node2.example.com, public_ip: 24.222.0.3} -""" - CONFIG_INCOMPLETE_FACTS = """ +version: v2 deployment: ansible_ssh_user: root hosts: @@ -91,6 +74,7 @@ deployment: CONFIG_BAD = """ variant: openshift-enterprise +version: v2 deployment: ansible_ssh_user: root hosts: -- cgit v1.2.3