Jelajahi Sumber

Merge pull request #819 from brenton/BZ1274201

Bug 1274201 - Fixing sudo non-interactive test
Brenton Leanhardt 9 tahun lalu
induk
melakukan
8f73151afe
2 mengubah file dengan 71 tambahan dan 43 penghapusan
  1. 49 24
      utils/src/ooinstall/cli_installer.py
  2. 22 19
      utils/src/ooinstall/openshift_ansible.py

+ 49 - 24
utils/src/ooinstall/cli_installer.py

@@ -331,7 +331,22 @@ def get_hosts_to_run_on(oo_cfg, callback_facts, unattended, force):
     # Check if master or nodes already have something installed
     installed_hosts = get_installed_hosts(oo_cfg.hosts, callback_facts)
     if len(installed_hosts) > 0:
-        # present a message listing already installed hosts
+        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) perform a clean install?', 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.master:
                 click.echo("{} is already an OpenShift Master".format(host))
@@ -339,32 +354,42 @@ def get_hosts_to_run_on(oo_cfg, callback_facts, unattended, force):
                 # new nodes.
             elif host.node:
                 click.echo("{} is already an OpenShift Node".format(host))
-                hosts_to_run_on.remove(host)
-        # for unattended either continue if they force install or exit if they didn't
-        if unattended:
-            if not force:
-                click.echo('Installed environment detected and no additional nodes specified: ' \
-                           'aborting. If you want a fresh install, use --force')
-                sys.exit(1)
-        # for attended ask the user what to do
+                # 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:
-            click.echo('Installed environment detected and no additional nodes specified. ')
-            response = click.prompt('Do you want to (1) add more nodes or ' \
-                                    '(2) perform a clean install?', type=int)
-            if response == 1: # add more nodes
-                new_nodes = collect_new_nodes()
-
-                hosts_to_run_on.extend(new_nodes)
-                oo_cfg.hosts.extend(new_nodes)
-
-                openshift_ansible.set_config(oo_cfg)
-                callback_facts, error = openshift_ansible.default_facts(oo_cfg.hosts)
-                if error:
-                    click.echo("There was a problem fetching the required information. " \
-                               "See {} for details.".format(oo_cfg.settings['ansible_log_path']))
+            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:
-                pass # proceeding as normal should do a clean install
+                if not force:
+                    new_nodes = collect_new_nodes()
+
+                    hosts_to_run_on.extend(new_nodes)
+                    oo_cfg.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.hosts)
+                    if error:
+                        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
 

+ 22 - 19
utils/src/ooinstall/openshift_ansible.py

@@ -18,7 +18,6 @@ def set_config(cfg):
 def generate_inventory(hosts):
     global CFG
 
-    installer_host = socket.gethostname()
     base_inventory_path = CFG.settings['ansible_inventory_path']
     base_inventory = open(base_inventory_path, 'w')
     base_inventory.write('\n[OSEv3:children]\nmasters\nnodes\n')
@@ -32,25 +31,18 @@ def generate_inventory(hosts):
         version=CFG.settings.get('variant_version', None))[1]
     base_inventory.write('deployment_type={}\n'.format(ver.ansible_key))
 
-    if 'OO_INSTALL_DEVEL_REGISTRY' in os.environ:
-        base_inventory.write('oreg_url=rcm-img-docker01.build.eng.bos.redhat.com:'
-            '5001/openshift3/ose-${component}:${version}\n')
-    if 'OO_INSTALL_PUDDLE_REPO_ENABLE' in os.environ:
-        base_inventory.write("openshift_additional_repos=[{'id': 'ose-devel', "
+    if 'OO_INSTALL_ADDITIONAL_REGISTRIES' in os.environ:
+        base_inventory.write('cli_docker_additional_registries={}\n'
+          .format(os.environ['OO_INSTALL_ADDITIONAL_REGISTRIES']))
+    if 'OO_INSTALL_INSECURE_REGISTRIES' in os.environ:
+        base_inventory.write('cli_docker_insecure_registries={}\n'
+          .format(os.environ['OO_INSTALL_INSECURE_REGISTRIES']))
+    if 'OO_INSTALL_PUDDLE_REPO' in os.environ:
+        # We have to double the '{' here for literals
+        base_inventory.write("openshift_additional_repos=[{{'id': 'ose-devel', "
             "'name': 'ose-devel', "
-            "'baseurl': 'http://buildvm-devops.usersys.redhat.com"
-            "/puddle/build/AtomicOpenShift/3.1/latest/RH7-RHAOS-3.1/$basearch/os', "
-            "'enabled': 1, 'gpgcheck': 0}]\n")
-    if 'OO_INSTALL_STAGE_REGISTRY' in os.environ:
-        base_inventory.write('oreg_url=registry.access.stage.redhat.com/openshift3/ose-${component}:${version}\n')
-
-    if any(host.hostname == installer_host or host.public_hostname == installer_host
-            for host in hosts):
-        no_pwd_sudo = subprocess.call(['sudo', '-v', '--non-interactive'])
-        if no_pwd_sudo == 1:
-            print 'The atomic-openshift-installer requires sudo access without a password.'
-            sys.exit(1)
-        base_inventory.write("ansible_connection=local\n")
+            "'baseurl': '{}', "
+            "'enabled': 1, 'gpgcheck': 0}}]\n".format(os.environ['OO_INSTALL_PUDDLE_REPO']))
 
     base_inventory.write('\n[masters]\n')
     masters = (host for host in hosts if host.master)
@@ -72,6 +64,7 @@ def generate_inventory(hosts):
 
 def write_host(host, inventory, scheduleable=True):
     global CFG
+
     facts = ''
     if host.ip:
         facts += ' openshift_ip={}'.format(host.ip)
@@ -85,6 +78,16 @@ def write_host(host, inventory, scheduleable=True):
     # Technically only nodes will ever need this.
     if not scheduleable:
         facts += ' openshift_scheduleable=False'
+    installer_host = socket.gethostname()
+    if host.hostname == installer_host or host.public_hostname == installer_host:
+        facts += ' ansible_connection=local'
+        if os.geteuid() != 0:
+            no_pwd_sudo = subprocess.call(['sudo', '-v', '-n'])
+            if no_pwd_sudo == 1:
+                print 'The atomic-openshift-installer requires sudo access without a password.'
+                sys.exit(1)
+            facts += ' ansible_become=true'
+
     inventory.write('{} {}\n'.format(host, facts))