diff --git a/changelogs/fragments/84725-deprecate-strategy-plugins.yml b/changelogs/fragments/84725-deprecate-strategy-plugins.yml new file mode 100644 index 00000000000..78f527b82ca --- /dev/null +++ b/changelogs/fragments/84725-deprecate-strategy-plugins.yml @@ -0,0 +1,2 @@ +deprecated_features: +- Stategy Plugins - Use of strategy plugins not provided in ``ansible.builtin`` are deprecated and do not carry any backwards compatibility guarantees going forward. A future release will remove the ability to use external strategy plugins. No alternative for third party strategy plugins is currently planned. diff --git a/lib/ansible/plugins/loader.py b/lib/ansible/plugins/loader.py index 2132b5f3d0f..ea174e50211 100644 --- a/lib/ansible/plugins/loader.py +++ b/lib/ansible/plugins/loader.py @@ -861,7 +861,16 @@ class PluginLoader: setattr(obj, 'ansible_name', names[0]) def get(self, name, *args, **kwargs): - return self.get_with_context(name, *args, **kwargs).object + ctx = self.get_with_context(name, *args, **kwargs) + is_core_plugin = ctx.plugin_load_context.plugin_resolved_collection == 'ansible.builtin' + if self.class_name == 'StrategyModule' and not is_core_plugin: + display.deprecated( # pylint: disable=ansible-deprecated-no-version + 'Use of strategy plugins not included in ansible.builtin are deprecated and do not carry ' + 'any backwards compatibility guarantees. No alternative for third party strategy plugins ' + 'is currently planned.' + ) + + return ctx.object def get_with_context(self, name, *args, **kwargs): """ instantiates a plugin of the given name using arguments """ diff --git a/test/integration/targets/strategy-external/aliases b/test/integration/targets/strategy-external/aliases new file mode 100644 index 00000000000..1f51dc4269a --- /dev/null +++ b/test/integration/targets/strategy-external/aliases @@ -0,0 +1,3 @@ +shippable/posix/group5 +context/controller +needs/target/collection diff --git a/test/integration/targets/strategy-external/ansible_collections/ns/col/plugins/strategy/external.py b/test/integration/targets/strategy-external/ansible_collections/ns/col/plugins/strategy/external.py new file mode 100644 index 00000000000..bb7d1b40c18 --- /dev/null +++ b/test/integration/targets/strategy-external/ansible_collections/ns/col/plugins/strategy/external.py @@ -0,0 +1,7 @@ +from __future__ import annotations + +from ansible.plugins.strategy.linear import StrategyModule as LinearStrategy + + +class StrategyModule(LinearStrategy): + ... diff --git a/test/integration/targets/strategy-external/runme.sh b/test/integration/targets/strategy-external/runme.sh new file mode 100755 index 00000000000..92eb8816f27 --- /dev/null +++ b/test/integration/targets/strategy-external/runme.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +source ../collection/setup.sh + +set -eux +export ANSIBLE_DEPRECATION_WARNINGS=1 +export ANSIBLE_COLLECTIONS_PATH="${WORK_DIR}" +export ANSIBLE_STRATEGY=ns.col.external +output="$(ansible localhost -m debug 2>&1 | tee -a /dev/stderr)" +if [[ "${output}" != *"Use of strategy plugins not included in ansible.builtin"* ]]; then + echo 'ERROR: Did not find deprecation warning for removal of strategy plugins' + exit 1 +fi