summaryrefslogtreecommitdiff
path: root/lib/ansible/module_utils/network/eos/config/static_routes/static_routes.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ansible/module_utils/network/eos/config/static_routes/static_routes.py')
-rw-r--r--lib/ansible/module_utils/network/eos/config/static_routes/static_routes.py390
1 files changed, 0 insertions, 390 deletions
diff --git a/lib/ansible/module_utils/network/eos/config/static_routes/static_routes.py b/lib/ansible/module_utils/network/eos/config/static_routes/static_routes.py
deleted file mode 100644
index ae3e4609c1..0000000000
--- a/lib/ansible/module_utils/network/eos/config/static_routes/static_routes.py
+++ /dev/null
@@ -1,390 +0,0 @@
-#
-# -*- coding: utf-8 -*-
-# Copyright 2019 Red Hat
-# GNU General Public License v3.0+
-# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
-"""
-The eos_static_routes class
-It is in this file where the current configuration (as dict)
-is compared to the provided configuration (as dict) and the command set
-necessary to bring the current configuration to it's desired end-state is
-created
-"""
-
-from __future__ import (absolute_import, division, print_function)
-__metaclass__ = type
-
-import re
-from ansible.module_utils.network.common.cfg.base import ConfigBase
-from ansible.module_utils.network.common.utils import remove_empties
-from ansible.module_utils.network.eos.facts.facts import Facts
-
-
-class Static_routes(ConfigBase):
- """
- The eos_static_routes class
- """
-
- gather_subset = [
- '!all',
- '!min',
- ]
-
- gather_network_resources = [
- 'static_routes',
- ]
-
- def __init__(self, module):
- super(Static_routes, self).__init__(module)
-
- def get_static_routes_facts(self, data=None):
- """ Get the 'facts' (the current configuration)
-
- :rtype: A dictionary
- :returns: The current configuration as a dictionary
- """
- facts, _warnings = Facts(self._module).get_facts(self.gather_subset, self.gather_network_resources, data=data)
- static_routes_facts = facts['ansible_network_resources'].get('static_routes')
- if not static_routes_facts:
- return []
- return static_routes_facts
-
- def execute_module(self):
- """ Execute the module
-
- :rtype: A dictionary
- :returns: The result from module execution
- """
- result = {'changed': False}
- warnings = list()
- commands = list()
- if self.state in self.ACTION_STATES:
- existing_static_routes_facts = self.get_static_routes_facts()
- else:
- existing_static_routes_facts = []
-
- if self.state in self.ACTION_STATES or self.state == 'rendered':
- commands.extend(self.set_config(existing_static_routes_facts))
-
- if commands and self.state in self.ACTION_STATES:
- if not self._module.check_mode:
- for command in commands:
- self._connection.edit_config(command)
- result['changed'] = True
- if self.state in self.ACTION_STATES:
- result['commands'] = commands
- if self.state in self.ACTION_STATES or self.state == 'gathered':
- changed_static_routes_facts = self.get_static_routes_facts()
- elif self.state == 'rendered':
- result['rendered'] = commands
- elif self.state == 'parsed':
- if not self._module.params['running_config']:
- self._module.fail_json(msg="Value of running_config parameter must not be empty for state parsed")
- result['parsed'] = self.get_static_routes_facts(data=self._module.params['running_config'])
- else:
- changed_static_routes_facts = []
-
- if self.state in self.ACTION_STATES:
- result['before'] = existing_static_routes_facts
- if result['changed']:
- result['after'] = changed_static_routes_facts
- elif self.state == 'gathered':
- result['gathered'] = changed_static_routes_facts
-
- result['warnings'] = warnings
- return result
-
- def set_config(self, existing_static_routes_facts):
- """ Collect the configuration from the args passed to the module,
- collect the current configuration (as a dict from facts)
-
- :rtype: A list
- :returns: the commands necessary to migrate the current configuration
- to the desired configuration
- """
- commands = []
- onbox_configs = []
- for h in existing_static_routes_facts:
- return_command = add_commands(h)
- for command in return_command:
- onbox_configs.append(command)
- config = self._module.params.get('config')
- want = []
- if config:
- for w in config:
- want.append(remove_empties(w))
- have = existing_static_routes_facts
- resp = self.set_state(want, have)
- for want_config in resp:
- if want_config not in onbox_configs:
- commands.append(want_config)
- return commands
-
- def set_state(self, want, have):
- """ Select the appropriate function based on the state provided
-
- :param want: the desired configuration as a dictionary
- :param have: the current configuration as a dictionary
- :rtype: A list
- :returns: the commands necessary to migrate the current configuration
- to the desired configuration
- """
- commands = []
- if self.state in ('merged', 'replaced', 'overridden') and not want:
- self._module.fail_json(msg='value of config parameter must not be empty for state {0}'.format(self.state))
- state = self._module.params['state']
- if state == 'overridden':
- commands = self._state_overridden(want, have)
- elif state == 'deleted':
- commands = self._state_deleted(want, have)
- elif state == 'merged' or self.state == 'rendered':
- commands = self._state_merged(want, have)
- elif state == 'replaced':
- commands = self._state_replaced(want, have)
- return commands
-
- @staticmethod
- def _state_replaced(want, have):
- """ The command generator when state is replaced
-
- :rtype: A list
- :returns: the commands necessary to migrate the current configuration
- to the desired configuration
- """
- commands = []
- haveconfigs = []
- vrf = get_vrf(want)
- dest = get_dest(want)
- for h in have:
- return_command = add_commands(h)
- for command in return_command:
- for d in dest:
- if d in command:
- if vrf is None:
- if "vrf" not in command:
- haveconfigs.append(command)
- else:
- if vrf in command:
- haveconfigs.append(command)
- wantconfigs = set_commands(want, have)
-
- removeconfigs = list(set(haveconfigs) - set(wantconfigs))
- for command in removeconfigs:
- commands.append("no " + command)
- for wantcmd in wantconfigs:
- commands.append(wantcmd)
- return commands
-
- @staticmethod
- def _state_overridden(want, have):
- """ The command generator when state is overridden
-
- :rtype: A list
- :returns: the commands necessary to migrate the current configuration
- to the desired configuration
- """
- commands = []
- haveconfigs = []
- for h in have:
- return_command = add_commands(h)
- for command in return_command:
- haveconfigs.append(command)
- wantconfigs = set_commands(want, have)
- idempotentconfigs = list(set(haveconfigs) - set(wantconfigs))
- if not idempotentconfigs:
- return idempotentconfigs
- removeconfigs = list(set(haveconfigs) - set(wantconfigs))
- for command in removeconfigs:
- commands.append("no " + command)
- for wantcmd in wantconfigs:
- commands.append(wantcmd)
- return commands
-
- @staticmethod
- def _state_merged(want, have):
- """ The command generator when state is merged
-
- :rtype: A list
- :returns: the commands necessary to merge the provided into
- the current configuration
- """
- return set_commands(want, have)
-
- @staticmethod
- def _state_deleted(want, have):
- """ The command generator when state is deleted
-
- :rtype: A list
- :returns: the commands necessary to remove the current configuration
- of the provided objects
- """
- commands = []
- if not want:
- for h in have:
- return_command = add_commands(h)
- for command in return_command:
- command = "no " + command
- commands.append(command)
- else:
- for w in want:
- return_command = del_commands(w, have)
- for command in return_command:
- commands.append(command)
- return commands
-
-
-def set_commands(want, have):
- commands = []
- for w in want:
- return_command = add_commands(w)
- for command in return_command:
- commands.append(command)
- return commands
-
-
-def add_commands(want):
- commandset = []
- if not want:
- return commandset
- vrf = want["vrf"] if "vrf" in want.keys() and want["vrf"] is not None else None
- for address_family in want["address_families"]:
- for route in address_family["routes"]:
- for next_hop in route["next_hops"]:
- commands = []
- if address_family["afi"] == "ipv4":
- commands.append('ip route')
- else:
- commands.append('ipv6 route')
- if vrf:
- commands.append(' vrf ' + vrf)
- if not re.search(r'/', route["dest"]):
- mask = route["dest"].split()[1]
- cidr = get_net_size(mask)
- commands.append(' ' + route["dest"].split()[0] + '/' + cidr)
- else:
- commands.append(' ' + route["dest"])
- if "interface" in next_hop.keys():
- commands.append(' ' + next_hop["interface"])
- if "nexthop_grp" in next_hop.keys():
- commands.append(' Nexthop-Group' + ' ' + next_hop["nexthop_grp"])
- if "forward_router_address" in next_hop.keys():
- commands.append(' ' + next_hop["forward_router_address"])
- if "mpls_label" in next_hop.keys():
- commands.append(' label ' + str(next_hop["mpls_label"]))
- if "track" in next_hop.keys():
- commands.append(' track ' + next_hop["track"])
- if "admin_distance" in next_hop.keys():
- commands.append(' ' + str(next_hop["admin_distance"]))
- if "description" in next_hop.keys():
- commands.append(' name ' + str(next_hop["description"]))
- if "tag" in next_hop.keys():
- commands.append(' tag ' + str(next_hop["tag"]))
-
- config_commands = "".join(commands)
- commandset.append(config_commands)
- return commandset
-
-
-def del_commands(want, have):
- commandset = []
- haveconfigs = []
- for h in have:
- return_command = add_commands(h)
- for command in return_command:
- command = "no " + command
- haveconfigs.append(command)
- if want is None or "address_families" not in want.keys():
- commandset = haveconfigs
- if "address_families" not in want.keys() and "vrf" in want.keys():
- commandset = []
- for command in haveconfigs:
- if want["vrf"] in command:
- commandset.append(command)
- elif want is not None and "vrf" not in want.keys() and "address_families" not in want.keys():
- commandset = []
- for command in haveconfigs:
- if "vrf" not in command:
- commandset.append(command)
-
- elif want["address_families"]:
- vrf = want["vrf"] if "vrf" in want.keys() and want["vrf"] else None
- for address_family in want["address_families"]:
- if "routes" not in address_family.keys():
- for command in haveconfigs:
- afi = "ip " if address_family["afi"] == "ipv4" else "ipv6"
- if afi in command:
- if vrf:
- if vrf in command:
- commandset.append(command)
- else:
- commandset.append(command)
- else:
- for route in address_family["routes"]:
- if not re.search(r'/', route["dest"]):
- mask = route["dest"].split()[1]
- cidr = get_net_size(mask)
- destination = route["dest"].split()[0] + '/' + cidr
- else:
- destination = route["dest"]
- if "next_hops" not in route.keys():
- for command in haveconfigs:
- if destination in command:
- if vrf:
- if vrf in command:
- commandset.append(command)
- else:
- commandset.append(command)
- else:
- for next_hop in route["next_hops"]:
- commands = []
- if address_family["afi"] == "ipv4":
- commands.append('no ip route')
- else:
- commands.append('no ipv6 route')
- if vrf:
- commands.append(' vrf ' + vrf)
- commands.append(' ' + destination)
- if "interface" in next_hop.keys():
- commands.append(' ' + next_hop["interface"])
- if "nexhop_grp" in next_hop.keys():
- commands.append(' Nexthop-Group' + ' ' + next_hop["nexthop_grp"])
- if "forward_router_address" in next_hop.keys():
- commands.append(' ' + next_hop["forward_router_address"])
- if "mpls_label" in next_hop.keys():
- commands.append(' label ' + str(next_hop["mpls_label"]))
- if "track" in next_hop.keys():
- commands.append(' track ' + next_hop["track"])
- if "admin_distance" in next_hop.keys():
- commands.append(' ' + str(next_hop["admin_distance"]))
- if "description" in next_hop.keys():
- commands.append(' name ' + str(next_hop["description"]))
- if "tag" in next_hop.keys():
- commands.append(' tag ' + str(next_hop["tag"]))
-
- config_commands = "".join(commands)
- commandset.append(config_commands)
- return commandset
-
-
-def get_net_size(netmask):
- binary_str = ''
- netmask = netmask.split('.')
- for octet in netmask:
- binary_str += bin(int(octet))[2:].zfill(8)
- return str(len(binary_str.rstrip('0')))
-
-
-def get_vrf(config):
- vrf = ""
- for c in config:
- vrf = c["vrf"] if "vrf" in c.keys() and c["vrf"] else None
- return vrf
-
-
-def get_dest(config):
- dest = []
- for c in config:
- for address_family in c["address_families"]:
- for route in address_family["routes"]:
- dest.append(route['dest'])
- return dest