Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 11 additions & 8 deletions salt/state.py
Original file line number Diff line number Diff line change
Expand Up @@ -1913,30 +1913,33 @@ def _add_to_extend(
req_state_mod_name,
):
"""
Add requisiste `req_id` as a requisite for `id_to_extend`
Add req_id as a requisite for id_to_extend
"""

if id_to_extend not in extend:
# The state does not exist yet: create it
extend[id_to_extend] = HashableOrderedDict()

if (req_states := extend[id_to_extend].get(req_state_mod_name)) is None:
# The requisited state is not present yet, create it and initialize it
if (_req_module := extend[id_to_extend].get(req_state_mod_name)) is None:
# The requisited state module is not present yet, create it and initialize it
extend[id_to_extend][req_state_mod_name] = [
{req_type: [{state_mod_name: req_id}]}
]
return

# Lookup req_type if req_states
for state_arg in req_states:
if (req_items := state_arg.get(req_type)) is not None:
# Lookup req_type in _req_module
for _mod_req in _req_module:
if (req_items := _mod_req.get(req_type)) is not None:
for req_item in req_items:
# (state_mode_name, req_id) is already defined as a requisiste
if req_item.get(state_mod_name) == req_id:
# (state_mode_name, req_id) is already defined as a requisiste
break
else:
# Extending again
state_arg[req_type].append({state_mod_name: req_id})
_mod_req[req_type].append({state_mod_name: req_id})
else:
# req_type does not exist already for this module
_mod_req[req_type] = [{state_mod_name: req_id}]

