Browse Source

Fix conflicts in spec file

Tim Bielawa 8 years ago
parent
commit
ba823255fc

+ 115 - 0
callback_plugins/openshift_quick_installer.py

@@ -0,0 +1,115 @@
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+"""
+This file is a stdout callback plugin for the OpenShift Quick
+Installer. The purpose of this callback plugin is to reduce the amount
+of produced output for customers and enable simpler progress checking.
+
+What's different:
+
+* Playbook progress is expressed as: Play <current_play>/<total_plays> (Play Name)
+  Ex: Play 3/30 (Initialize Megafrobber)
+
+* The Tasks and Handlers in each play (and included roles) are printed
+  as a series of .'s following the play progress line.
+
+"""
+
+from __future__ import (absolute_import, print_function)
+import imp
+import os
+import sys
+
+ANSIBLE_PATH = imp.find_module('ansible')[1]
+DEFAULT_PATH = os.path.join(ANSIBLE_PATH, 'plugins/callback/default.py')
+DEFAULT_MODULE = imp.load_source(
+    'ansible.plugins.callback.default',
+    DEFAULT_PATH
+)
+
+try:
+    from ansible.plugins.callback import CallbackBase
+    BASECLASS = CallbackBase
+except ImportError:  # < ansible 2.1
+    BASECLASS = DEFAULT_MODULE.CallbackModule
+
+
+reload(sys)
+sys.setdefaultencoding('utf-8')
+
+
+class CallbackModule(DEFAULT_MODULE.CallbackModule):
+
+    """
+    Ansible callback plugin
+    """
+    CALLBACK_VERSION = 2.2
+    CALLBACK_TYPE = 'stdout'
+    CALLBACK_NAME = 'openshift_quick_installer'
+    CALLBACK_NEEDS_WHITELIST = False
+    plays_count = 0
+    plays_total_ran = 0
+
+    def v2_playbook_on_start(self, playbook):
+        """This is basically the start of it all"""
+        self.plays_count = len(playbook.get_plays())
+        self.plays_total_ran = 0
+
+    def v2_playbook_on_play_start(self, play):
+        """Each play calls this once before running any tasks
+
+We could print the number of tasks here as well by using
+`play.get_tasks()` but that is not accurate when a play includes a
+role. Only the tasks directly assigned to a play are directly exposed
+in the `play` object.
+
+        """
+        self.plays_total_ran += 1
+        print("")
+        print("Play %s/%s (%s)" % (self.plays_total_ran, self.plays_count, play.get_name()))
+
+    # pylint: disable=unused-argument,no-self-use
+    def v2_playbook_on_task_start(self, task, is_conditional):
+        """This prints out the task header. For example:
+
+TASK [openshift_facts : Ensure PyYaml is installed] ***...
+
+Rather than print out all that for every task, we print a dot
+character to indicate a task has been started.
+        """
+        sys.stdout.write('.')
+
+    def v2_runner_on_ok(self, result):
+        """This prints out task results in a fancy format"""
+        pass
+
+    def v2_runner_item_on_ok(self, result):
+        """Print out task results for you're iterating"""
+        pass
+
+    def v2_runner_item_on_skipped(self, result):
+        """Print out task results when an item is skipped"""
+        pass
+
+    def v2_runner_on_skipped(self, result):
+        """Print out task results when a task (or something else?) is skipped"""
+        pass
+
+    def v2_playbook_on_notify(self, res, handler):
+        """Printer for handlers
+
+Rather than print out a header for every handler, we print a dot
+character to indicate a handler task has been started.
+        """
+        sys.stdout.write('.')

+ 25 - 0
openshift-ansible.spec

@@ -70,6 +70,9 @@ cp -rp filter_plugins %{buildroot}%{_datadir}/ansible_plugins/
 # openshift-ansible-lookup-plugins install
 cp -rp lookup_plugins %{buildroot}%{_datadir}/ansible_plugins/
 
