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

Add replaced and overridden states to logging module #150

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
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ def __init__(self, **kwargs):
'type': 'dict'
},
'state': {
'choices': ['merged', 'deleted'],
'choices': ['merged', "replaced", "overridden", 'deleted'],
'default': 'merged',
'type': 'str'
}
Expand Down
117 changes: 116 additions & 1 deletion plugins/module_utils/network/sonic/config/logging/logging.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
from ansible_collections.dellemc.enterprise_sonic.plugins.module_utils.network.sonic.utils.utils import (
get_diff,
update_states,
send_requests,
get_normalize_interface_name,
normalize_interface_name,
normalize_interface_name_list
Expand All @@ -39,6 +40,9 @@
PATCH = 'PATCH'
DELETE = 'DELETE'

DEFAULT_REMOTE_PORT = 514
DEFAULT_LOG_TYPE = 'log'

TEST_KEYS = [
{
"remote_servers": {"host": ""}
Expand Down Expand Up @@ -120,7 +124,6 @@ def set_config(self, existing_logging_facts):
want = []

have = existing_logging_facts

resp = self.set_state(want, have)

return to_list(resp)
Expand All @@ -143,6 +146,10 @@ def set_state(self, want, have):
commands, requests = self._state_deleted(want, have)
elif state == 'merged':
commands, requests = self._state_merged(want, have)
elif state == 'overridden':
commands, requests = self._state_overridden(want, have)
elif state == 'replaced':
commands, requests = self._state_replaced(want, have)

return commands, requests

Expand Down Expand Up @@ -209,6 +216,101 @@ def _state_deleted(self, want, have):

return commands, requests

def _state_replaced(self, want, have):
""" The command generator when state is replaced

:param want: the desired configuration as a dictionary
:param have: the current configuration as a dictionary
:param diff: the difference between want and have
:rtype: A list
:returns: the commands necessary to migrate the current configuration
to the desired configuration
"""
replaced_config = self.get_replaced_config(have, want)
if 'remote_servers' in replaced_config:
replaced_config['remote_servers'].sort(key=self.get_host)
if 'remote_servers' in want:
want['remote_servers'].sort(key=self.get_host)

if replaced_config and replaced_config != want:
delete_all = False
requests = self.get_delete_requests(replaced_config, delete_all)
send_requests(self._module, requests)
replaced_config = []

commands = []
requests = []

if not replaced_config and want:
commands = want
requests = self.get_merge_requests(commands, replaced_config)

if len(requests) > 0:
commands = update_states(commands, "replaced")
else:
commands = []

return commands, requests

def _state_overridden(self, want, have):
""" The command generator when state is overridden

:param want: the desired configuration as a dictionary
:param have: the current configuration as a dictionary
:param diff: the difference between want and have
:rtype: A list
:returns: the commands necessary to migrate the current configuration
to the desired configuration
"""
if 'remote_servers' in have:
have['remote_servers'].sort(key=self.get_host)
if 'remote_servers' in want:
want['remote_servers'].sort(key=self.get_host)

if have and have != want:
delete_all = True
requests = self.get_delete_requests(have, delete_all)
send_requests(self._module, requests)
have = []

commands = []
requests = []

if not have and want:
commands = want
requests = self.get_merge_requests(commands, have)

if len(requests) > 0:
commands = update_states(commands, "overridden")
else:
commands = []

return commands, requests

def get_host(self, remote_server):
return remote_server.get('host')

def search_config_servers(self, host, servers):

if servers is not None:
for server in servers:
if server['host'] == host:
return server
return []

def get_replaced_config(self, have, want):

replaced_config = dict()
replaced_servers = []
if 'remote_servers' in have and 'remote_servers' in want:
for server in want['remote_servers']:
replaced_server = self.search_config_servers(server['host'], have['remote_servers'])
if replaced_server:
replaced_servers.append(replaced_server)

replaced_config['remote_servers'] = replaced_servers
return replaced_config

def validate_want(self, want, state):

if state == 'deleted':
Expand Down Expand Up @@ -241,6 +343,19 @@ def preprocess_want(self, want, state):
if 'vrf' in server and not server['vrf']:
server.pop('vrf', None)

if state == 'replaced' or state == 'overridden':
if 'remote_servers' in want and want['remote_servers'] is not None:
for server in want['remote_servers']:
if 'source_interface' in server and not server['source_interface']:
server.pop('source_interface', None)
else:
server['source_interface'] = \
get_normalize_interface_name(server['source_interface'], self._module)
if 'remote_port' in server and not server['remote_port']:
server['remote_port'] = DEFAULT_REMOTE_PORT
if 'message_type' in server and not server['message_type']:
server['message_type'] = DEFAULT_LOG_TYPE

def get_merge_requests(self, configs, have):

requests = []
Expand Down
70 changes: 68 additions & 2 deletions plugins/modules/sonic_logging.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,10 @@
- The state of the configuration after module completion.
type: str
choices:
- merged
- deleted
- merged
- replaced
- overridden
- deleted
default: merged
"""
EXAMPLES = """
Expand Down Expand Up @@ -153,6 +155,70 @@
#10.11.1.1 616 Ethernet8 - log
#log1.dell.com 6 Ethernet28 - log
#
#
# Using overridden
#
# Before state:
# -------------
#
#sonic# show logging servers
#--------------------------------------------------------------------------------
#HOST PORT SOURCE-INTERFACE VRF MESSGE-TYPE
#--------------------------------------------------------------------------------
#10.11.1.1 616 Ethernet8 - log
#10.11.1.2 626 Ethernet16 - event
#
- name: Replace logging server configuration
sonic_logging:
config:
remote_servers:
- host: 10.11.1.2
remote_port: 622
source_interface: Ethernet24
message_type: event
state: overridden
#
# After state:
# ------------
#
#sonic# show logging servers
#--------------------------------------------------------------------------------
#HOST PORT SOURCE-INTERFACE VRF MESSGE-TYPE
#--------------------------------------------------------------------------------
#10.11.1.2 622 Ethernet24 - event
#
# Using replaced
#
# Before state:
# -------------
#
#sonic# show logging servers
#--------------------------------------------------------------------------------
#HOST PORT SOURCE-INTERFACE VRF MESSGE-TYPE
#--------------------------------------------------------------------------------
#10.11.1.1 616 Ethernet8 - log
#10.11.1.2 626 Ethernet16 - event
#
- name: Replace logging server configuration
sonic_logging:
config:
remote_servers:
- host: 10.11.1.2
remote_port: 622
state: replaced
#
# After state:
# ------------
#
# "MESSAGE-TYPE" has default value of "log"
#
#sonic# show logging servers
#--------------------------------------------------------------------------------
#HOST PORT SOURCE-INTERFACE VRF MESSGE-TYPE
#--------------------------------------------------------------------------------
#10.11.1.1 616 Ethernet8 - log
#10.11.1.2 622 - - log
#
"""
RETURN = """
before:
Expand Down
63 changes: 61 additions & 2 deletions tests/regression/roles/sonic_logging/defaults/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ logging_ip_server_1: 10.11.0.1
logging_ip_server_2: 10.11.0.2
logging_ip_server_3: 10.11.0.3
logging_ip_server_4: 10.11.0.4
logging_ip_server_5: 10.11.0.5
logging_ip_server_6: 10.11.0.6
logging_host_server: logging.dell.com

preparations_tests:
Expand Down Expand Up @@ -63,13 +65,70 @@ tests:
vrf: Vrf_logging_1

- name: test_case_03
description: Replace logging remote server
state: replaced
input:
remote_servers:
- host: "{{ logging_ip_server_3 }}"
source_interface: "{{ interface2 }}"
remote_port: 838

- name: test_case_04
description: Replace logging remote servers
state: replaced
input:
remote_servers:
- host: "{{ logging_ip_server_3 }}"
source_interface: "{{ interface3 }}"
remote_port: 838
message_type: event
- host: "{{ logging_ip_server_4 }}"
source_interface: "{{ interface4 }}"
- host: "{{ logging_ip_server_6 }}"
source_interface: "{{ interface4 }}"
remote_port: 868
message_type: event

- name: test_case_05
description: Overridden logging remote servers
state: overridden
input:
remote_servers:
- host: "{{ logging_ip_server_2 }}"
source_interface: "{{ interface3 }}"
- host: "{{ logging_ip_server_5 }}"
source_interface: "{{ interface4 }}"
remote_port: 858
message_type: event

- name: test_case_06
description: Create several logging remote servers
state: merged
input:
remote_servers:
- host: "{{ logging_ip_server_1 }}"
source_interface: "{{ interface1 }}"
remote_port: 616
message_type: event
vrf: Vrf_logging_1
- host: "{{ logging_ip_server_3 }}"
source_interface: "{{ vlan1 }}"
remote_port: 818
message_type: event
vrf: Vrf_logging_2
- host: "{{ logging_host_server }}"
source_interface: "{{ lo1 }}"
message_type: log
vrf: Vrf_logging_1

- name: test_case_07
description: Delete a logging remote server
state: deleted
input:
remote_servers:
- host: "{{ logging_ip_server_1 }}"

- name: test_case_04
- name: test_case_08
description: Delete several logging remote servers
state: deleted
input:
Expand All @@ -78,7 +137,7 @@ tests:
- host: "{{ logging_ip_server_3 }}"
- host: "{{ logging_host_server }}"

- name: test_case_05
- name: test_case_09
description: Delete all logging configurations
state: deleted
input: {}