예제 #1
0
def cli(ctx, unattended, configuration, ansible_playbook_directory, ansible_config, ansible_log_path):
    """
    The main click CLI module. Responsible for handling most common CLI options,
    assigning any defaults and adding to the context for the sub-commands.
    """
    ctx.obj = {}
    ctx.obj['unattended'] = unattended
    ctx.obj['configuration'] = configuration
    ctx.obj['ansible_config'] = ansible_config
    ctx.obj['ansible_log_path'] = ansible_log_path

    oo_cfg = OOConfig(ctx.obj['configuration'])

    # If no playbook dir on the CLI, check the config:
    if not ansible_playbook_directory:
        ansible_playbook_directory = oo_cfg.settings.get('ansible_playbook_directory', '')
    # If still no playbook dir, check for the default location:
    if not ansible_playbook_directory and os.path.exists(DEFAULT_PLAYBOOK_DIR):
        ansible_playbook_directory = DEFAULT_PLAYBOOK_DIR
    validate_ansible_dir(ansible_playbook_directory)
    oo_cfg.settings['ansible_playbook_directory'] = ansible_playbook_directory
    oo_cfg.ansible_playbook_directory = ansible_playbook_directory
    ctx.obj['ansible_playbook_directory'] = ansible_playbook_directory

    if ctx.obj['ansible_config']:
        oo_cfg.settings['ansible_config'] = ctx.obj['ansible_config']
    elif os.path.exists(DEFAULT_ANSIBLE_CONFIG):
        # If we're installed by RPM this file should exist and we can use it as our default:
        oo_cfg.settings['ansible_config'] = DEFAULT_ANSIBLE_CONFIG

    oo_cfg.settings['ansible_log_path'] = ctx.obj['ansible_log_path']

    ctx.obj['oo_cfg'] = oo_cfg
    openshift_ansible.set_config(oo_cfg)
 def setUp(self):
     self.tempfiles = []
     self.work_dir = tempfile.mkdtemp(prefix='openshift_ansible_tests')
     self.configfile = os.path.join(self.work_dir, 'ooinstall.config')
     with open(self.configfile, 'w') as config_file:
         config_file.write(BASE_CONFIG)
     self.inventory = os.path.join(self.work_dir, 'hosts')
     config = OOConfig(self.configfile)
     config.settings['ansible_inventory_path'] = self.inventory
     openshift_ansible.set_config(config)
예제 #3
0
def cli(ctx, unattended, configuration, ansible_playbook_directory, ansible_config, ansible_log_path, verbose, debug):
    """
    atomic-openshift-installer makes the process for installing OSE or AEP
    easier by interactively gathering the data needed to run on each host.
    It can also be run in unattended mode if provided with a configuration file.

    Further reading: https://docs.openshift.com/enterprise/latest/install_config/install/quick_install.html
    """
    if debug:
        # DEFAULT log level threshold is set to CRITICAL (the
        # highest), anything below that (we only use debug/warning
        # presently) is not logged. If '-d' is given though, we'll
        # lower the threshold to debug (almost everything gets through)
        installer_log.setLevel(logging.DEBUG)
        installer_log.debug("Quick Installer debugging initialized")

    ctx.obj = {}
    ctx.obj['unattended'] = unattended
    ctx.obj['configuration'] = configuration
    ctx.obj['ansible_config'] = ansible_config
    ctx.obj['ansible_log_path'] = ansible_log_path
    ctx.obj['verbose'] = verbose

    try:
        oo_cfg = OOConfig(ctx.obj['configuration'])
    except OOConfigInvalidHostError as e:
        click.echo(e)
        sys.exit(1)

    # If no playbook dir on the CLI, check the config:
    if not ansible_playbook_directory:
        ansible_playbook_directory = oo_cfg.settings.get('ansible_playbook_directory', '')
    # If still no playbook dir, check for the default location:
    if not ansible_playbook_directory and os.path.exists(DEFAULT_PLAYBOOK_DIR):
        ansible_playbook_directory = DEFAULT_PLAYBOOK_DIR
    validate_ansible_dir(ansible_playbook_directory)
    oo_cfg.settings['ansible_playbook_directory'] = ansible_playbook_directory
    oo_cfg.ansible_playbook_directory = ansible_playbook_directory
    ctx.obj['ansible_playbook_directory'] = ansible_playbook_directory

    if ctx.obj['ansible_config']:
        oo_cfg.settings['ansible_config'] = ctx.obj['ansible_config']
    elif 'ansible_config' not in oo_cfg.settings and \
         os.path.exists(DEFAULT_ANSIBLE_CONFIG):
        # If we're installed by RPM this file should exist and we can use it as our default:
        oo_cfg.settings['ansible_config'] = DEFAULT_ANSIBLE_CONFIG

    oo_cfg.settings['ansible_log_path'] = ctx.obj['ansible_log_path']

    ctx.obj['oo_cfg'] = oo_cfg
    openshift_ansible.set_config(oo_cfg)