+# openshift-ansible-callback-plugins install
+cp -rp callback_plugins %{buildroot}%{_datadir}/ansible_plugins/
+
 # create symlinks from /usr/share/ansible/plugins/lookup ->
 # /usr/share/ansible_plugins/lookup_plugins
 pushd %{buildroot}%{_datadir}
@@ -77,6 +80,7 @@ mkdir -p ansible/plugins
 pushd ansible/plugins
 ln -s ../../ansible_plugins/lookup_plugins lookup
 ln -s ../../ansible_plugins/filter_plugins filter
+ln -s ../../ansible_plugins/callback_plugins callback
 popd
 popd
 
@@ -89,6 +93,7 @@ mkdir -p %{buildroot}%{_datadir}/atomic-openshift-utils/
 cp etc/ansible.cfg %{buildroot}%{_datadir}/atomic-openshift-utils/ansible.cfg
 mkdir -p %{buildroot}%{_mandir}/man1/
 cp -v docs/man/man1/atomic-openshift-installer.1 %{buildroot}%{_mandir}/man1/
+cp etc/ansible-quiet.cfg %{buildroot}%{_datadir}/atomic-openshift-utils/ansible-quiet.cfg
 popd
 
 # Base openshift-ansible files
@@ -122,6 +127,7 @@ Requires:      %{name} = %{version}
 Requires:      %{name}-roles = %{version}
 Requires:      %{name}-lookup-plugins = %{version}
 Requires:      %{name}-filter-plugins = %{version}
+Requires:      %{name}-callback-plugins = %{version}
 BuildArch:     noarch
 
 %description playbooks
@@ -158,6 +164,7 @@ Summary:       Openshift and Atomic Enterprise Ansible roles
 Requires:      %{name} = %{version}
 Requires:      %{name}-lookup-plugins = %{version}
 Requires:      %{name}-filter-plugins = %{version}
+Requires:      %{name}-callback-plugins = %{version}
 BuildArch:     noarch
 
 %description roles
@@ -199,6 +206,22 @@ BuildArch:     noarch
 %{_datadir}/ansible_plugins/lookup_plugins
 %{_datadir}/ansible/plugins/lookup
 
+
+# ----------------------------------------------------------------------------------
+# openshift-ansible-callback-plugins subpackage
+# ----------------------------------------------------------------------------------
+%package callback-plugins
+Summary:       Openshift and Atomic Enterprise Ansible callback plugins
+Requires:      %{name} = %{version}
+BuildArch:     noarch
+
+%description callback-plugins
+%{summary}.
+
+%files callback-plugins
+%{_datadir}/ansible_plugins/callback_plugins
+%{_datadir}/ansible/plugins/callback
+
 # ----------------------------------------------------------------------------------
 # atomic-openshift-utils subpackage
 # ----------------------------------------------------------------------------------