def requisite_in(self, high):
"""
Expand Down
229 changes: 76 additions & 153 deletions tests/pytests/unit/state/test_add_to_extend.py
Original file line number Diff line number Diff line change
@@ -1,43 +1,24 @@
import logging
from copy import deepcopy

import pytest

import salt.config
import salt.state
from salt.utils.odict import HashableOrderedDict

log = logging.getLogger(__name__)


pytestmark = [
pytest.mark.core_test,
]


@pytest.fixture
def minion_config(minion_opts):
minion_opts["file_client"] = "local"
minion_opts["id"] = "foo01"
return minion_opts


single_extend_test_cases = [
(
{}, # extend
"bar", # id_to_extend
"file", # state_mod_name
"require", # req_type
"foo", # req_id
"file", # req_state_mod_name
{
"bar": HashableOrderedDict({"file": [{"require": [{"file": "foo"}]}]})
}, # expected
)
]

simple_extend_test_cases = [
(
# Simple addition
#
# add_to_extend:
# foo:
# file.managed:
# - required_in:
# - file: bar
{}, # extend
"bar", # id_to_extend
"file", # state_mod_name
Expand All @@ -47,6 +28,22 @@ def minion_config(minion_opts):
{"bar": {"file": [{"require": [{"file": "foo"}]}]}}, # expected
),
(
# Requisite already exists
#
# bar:
# file.managed:
# require:
# - file: foo
# baz:
# file.managed:
# - require:
# - file: foo
#
# add_to_extend:
# foo:
# file.managed:
# - required_in:
# - file: baz
{ # extend
"bar": {
"file": [{"require": [{"file": "foo"}]}],
Expand Down Expand Up @@ -78,163 +75,89 @@ def minion_config(minion_opts):
},
),
(
# Append requisite
#
# bar:
# file.managed:
# require:
# - file: foo
# baz:
# file.managed:
# - require:
# - file: foo
#
# add_to_extend:
# bar:
# file.managed:
# - require_in:
# - file: baz
{ # extend
"/tmp/bar": HashableOrderedDict(
"bar": HashableOrderedDict(
[
("file", [{"require": [{"file": "foo"}]}]),
("__env__", "base"),
("__sls__", "test.foo"),
]
),
"baz": HashableOrderedDict(
[
("file", [{"require": [{"file": "foo"}]}]),
("__env__", "base"),
("__sls__", "test.foo"),
]
),
"foo": HashableOrderedDict(
[("file", [{"prerequired": [{"pkg": "quux-pkg"}]}])]
),
"quux-pkg": HashableOrderedDict(
[
("file", [{"prereq": [{"pkg": "foo"}]}]),
("__env__", "base"),
("__sls__", "test.foo"),
]
),
},
"/tmp/baz", # id_to_extend
"baz", # id_to_extend
"file", # state_mod_name
"require", # req_type
"bar", # req_id
"file", # req_state_mod_name
{ # expected
"/tmp/bar": HashableOrderedDict(
[
("file", [{"require": [{"file": "foo"}]}]),
("__env__", "base"),
("__sls__", "test.foo"),
]
),
"baz": HashableOrderedDict(
[
("file", [{"require": [{"file": "foo"}]}]),
("__env__", "base"),
("__sls__", "test.foo"),
]
),
"foo": HashableOrderedDict(
[("file", [{"prerequired": [{"pkg": "quux-pkg"}]}])]
),
"quux-pkg": HashableOrderedDict(
[
("file", [{"prereq": [{"pkg": "foo"}]}]),
("__env__", "base"),
("__sls__", "test.foo"),
]
),
"/tmp/baz": HashableOrderedDict(
[("file", [{"require": [{"file": "bar"}]}])]
),
},
),
(
{
"bar": HashableOrderedDict(
[
("file", [{"require": [{"file": "foo"}]}]),
("__env__", "base"),
("__sls__", "test.foo"),
]
),
"baz": HashableOrderedDict(
[
("file", [{"require": [{"file": "foo"}]}]),
("__env__", "base"),
("__sls__", "test.foo"),
]
),
"foo": HashableOrderedDict(
[("file", [{"prerequired": [{"pkg": "quux"}]}])]
),
"quux": HashableOrderedDict(
[
("file", [{"prereq": [{"pkg": "foo"}]}]),
("__env__", "base"),
("__sls__", "test.foo"),
]
),
},
"baz",
"file",
"require",
"bar",
"file",
{
"bar": HashableOrderedDict(
[
("file", [{"require": [{"file": "foo"}]}]),
("__env__", "base"),
("__sls__", "test.foo"),
]
),
"baz": HashableOrderedDict(
[
("file", [{"require": [{"file": "foo"}, {"file": "bar"}]}]),
("__env__", "base"),
("__sls__", "test.foo"),
]
),
"foo": HashableOrderedDict(
[("file", [{"prerequired": [{"pkg": "quux"}]}])]
),
"quux": HashableOrderedDict(
[
("file", [{"prereq": [{"pkg": "foo"}]}]),
("__env__", "base"),
("__sls__", "test.foo"),
]
),
},
),
(
{
"bar": HashableOrderedDict(
[
("file", [{"require": [{"file": "foo"}]}]),
("__env__", "base"),
("__sls__", "test.foo"),
]
),
"baz": HashableOrderedDict(
[
("file", [{"require": [{"file": "foo"}]}]),
("__env__", "base"),
("__sls__", "test.foo"),
]
),
# Append with different requisite type
#
# bar:
# file.managed:
# require:
# - file: foo
# baz:
# file.managed:
# - require:
# - file: foo
#
# add_to_extend:
# bar:
# file.managed:
# - prereq_in:
# - file: baz
{ # extend
"bar": {
"file": [{"require": [{"file": "foo"}]}],
},
"baz": {
"file": [{"require": [{"file": "foo"}]}],
},
},
"baz",
"file",
"require",
"bar",
"file",
{
"bar": HashableOrderedDict(
[
("file", [{"require": [{"file": "foo"}]}]),
("__env__", "base"),
("__sls__", "test.foo"),
]
),
"baz": HashableOrderedDict(
[
("file", [{"require": [{"file": "foo"}, {"file": "bar"}]}]),
("__env__", "base"),
("__sls__", "test.foo"),
]
),
"baz", # id_to_extend
"file", # state_mod_name
"prereq", # req_type
"bar", # req_id
"file", # req_state_mod_name
{ # expected
"bar": {
"file": [{"require": [{"file": "foo"}]}],
},
"baz": {
"file": [{"require": [{"file": "foo"}], "prereq": [{"file": "bar"}]}],
},
},
),
]
Expand Down