예제 #4
0
def cli(ctx, unattended, configuration, ansible_playbook_directory, ansible_config, ansible_log_path, verbose):
    """
    atomic-openshift-installer makes the process for installing OSE or AEP
    easier by interactively gathering the data needed to run on each host.
    It can also be run in unattended mode if provided with a configuration file.

    Further reading: https://docs.openshift.com/enterprise/latest/install_config/install/quick_install.html
    """
    ctx.obj = {}
    ctx.obj['unattended'] = unattended
    ctx.obj['configuration'] = configuration
    ctx.obj['ansible_config'] = ansible_config
    ctx.obj['ansible_log_path'] = ansible_log_path
    ctx.obj['verbose'] = verbose

    try:
        oo_cfg = OOConfig(ctx.obj['configuration'])
    except OOConfigInvalidHostError as e:
        click.echo(e)
        sys.exit(1)

    # If no playbook dir on the CLI, check the config:
    if not ansible_playbook_directory:
        ansible_playbook_directory = oo_cfg.settings.get('ansible_playbook_directory', '')
    # If still no playbook dir, check for the default location:
    if not ansible_playbook_directory and os.path.exists(DEFAULT_PLAYBOOK_DIR):
        ansible_playbook_directory = DEFAULT_PLAYBOOK_DIR
    validate_ansible_dir(ansible_playbook_directory)
    oo_cfg.settings['ansible_playbook_directory'] = ansible_playbook_directory
    oo_cfg.ansible_playbook_directory = ansible_playbook_directory
    ctx.obj['ansible_playbook_directory'] = ansible_playbook_directory

    if ctx.obj['ansible_config']:
        oo_cfg.settings['ansible_config'] = ctx.obj['ansible_config']
    elif 'ansible_config' not in oo_cfg.settings and \
        os.path.exists(DEFAULT_ANSIBLE_CONFIG):
        # If we're installed by RPM this file should exist and we can use it as our default:
        oo_cfg.settings['ansible_config'] = DEFAULT_ANSIBLE_CONFIG

    oo_cfg.settings['ansible_log_path'] = ctx.obj['ansible_log_path']

    ctx.obj['oo_cfg'] = oo_cfg
    openshift_ansible.set_config(oo_cfg)
예제 #5
0
def scaleup(ctx, gen_inventory):
    oo_cfg = ctx.obj['oo_cfg']
    verbose = ctx.obj['verbose']
    unattended = ctx.obj['unattended']

    installed_hosts = list(oo_cfg.deployment.hosts)

    if len(installed_hosts) == 0:
        click.echo('No hosts specified.')
        sys.exit(1)

    click.echo('Welcome to the OpenShift Enterprise 3 Scaleup utility.')

    # Scaleup requires manual data entry. Therefore, we do not support
    # unattended operations.
    if unattended:
        msg = """
---

The 'scaleup' operation does not support unattended
functionality. Re-run the installer without the '-u' or '--unattended'
option to continue.
"""
        click.echo(msg)
        sys.exit(1)

    # Resume normal scaleup workflow
    print_installation_summary(installed_hosts,
                               oo_cfg.settings['variant_version'],
                               verbose=False,)
    message = """
---

We have detected this previously installed OpenShift environment.

This tool will guide you through the process of adding additional
nodes to your cluster.
"""
    confirm_continue(message)

    error_if_missing_info(oo_cfg)
    check_hosts_config(oo_cfg, True)

    installed_masters = [host for host in installed_hosts if host.is_master()]
    new_nodes = collect_new_nodes(oo_cfg)

    oo_cfg.deployment.hosts.extend(new_nodes)
    hosts_to_run_on = installed_masters + new_nodes

    openshift_ansible.set_config(oo_cfg)
    click.echo('Gathering information from hosts...')
    callback_facts, error = openshift_ansible.default_facts(oo_cfg.deployment.hosts, verbose)
    if error or callback_facts is None:
        click.echo("There was a problem fetching the required information. See "
                   "{} for details.".format(oo_cfg.settings['ansible_log_path']))
        sys.exit(1)

    print_installation_summary(oo_cfg.deployment.hosts,
                               oo_cfg.settings.get('variant_version', None))
    click.echo('Gathering information from hosts...')
    callback_facts, error = openshift_ansible.default_facts(oo_cfg.deployment.hosts,
                                                            verbose)

    if error or callback_facts is None:
        click.echo("There was a problem fetching the required information. "
                   "Please see {} for details.".format(oo_cfg.settings['ansible_log_path']))
        sys.exit(1)

    # We already verified this is not the case for unattended installs, so this can
    # only trigger for live CLI users:
    if not ctx.obj['unattended'] and len(oo_cfg.calc_missing_facts()) > 0:
        confirm_hosts_facts(oo_cfg, callback_facts)

    # Write quick installer config file to disk:
    oo_cfg.save_to_disk()
    run_config_playbook(oo_cfg, hosts_to_run_on, unattended, verbose, gen_inventory)
