Revert "Add strategy optimization"
This reverts commit 9405496053
.
I've noticed a time penalty (5mins in my env) over just using 'linear'
for the standalone. See if this affects the time on more scenarios by
testing a revert
Change-Id: I18ea66b9ea97228af44803c55dd79533da433741
This commit is contained in:
parent
24eaae5ae9
commit
ab2491686b
|
@ -1,203 +0,0 @@
|
||||||
# Copyright 2020 Red Hat, Inc.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
import copy
|
|
||||||
import imp
|
|
||||||
import os
|
|
||||||
|
|
||||||
import ansible.plugins.strategy as strategy
|
|
||||||
LINEAR = imp.load_source(
|
|
||||||
'linear',
|
|
||||||
os.path.join(os.path.dirname(strategy.__file__), 'linear.py')
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class StrategyModule(LINEAR.StrategyModule):
|
|
||||||
"""Notes about this strategy optimization.
|
|
||||||
|
|
||||||
To improve execution speed, if a task has a conditional attached to
|
|
||||||
it, it will be evaluated server side, before queuing.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
self.hostvars = {}
|
|
||||||
self.host_role_cache = {}
|
|
||||||
super(StrategyModule, self).__init__(*args, **kwargs)
|
|
||||||
|
|
||||||
def _check_when(self, host, task, task_vars):
|
|
||||||
"""Evaluate if a task is to be executed.
|
|
||||||
|
|
||||||
:param host: object
|
|
||||||
:param task: object
|
|
||||||
:param task_vars: dict
|
|
||||||
:retruns: boolean
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
conditional = task.evaluate_conditional(
|
|
||||||
LINEAR.Templar(
|
|
||||||
loader=self._loader,
|
|
||||||
variables=task_vars
|
|
||||||
),
|
|
||||||
task_vars
|
|
||||||
)
|
|
||||||
if not conditional:
|
|
||||||
LINEAR.display.verbose(
|
|
||||||
u'Task "{}" has been omitted from the job because the'
|
|
||||||
u' conditional "{}" was evaluated as "{}"'.format(
|
|
||||||
task.name or None,
|
|
||||||
task.when,
|
|
||||||
conditional
|
|
||||||
),
|
|
||||||
host=host,
|
|
||||||
caplevel=3
|
|
||||||
)
|
|
||||||
return False
|
|
||||||
except Exception:
|
|
||||||
return True
|
|
||||||
else:
|
|
||||||
return True
|
|
||||||
|
|
||||||
def _get_next_task_lockstep(self, hosts, iterator):
|
|
||||||
host_tasks = super(StrategyModule, self)._get_next_task_lockstep(
|
|
||||||
hosts, iterator)
|
|
||||||
|
|
||||||
# If no tasks were returned at all, just return
|
|
||||||
if not host_tasks:
|
|
||||||
return host_tasks
|
|
||||||
|
|
||||||
new_host_tasks = []
|
|
||||||
role_when_cache = {}
|
|
||||||
|
|
||||||
LINEAR.display.vv("\n")
|
|
||||||
|
|
||||||
for h, t in host_tasks:
|
|
||||||
LINEAR.display.vv(
|
|
||||||
"skip_once_per_role: "
|
|
||||||
"Checking host {} for task {}".format(
|
|
||||||
h.name, t and t.name or "None"))
|
|
||||||
task_vars = {}
|
|
||||||
# task is None, assume all others are as well return the original list
|
|
||||||
if t is None:
|
|
||||||
LINEAR.display.vv(
|
|
||||||
" skip_once_per_role: "
|
|
||||||
"task is None, returning host_tasks")
|
|
||||||
return host_tasks
|
|
||||||
# task is meta, always append it to the new list
|
|
||||||
elif t.action == 'meta':
|
|
||||||
# Use vvv here as this gets logged a lot
|
|
||||||
LINEAR.display.vvv(
|
|
||||||
" skip_once_per_role: "
|
|
||||||
"task is meta, appending")
|
|
||||||
# We can't just return host_tasks here, as the task list could
|
|
||||||
# be a mix of meta (noop) tasks and real tasks, depending on
|
|
||||||
# what hosts the task is set to run for. We need to continue
|
|
||||||
# checking the rest of the tasks.
|
|
||||||
new_host_tasks.append((h, t))
|
|
||||||
continue
|
|
||||||
# task has no when argument, append it to the new list
|
|
||||||
elif not t.when:
|
|
||||||
LINEAR.display.vv(
|
|
||||||
" skip_once_per_role: "
|
|
||||||
"task has no when, appending")
|
|
||||||
new_host_tasks.append((h, t))
|
|
||||||
continue
|
|
||||||
# task has a when argument, but also a register argument, append it
|
|
||||||
# to the new list
|
|
||||||
elif t.when and t.register:
|
|
||||||
LINEAR.display.vv(
|
|
||||||
" skip_once_per_role: "
|
|
||||||
"task has when and register, appending")
|
|
||||||
new_host_tasks.append((h, t))
|
|
||||||
continue
|
|
||||||
|
|
||||||
# Check if this host's role is already in the cache
|
|
||||||
role = self.host_role_cache.get(h.name, '')
|
|
||||||
|
|
||||||
# Check if the host belongs to an inventory group that has the
|
|
||||||
# same name as one of the roles we have already seen.
|
|
||||||
# If so, assume that is the host's role, and add it to the
|
|
||||||
# cache.
|
|
||||||
if not role:
|
|
||||||
group_names = [g.name for g in h.groups]
|
|
||||||
for r in set(self.host_role_cache.values()):
|
|
||||||
if r in group_names:
|
|
||||||
role = r
|
|
||||||
self.host_role_cache[h.name] = role
|
|
||||||
break
|
|
||||||
|
|
||||||
# Still no role was found, attempt to look it up using
|
|
||||||
# hostvars.
|
|
||||||
if not role:
|
|
||||||
if not self.hostvars:
|
|
||||||
if not task_vars:
|
|
||||||
task_vars = self._variable_manager.get_vars(play=iterator._play, host=h, task=t)
|
|
||||||
self.hostvars = task_vars['hostvars']
|
|
||||||
role = self.hostvars[h.name].get('tripleo_role_name', '')
|
|
||||||
self.host_role_cache[h.name] = role
|
|
||||||
|
|
||||||
LINEAR.display.vv(
|
|
||||||
" skip_once_per_role: "
|
|
||||||
"host {} has role {}".format(h.name, role))
|
|
||||||
# role was found, it's in role_when_cache, and the value is True,
|
|
||||||
# append it to the new list.
|
|
||||||
if role and role in role_when_cache:
|
|
||||||
if role_when_cache[role]:
|
|
||||||
LINEAR.display.vv(
|
|
||||||
" skip_once_per_role: "
|
|
||||||
"task when is True from cache, "
|
|
||||||
"appending")
|
|
||||||
new_host_tasks.append((h, t))
|
|
||||||
else:
|
|
||||||
LINEAR.display.vv(
|
|
||||||
" skip_once_per_role: "
|
|
||||||
"task when is False from cache, "
|
|
||||||
"skipping")
|
|
||||||
# role is not in the role_when_cache, check the when statement, add
|
|
||||||
# the result to the cache, and if True, append the task to the new list
|
|
||||||
elif role:
|
|
||||||
if not task_vars:
|
|
||||||
task_vars = self._variable_manager.get_vars(play=iterator._play, host=h, task=t)
|
|
||||||
if self._check_when(h, t, task_vars):
|
|
||||||
LINEAR.display.vv(
|
|
||||||
" skip_once_per_role: "
|
|
||||||
"task when evaluated to True, "
|
|
||||||
"appending")
|
|
||||||
new_host_tasks.append((h, t))
|
|
||||||
role_when_cache[role] = True
|
|
||||||
else:
|
|
||||||
LINEAR.display.vv(
|
|
||||||
" skip_once_per_role: "
|
|
||||||
"task when evaluated to False, "
|
|
||||||
"skipping")
|
|
||||||
role_when_cache[role] = False
|
|
||||||
# role was never found, just append the task to the new list
|
|
||||||
else:
|
|
||||||
LINEAR.display.vv(
|
|
||||||
" skip_once_per_role: "
|
|
||||||
"host {} role not found, "
|
|
||||||
"appending".format(h.name))
|
|
||||||
new_host_tasks.append((h, t))
|
|
||||||
|
|
||||||
# can't return an empty list of tasks, or ansible assumes the PLAY is
|
|
||||||
# done. As all tasks may have been removed, we need to add at least one
|
|
||||||
# back if the new list is empty.
|
|
||||||
if not new_host_tasks:
|
|
||||||
LINEAR.display.vv(
|
|
||||||
" skip_once_per_role: "
|
|
||||||
"empty host_tasks, "
|
|
||||||
"appending last seen task")
|
|
||||||
new_host_tasks.append((h, t))
|
|
||||||
|
|
||||||
return new_host_tasks
|
|
Loading…
Reference in New Issue