summaryrefslogtreecommitdiffstats
path: root/src/ansiblelint/rules/deprecated_local_action.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/ansiblelint/rules/deprecated_local_action.py')
-rw-r--r--src/ansiblelint/rules/deprecated_local_action.py62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/ansiblelint/rules/deprecated_local_action.py b/src/ansiblelint/rules/deprecated_local_action.py
new file mode 100644
index 0000000..c77e208
--- /dev/null
+++ b/src/ansiblelint/rules/deprecated_local_action.py
@@ -0,0 +1,62 @@
+"""Implementation for deprecated-local-action rule."""
+# Copyright (c) 2016, Tsukinowa Inc. <info@tsukinowa.jp>
+# Copyright (c) 2018, Ansible Project
+from __future__ import annotations
+
+import sys
+from typing import TYPE_CHECKING, Any
+
+from ansiblelint.rules import AnsibleLintRule
+
+if TYPE_CHECKING:
+ from ansiblelint.file_utils import Lintable
+
+
+class TaskNoLocalAction(AnsibleLintRule):
+ """Do not use 'local_action', use 'delegate_to: localhost'."""
+
+ id = "deprecated-local-action"
+ description = "Do not use ``local_action``, use ``delegate_to: localhost``"
+ needs_raw_task = True
+ severity = "MEDIUM"
+ tags = ["deprecations"]
+ version_added = "v4.0.0"
+
+ def matchtask(
+ self, task: dict[str, Any], file: Lintable | None = None
+ ) -> bool | str:
+ """Return matches for a task."""
+ raw_task = task["__raw_task__"]
+ if "local_action" in raw_task.keys():
+ return True
+
+ return False
+
+
+# testing code to be loaded only with pytest or when executed the rule file
+if "pytest" in sys.modules:
+ import pytest
+
+ from ansiblelint.rules import RulesCollection # pylint: disable=ungrouped-imports
+ from ansiblelint.testing import RunFromText
+
+ FAIL_TASK = """
+ - name: Task example
+ local_action:
+ module: boto3_facts
+ """
+
+ SUCCESS_TASK = """
+ - name: Task example
+ boto3_facts:
+ delegate_to: localhost # local_action
+ """
+
+ @pytest.mark.parametrize(("text", "expected"), ((SUCCESS_TASK, 0), (FAIL_TASK, 1)))
+ def test_local_action(text: str, expected: int) -> None:
+ """Positive test deprecated_local_action."""
+ collection = RulesCollection()
+ collection.register(TaskNoLocalAction())
+ runner = RunFromText(collection)
+ results = runner.run_role_tasks_main(text)
+ assert len(results) == expected