Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[master] Fix ipset new_set bug #65044

Merged
merged 5 commits into from
Sep 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
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
1 change: 1 addition & 0 deletions changelog/61620.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
`ipset.new_set` no longer fails when creating a set type that uses the `family` create option
26 changes: 13 additions & 13 deletions salt/modules/ipset.py
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,7 @@ def new_set(name=None, set_type=None, family="ipv4", comment=False, **kwargs):
# Check for required arguments
for item in _CREATE_OPTIONS_REQUIRED[set_type]:
if item not in kwargs:
return "Error: {} is a required argument".format(item)
return f"Error: {item} is a required argument"

cmd = [_ipset_cmd(), "create", name, set_type]

Expand All @@ -328,7 +328,7 @@ def new_set(name=None, set_type=None, family="ipv4", comment=False, **kwargs):

# Family only valid for certain set types
if "family" in _CREATE_OPTIONS[set_type]:
cmd.extend(["family", cmd, ipset_family])
cmd.extend(["family", ipset_family])

if comment:
cmd.append("comment")
Expand Down Expand Up @@ -478,44 +478,44 @@ def add(name=None, entry=None, family="ipv4", **kwargs):

setinfo = _find_set_info(name)
if not setinfo:
return "Error: Set {} does not exist".format(name)
return f"Error: Set {name} does not exist"

settype = setinfo["Type"]

cmd = [_ipset_cmd(), "add", "-exist", name] + entry.split()

if "timeout" in kwargs:
if "timeout" not in setinfo["Header"]:
return "Error: Set {} not created with timeout support".format(name)
return f"Error: Set {name} not created with timeout support"

if "packets" in kwargs or "bytes" in kwargs:
if "counters" not in setinfo["Header"]:
return "Error: Set {} not created with counters support".format(name)
return f"Error: Set {name} not created with counters support"

if "comment" in kwargs:
if "comment" not in setinfo["Header"]:
return "Error: Set {} not created with comment support".format(name)
return f"Error: Set {name} not created with comment support"
if "comment" not in entry:
cmd = cmd + ["comment", f"{kwargs['comment']}"]

if {"skbmark", "skbprio", "skbqueue"} & set(kwargs.keys()):
if "skbinfo" not in setinfo["Header"]:
return "Error: Set {} not created with skbinfo support".format(name)
return f"Error: Set {name} not created with skbinfo support"

for item in _ADD_OPTIONS[settype]:
if item in kwargs:
cmd.extend([item, kwargs[item]])

current_members = _find_set_members(name)
if entry in current_members:
return "Warn: Entry {} already exists in set {}".format(entry, name)
return f"Warn: Entry {entry} already exists in set {name}"

# Using -exist to ensure entries are updated if the comment changes
out = __salt__["cmd.run"](cmd, python_shell=False)

if not out:
return "Success"
return "Error: {}".format(out)
return f"Error: {out}"


def delete(name=None, entry=None, family="ipv4", **kwargs):
Expand All @@ -537,14 +537,14 @@ def delete(name=None, entry=None, family="ipv4", **kwargs):
settype = _find_set_type(name)

if not settype:
return "Error: Set {} does not exist".format(name)
return f"Error: Set {name} does not exist"

cmd = [_ipset_cmd(), "del", name, entry]
out = __salt__["cmd.run"](cmd, python_shell=False)

if not out:
return "Success"
return "Error: {}".format(out)
return f"Error: {out}"


def check(name=None, entry=None, family="ipv4"):
Expand Down Expand Up @@ -581,7 +581,7 @@ def check(name=None, entry=None, family="ipv4"):

settype = _find_set_type(name)
if not settype:
return "Error: Set {} does not exist".format(name)
return f"Error: Set {name} does not exist"

current_members = _parse_members(settype, _find_set_members(name))

Expand Down Expand Up @@ -621,7 +621,7 @@ def test(name=None, entry=None, family="ipv4", **kwargs):

settype = _find_set_type(name)
if not settype:
return "Error: Set {} does not exist".format(name)
return f"Error: Set {name} does not exist"

cmd = [_ipset_cmd(), "test", name, entry]
out = __salt__["cmd.run_all"](cmd, python_shell=False)
Expand Down
14 changes: 14 additions & 0 deletions tests/pytests/functional/modules/test_ipset.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,3 +47,17 @@ def test_ipset_add_comment_kwarg(ipset, setup_set):
assert ret == "Success"
check_set = ipset.list_sets()
assert any([x for x in check_set if x["Name"] == setup_set])


def test_ipset_new_set_with_family(ipset):
"""
test ipset.new_set with set_type that uses family (eg. hash:ip)
"""
set_name = "test_name_haship"
ret = ipset.new_set(name=set_name, set_type="hash:ip")
assert ret is True
check_set = ipset.list_sets()
try:
assert any([x for x in check_set if x["Name"] == set_name])
finally:
ipset.delete_set(set_name)