@@ -222,6 +245,8 @@ Atomic OpenShift Utilities includes
 %{_bindir}/atomic-openshift-installer
 %{_datadir}/atomic-openshift-utils/ansible.cfg
 %{_mandir}/man1/*
+%{_datadir}/atomic-openshift-utils/ansible-quiet.cfg
+
 
 %changelog
 * Mon Sep 26 2016 Scott Dodson <sdodson@redhat.com> 3.4.2-1

+ 3 - 1
utils/Makefile

@@ -80,7 +80,7 @@ ci-pylint:
 	@echo "#############################################"
 	@echo "# Running PyLint Tests in virtualenv"
 	@echo "#############################################"
-	. $(NAME)env/bin/activate && python -m pylint --rcfile ../git/.pylintrc src/ooinstall/cli_installer.py src/ooinstall/oo_config.py src/ooinstall/openshift_ansible.py src/ooinstall/variants.py
+	. $(NAME)env/bin/activate && python -m pylint --rcfile ../git/.pylintrc src/ooinstall/cli_installer.py src/ooinstall/oo_config.py src/ooinstall/openshift_ansible.py src/ooinstall/variants.py ../callback_plugins/openshift_quick_installer.py
 
 ci-list-deps:
 	@echo "#############################################"
@@ -93,12 +93,14 @@ ci-pyflakes:
 	@echo "# Running Pyflakes Compliance Tests in virtualenv"
 	@echo "#################################################"
 	. $(NAME)env/bin/activate && pyflakes src/ooinstall/*.py
+	. $(NAME)env/bin/activate && pyflakes ../callback_plugins/openshift_quick_installer.py
 
 ci-pep8:
 	@echo "#############################################"
 	@echo "# Running PEP8 Compliance Tests in virtualenv"
 	@echo "#############################################"
 	. $(NAME)env/bin/activate && pep8 --ignore=E501,E121,E124 src/$(SHORTNAME)/
+	. $(NAME)env/bin/activate && pep8 --ignore=E501,E121,E124 ../callback_plugins/openshift_quick_installer.py
 
 ci: clean virtualenv ci-list-deps ci-pep8 ci-pylint ci-pyflakes ci-unittests
 	:

+ 33 - 0
utils/etc/ansible-quiet.cfg

@@ -0,0 +1,33 @@
+# config file for ansible -- http://ansible.com/
+# ==============================================
+
+# This config file provides examples for running
+# the OpenShift playbooks with the provided
+# inventory scripts. Only global defaults are
+# left uncommented
+
+[defaults]
+# Add the roles directory to the roles path
+roles_path = roles/
+
+# Set the log_path
+log_path = /tmp/ansible.log
+
+forks = 10
+host_key_checking = False
+nocows = 1
+
+retry_files_enabled = False
+
+deprecation_warnings=False
+
+# Need to handle:
+# inventory - derive from OO_ANSIBLE_DIRECTORY env var
+# callback_plugins - derive from pkg_resource.resource_filename
+# private_key_file - prompt if missing
+# remote_tmp - set if provided by user (cli)
+# ssh_args - set if provided by user (cli)
+# control_path
+
+stdout_callback = openshift_quick_installer
+callback_plugins = /usr/share/ansible_plugins/callback_plugins

+ 3 - 1
utils/etc/ansible.cfg

@@ -19,10 +19,12 @@ nocows = 1
 
 retry_files_enabled = False
 
+deprecation_warnings = False
+
 # Need to handle:
 # inventory - derive from OO_ANSIBLE_DIRECTORY env var
 # callback_plugins - derive from pkg_resource.resource_filename
 # private_key_file - prompt if missing
 # remote_tmp - set if provided by user (cli)
 # ssh_args - set if provided by user (cli)
-# control_path
+# control_path

+ 1 - 1
utils/setup.py

@@ -62,7 +62,7 @@ setup(
     # installed, specify them here.  If using Python 2.6 or less, then these
     # have to be included in MANIFEST.in as well.
     package_data={
-        'ooinstall': ['ansible.cfg', 'ansible_plugins/*'],
+        'ooinstall': ['ansible.cfg', 'ansible-quiet.cfg', 'ansible_plugins/*'],
     },
 
     # Although 'package_data' is the preferred approach, in some case you may

+ 1 - 0
utils/src/MANIFEST.in

@@ -7,3 +7,4 @@ include DESCRIPTION.rst
 # it's already declared in setup.py
 include ooinstall/*
 include ansible.cfg
+include ansible-quiet.cfg

+ 3 - 0
utils/src/ooinstall/cli_installer.py

@@ -25,6 +25,7 @@ installer_file_handler.setLevel(logging.DEBUG)
 installer_log.addHandler(installer_file_handler)
 
 DEFAULT_ANSIBLE_CONFIG = '/usr/share/atomic-openshift-utils/ansible.cfg'
+QUIET_ANSIBLE_CONFIG = '/usr/share/atomic-openshift-utils/ansible-quiet.cfg'
 DEFAULT_PLAYBOOK_DIR = '/usr/share/ansible/openshift-ansible/'
 
 UPGRADE_MAPPINGS = {
@@ -883,6 +884,8 @@ def cli(ctx, unattended, configuration, ansible_playbook_directory, ansible_conf
         # 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_quiet_config'] = QUIET_ANSIBLE_CONFIG
+
     oo_cfg.settings['ansible_log_path'] = ctx.obj['ansible_log_path']
 
     ctx.obj['oo_cfg'] = oo_cfg

+ 6 - 0
utils/src/ooinstall/oo_config.py

@@ -308,6 +308,12 @@ class OOConfig(object):
         if 'ansible_plugins_directory' not in self.settings:
             self.settings['ansible_plugins_directory'] = \
                 resource_filename(__name__, 'ansible_plugins')
+            installer_log.debug("We think the ansible plugins directory should be: %s (it is not already set)",
+                                self.settings['ansible_plugins_directory'])
+        else:
+            installer_log.debug("The ansible plugins directory is already set: %s",
+                                self.settings['ansible_plugins_directory'])
+
         if 'version' not in self.settings:
             self.settings['version'] = 'v2'
 

+ 14 - 2
utils/src/ooinstall/openshift_ansible.py

@@ -7,6 +7,7 @@ import os
 import logging
 import yaml
 from ooinstall.variants import find_variant
+from ooinstall.utils import debug_env
 
 installer_log = logging.getLogger('installer')
 
@@ -225,6 +226,9 @@ def load_system_facts(inventory_file, os_facts_path, env_vars, verbose=False):
     Retrieves system facts from the remote systems.
     """
     installer_log.debug("Inside load_system_facts")
+    installer_log.debug("load_system_facts will run with Ansible/Openshift environment variables:")
+    debug_env(env_vars)
+
     FNULL = open(os.devnull, 'w')
     args = ['ansible-playbook', '-v'] if verbose \
         else ['ansible-playbook']
@@ -232,6 +236,8 @@ def load_system_facts(inventory_file, os_facts_path, env_vars, verbose=False):
         '--inventory-file={}'.format(inventory_file),
         os_facts_path])
     installer_log.debug("Going to subprocess out to ansible now with these args: %s", ' '.join(args))
+    installer_log.debug("Subprocess will run with Ansible/Openshift environment variables:")
+    debug_env(env_vars)
     status = subprocess.call(args, env=env_vars, stdout=FNULL)
     if status != 0:
         installer_log.debug("Exit status from subprocess was not 0")
@@ -280,17 +286,23 @@ def run_main_playbook(inventory_file, hosts, hosts_to_run_on, verbose=False):
     facts_env = os.environ.copy()
     if 'ansible_log_path' in CFG.settings:
         facts_env['ANSIBLE_LOG_PATH'] = CFG.settings['ansible_log_path']
-    if 'ansible_config' in CFG.settings:
-        facts_env['ANSIBLE_CONFIG'] = CFG.settings['ansible_config']
+    if 'ansible_quiet_config' in CFG.settings:
+        facts_env['ANSIBLE_CONFIG'] = CFG.settings['ansible_quiet_config']
+    # facts_env["ANSIBLE_CALLBACK_PLUGINS"] = CFG.settings['ansible_plugins_directory']
+
     return run_ansible(main_playbook_path, inventory_file, facts_env, verbose)
 
 
 def run_ansible(playbook, inventory, env_vars, verbose=False):
+    installer_log.debug("run_ansible will run with Ansible/Openshift environment variables:")
+    debug_env(env_vars)
+
     args = ['ansible-playbook', '-v'] if verbose \
         else ['ansible-playbook']
     args.extend([
         '--inventory-file={}'.format(inventory),
         playbook])
+    installer_log.debug("Going to subprocess out to ansible now with these args: %s", ' '.join(args))
     return subprocess.call(args, env=env_vars)
 
 

+ 10 - 0
utils/src/ooinstall/utils.py

@@ -0,0 +1,10 @@
+import logging
+
+installer_log = logging.getLogger('installer')
+
+
+def debug_env(env):
+    for k in sorted(env.keys()):
+        if k.startswith("OPENSHIFT") or k.startswith("ANSIBLE") or k.startswith("OO"):
+            installer_log.debug("{key}: {value}".format(
+                key=k, value=env[k]))