예제 #6
0
def get_hosts_to_run_on(oo_cfg, callback_facts, unattended, force, verbose):

    # Copy the list of existing hosts so we can remove any already installed nodes.
    hosts_to_run_on = list(oo_cfg.deployment.hosts)

    # Check if master or nodes already have something installed
    installed_hosts = get_installed_hosts(oo_cfg.deployment.hosts, callback_facts)
    if len(installed_hosts) > 0:
        click.echo('Installed environment detected.')
        # This check has to happen before we start removing hosts later in this method
        if not force:
            if not unattended:
                click.echo('By default the installer only adds new nodes ' \
                           'to an installed environment.')
                response = click.prompt('Do you want to (1) only add additional nodes or ' \
                                        '(2) reinstall the existing hosts ' \
                                        'potentially erasing any custom changes?',
                                        type=int)
                # TODO: this should be reworked with error handling.
                # Click can certainly do this for us.
                # This should be refactored as soon as we add a 3rd option.
                if response == 1:
                    force = False
                if response == 2:
                    force = True

        # present a message listing already installed hosts and remove hosts if needed
        for host in installed_hosts:
            if host.is_master():
                click.echo("{} is already an OpenShift Master".format(host))
                # Masters stay in the list, we need to run against them when adding
                # new nodes.
            elif host.is_node():
                click.echo("{} is already an OpenShift Node".format(host))
                # force is only used for reinstalls so we don't want to remove
                # anything.
                if not force:
                    hosts_to_run_on.remove(host)

        # Handle the cases where we know about uninstalled systems
        new_hosts = set(hosts_to_run_on) - set(installed_hosts)
        if len(new_hosts) > 0:
            for new_host in new_hosts:
                click.echo("{} is currently uninstalled".format(new_host))

            # Fall through
            click.echo('Adding additional nodes...')
        else:
            if unattended:
                if not force:
                    click.echo('Installed environment detected and no additional ' \
                               'nodes specified: aborting. If you want a fresh install, use ' \
                               '`atomic-openshift-installer install --force`')
                    sys.exit(1)
            else:
                if not force:
                    new_nodes = collect_new_nodes(oo_cfg)

                    hosts_to_run_on.extend(new_nodes)
                    oo_cfg.deployment.hosts.extend(new_nodes)

                    openshift_ansible.set_config(oo_cfg)
                    click.echo('Gathering information from hosts...')
                    callback_facts, error = openshift_ansible.default_facts(oo_cfg.deployment.hosts, verbose)
                    if error or callback_facts is None:
                        click.echo("There was a problem fetching the required information. See " \
                                   "{} for details.".format(oo_cfg.settings['ansible_log_path']))
                        sys.exit(1)
                else:
                    pass # proceeding as normal should do a clean install

    return hosts_to_run_on, callback_facts
예제 #7
0
def get_hosts_to_run_on(oo_cfg, callback_facts, unattended, force, verbose):

    # Copy the list of existing hosts so we can remove any already installed nodes.
    hosts_to_run_on = list(oo_cfg.deployment.hosts)

    # Check if master or nodes already have something installed
    installed_hosts, uninstalled_hosts = get_installed_hosts(
        oo_cfg.deployment.hosts, callback_facts)
    if len(installed_hosts) > 0:
        click.echo('Installed environment detected.')
        # This check has to happen before we start removing hosts later in this method
        if not force:
            if not unattended:
                click.echo('By default the installer only adds new nodes '
                           'to an installed environment.')
                response = click.prompt(
                    'Do you want to (1) only add additional nodes or '
                    '(2) reinstall the existing hosts '
                    'potentially erasing any custom changes?',
                    type=int)
                # TODO: this should be reworked with error handling.
                # Click can certainly do this for us.
                # This should be refactored as soon as we add a 3rd option.
                if response == 1:
                    force = False
                if response == 2:
                    force = True

        # present a message listing already installed hosts and remove hosts if needed
        for host in installed_hosts:
            if host.is_master():
                click.echo("{} is already an OpenShift master".format(host))
                # Masters stay in the list, we need to run against them when adding
                # new nodes.
            elif host.is_node():
                click.echo("{} is already an OpenShift node".format(host))
                # force is only used for reinstalls so we don't want to remove
                # anything.
                if not force:
                    hosts_to_run_on.remove(host)

        # Handle the cases where we know about uninstalled systems
        # TODO: This logic is getting hard to understand.
        # we should revise all this to be cleaner.
        if not force and len(uninstalled_hosts) > 0:
            for uninstalled_host in uninstalled_hosts:
                click.echo(
                    "{} is currently uninstalled".format(uninstalled_host))
            # Fall through
            click.echo(
                '\nUninstalled hosts have been detected in your environment. '
                'Please make sure your environment was installed successfully '
                'before adding new nodes. If you want a fresh install, use '
                '`atomic-openshift-installer install --force`')
            sys.exit(1)
        else:
            if unattended:
                if not force:
                    click.echo(
                        'Installed environment detected and no additional '
                        'nodes specified: aborting. If you want a fresh install, use '
                        '`atomic-openshift-installer install --force`')
                    sys.exit(1)
            else:
                if not force:
                    new_nodes = collect_new_nodes(oo_cfg)

                    hosts_to_run_on.extend(new_nodes)
                    oo_cfg.deployment.hosts.extend(new_nodes)

                    openshift_ansible.set_config(oo_cfg)
                    click.echo('Gathering information from hosts...')
                    callback_facts, error = openshift_ansible.default_facts(
                        oo_cfg.deployment.hosts, verbose)
                    if error or callback_facts is None:
                        click.echo(
                            "There was a problem fetching the required information. See "
                            "{} for details.".format(
                                oo_cfg.settings['ansible_log_path']))
                        sys.exit(1)
                else:
                    pass  # proceeding as normal should do a clean install

    return hosts_to_run_on, callback_facts
예제 #8
0
def scaleup(ctx, gen_inventory):
    oo_cfg = ctx.obj['oo_cfg']
    verbose = ctx.obj['verbose']
    unattended = ctx.obj['unattended']

    installed_hosts = list(oo_cfg.deployment.hosts)

    if len(installed_hosts) == 0:
        click.echo('No hosts specified.')
        sys.exit(1)

    click.echo('Welcome to the OpenShift Enterprise 3 Scaleup utility.')

    # Scaleup requires manual data entry. Therefore, we do not support
    # unattended operations.
    if unattended:
        msg = """
---

The 'scaleup' operation does not support unattended
functionality. Re-run the installer without the '-u' or '--unattended'
option to continue.
"""
        click.echo(msg)
        sys.exit(1)

    # Resume normal scaleup workflow
    print_installation_summary(installed_hosts,
                               oo_cfg.settings['variant_version'],
                               verbose=False,)
    message = """
---

We have detected this previously installed OpenShift environment.

This tool will guide you through the process of adding additional
nodes to your cluster.
"""
    confirm_continue(message)

    error_if_missing_info(oo_cfg)
    check_hosts_config(oo_cfg, True)

    installed_masters = [host for host in installed_hosts if host.is_master()]
    new_nodes = collect_new_nodes(oo_cfg)

    oo_cfg.deployment.hosts.extend(new_nodes)
    hosts_to_run_on = installed_masters + new_nodes

    openshift_ansible.set_config(oo_cfg)
    click.echo('Gathering information from hosts...')
    callback_facts, error = openshift_ansible.default_facts(oo_cfg.deployment.hosts, verbose)
    if error or callback_facts is None:
        click.echo("There was a problem fetching the required information. See "
                   "{} for details.".format(oo_cfg.settings['ansible_log_path']))
        sys.exit(1)

    print_installation_summary(oo_cfg.deployment.hosts,
                               oo_cfg.settings.get('variant_version', None))
    click.echo('Gathering information from hosts...')
    callback_facts, error = openshift_ansible.default_facts(oo_cfg.deployment.hosts,
                                                            verbose)

    if error or callback_facts is None:
        click.echo("There was a problem fetching the required information. "
                   "Please see {} for details.".format(oo_cfg.settings['ansible_log_path']))
        sys.exit(1)

    # We already verified this is not the case for unattended installs, so this can
    # only trigger for live CLI users:
    if not ctx.obj['unattended'] and len(oo_cfg.calc_missing_facts()) > 0:
        confirm_hosts_facts(oo_cfg, callback_facts)

    # Write quick installer config file to disk:
    oo_cfg.save_to_disk()
    run_config_playbook(oo_cfg, hosts_to_run_on, unattended, verbose, gen_inventory)