Example #1
0
    def render_config(self, spec, conf):
        """
        Render config as dictionary structure and delete keys
          from spec for null values

        :param spec: The facts tree, generated from the argspec
        :param conf: The configuration
        :rtype: dictionary
        :returns: The generated config
        """
        config = deepcopy(spec)

        match = re.search(r'^(\S+)', conf)
        intf = match.group(1)
        if get_interface_type(intf) == 'unknown':
            return {}
        config['name'] = intf
        # 'bfd'/'bfd echo' do not nvgen when enabled thus set to 'enable' when None.
        # 'bfd' is not supported on some platforms
        config['bfd'] = utils.parse_conf_cmd_arg(conf, 'bfd', 'enable',
                                                 'disable') or 'enable'
        config['echo'] = utils.parse_conf_cmd_arg(conf, 'bfd echo', 'enable',
                                                  'disable') or 'enable'

        return utils.remove_empties(config)
Example #2
0
    def render_config(self, spec, conf):
        """
        Render config as dictionary structure and delete keys from spec for null values

        :param spec: The facts tree, generated from the argspec
        :param conf: The configuration
        :rtype: dictionary
        :returns: The generated config
        """
        config = deepcopy(spec)

        # populate the facts from the configuration
        config["name"] = re.match(r"(\S+)", conf).group(1)
        description = utils.parse_conf_arg(conf, "description")
        if description is not None:
            config["description"] = description.replace('"', "")
        shutdown = utils.parse_conf_cmd_arg(conf, "shutdown", False)
        config["enabled"] = shutdown if shutdown is False else True
        config["mtu"] = utils.parse_conf_arg(conf, "mtu")
        config["mode"] = utils.parse_conf_cmd_arg(
            conf, "switchport", "layer2", "layer3"
        )

        state = utils.parse_conf_arg(conf, "speed")
        if state:
            if state == "auto":
                config["duplex"] = state
            else:
                # remaining options are all e.g., 10half or 40gfull
                config["speed"] = state[:-4]
                config["duplex"] = state[-4:]
        return utils.remove_empties(config)
Example #3
0
    def render_config(self, spec, conf):
        """
        Render config as dictionary structure and delete keys
          from spec for null values
        :param spec: The facts tree, generated from the argspec
        :param conf: The configuration
        :rtype: dictionary
        :returns: The generated config
        """
        config = deepcopy(spec)

        match = re.search(r"^(\S+)", conf)
        intf = match.group(1)
        if get_interface_type(intf) == "unknown":
            return {}
        config["name"] = intf
        config["description"] = utils.parse_conf_arg(conf, "description")
        config["speed"] = utils.parse_conf_arg(conf, "speed")
        config["mtu"] = utils.parse_conf_arg(conf, "mtu")
        config["duplex"] = utils.parse_conf_arg(conf, "duplex")
        config["mode"] = utils.parse_conf_cmd_arg(conf, "switchport", "layer2",
                                                  "layer3")

        config["enabled"] = utils.parse_conf_cmd_arg(conf, "shutdown", False,
                                                     True)

        config["fabric_forwarding_anycast_gateway"] = utils.parse_conf_cmd_arg(
            conf, "fabric forwarding mode anycast-gateway", True)
        config["ip_forward"] = utils.parse_conf_cmd_arg(
            conf, "ip forward", True)

        interfaces_cfg = utils.remove_empties(config)
        return interfaces_cfg
Example #4
0
    def render_config(self, spec, conf):
        """
        Render config as dictionary structure and delete keys
          from spec for null values
        :param spec: The facts tree, generated from the argspec
        :param conf: The configuration
        :rtype: dictionary
        :returns: The generated config
        """
        config = deepcopy(spec)
        match = re.search(r"^(\S+)", conf)
        intf = match.group(1)
        if get_interface_type(intf) == "unknown":
            return {}
        config["name"] = intf
        config["dot1q"] = utils.parse_conf_arg(conf, "encapsulation dot1[qQ]")
        config["redirects"] = utils.parse_conf_cmd_arg(conf, "no ip redirects",
                                                       False, True)
        config["unreachables"] = utils.parse_conf_cmd_arg(
            conf, "ip unreachables", True, False)
        ipv4_match = re.compile(r"\n  ip address (.*)")
        matches = ipv4_match.findall(conf)
        if matches:
            if matches[0]:
                config["ipv4"] = []
                for m in matches:
                    ipv4_conf = m.split()
                    addr = ipv4_conf[0]
                    if addr:
                        config_dict = {"address": addr}
                        if len(ipv4_conf) > 1:
                            d = ipv4_conf[1]
                            if d == "secondary":
                                config_dict.update({"secondary": True})
                                if len(ipv4_conf) == 4:
                                    if ipv4_conf[2] == "tag":
                                        config_dict.update(
                                            {"tag": int(ipv4_conf[-1])})
                            elif d == "tag":
                                config_dict.update({"tag": int(ipv4_conf[-1])})
                        config["ipv4"].append(config_dict)

        ipv6_match = re.compile(r"\n  ipv6 address (.*)")
        matches = ipv6_match.findall(conf)
        if matches:
            if matches[0]:
                config["ipv6"] = []
                for m in matches:
                    ipv6_conf = m.split()
                    addr = ipv6_conf[0]
                    if addr:
                        config_dict = {"address": addr}
                        if len(ipv6_conf) > 1:
                            d = ipv6_conf[1]
                            if d == "tag":
                                config_dict.update({"tag": int(ipv6_conf[-1])})
                        config["ipv6"].append(config_dict)

        return utils.remove_empties(config)
Example #5
0
    def render_config(self, spec, conf):
        """
        Render config as dictionary structure and delete keys
          from spec for null values
        :param spec: The facts tree, generated from the argspec
        :param conf: The configuration
        :rtype: dictionary
        :returns: The generated config
        """
        config = deepcopy(spec)
        match = re.search(r'^(\S+)', conf)
        intf = match.group(1)
        if get_interface_type(intf) == 'unknown':
            return {}
        config['name'] = intf
        config['dot1q'] = utils.parse_conf_arg(conf, 'encapsulation dot1[qQ]')
        config['redirects'] = utils.parse_conf_cmd_arg(conf, 'no ip redirects',
                                                       False, True)
        config['unreachables'] = utils.parse_conf_cmd_arg(
            conf, 'ip unreachables', True, False)
        ipv4_match = re.compile(r'\n  ip address (.*)')
        matches = ipv4_match.findall(conf)
        if matches:
            if matches[0]:
                config['ipv4'] = []
                for m in matches:
                    ipv4_conf = m.split()
                    addr = ipv4_conf[0]
                    if addr:
                        config_dict = {'address': addr}
                        if len(ipv4_conf) > 1:
                            d = ipv4_conf[1]
                            if d == 'secondary':
                                config_dict.update({'secondary': True})
                                if len(ipv4_conf) == 4:
                                    if ipv4_conf[2] == 'tag':
                                        config_dict.update(
                                            {'tag': int(ipv4_conf[-1])})
                            elif d == 'tag':
                                config_dict.update({'tag': int(ipv4_conf[-1])})
                        config['ipv4'].append(config_dict)

        ipv6_match = re.compile(r'\n  ipv6 address (.*)')
        matches = ipv6_match.findall(conf)
        if matches:
            if matches[0]:
                config['ipv6'] = []
                for m in matches:
                    ipv6_conf = m.split()
                    addr = ipv6_conf[0]
                    if addr:
                        config_dict = {'address': addr}
                        if len(ipv6_conf) > 1:
                            d = ipv6_conf[1]
                            if d == 'tag':
                                config_dict.update({'tag': int(ipv6_conf[-1])})
                        config['ipv6'].append(config_dict)

        return utils.remove_empties(config)
    def render_config(self, spec, conf):
        """
        Render config as dictionary structure and delete keys from spec for null values
        :param spec: The facts tree, generated from the argspec
        :param conf: The configuration
        :rtype: dictionary
        :returns: The generated config
        """

        config = deepcopy(spec)
        match = re.search(r"^(\S+)", conf)

        intf = match.group(1)
        if match.group(1).lower() == "preconfigure":
            match = re.search(r"^(\S+) (.*)", conf)
            if match:
                intf = match.group(2)

        if get_interface_type(intf) == "unknown":
            return {}
        # populate the facts from the configuration
        config["name"] = intf
        config["description"] = utils.parse_conf_arg(conf, "description")
        if utils.parse_conf_arg(conf, "speed"):
            config["speed"] = int(utils.parse_conf_arg(conf, "speed"))
        if utils.parse_conf_arg(conf, "mtu"):
            config["mtu"] = int(utils.parse_conf_arg(conf, "mtu"))
        config["duplex"] = utils.parse_conf_arg(conf, "duplex")
        enabled = utils.parse_conf_cmd_arg(conf, "shutdown", False)
        config["enabled"] = enabled if enabled is not None else True

        return utils.remove_empties(config)
Example #7
0
    def render_config(self, spec, conf):
        """
        Render config as dictionary structure and delete keys from spec for null values
        :param spec: The facts tree, generated from the argspec
        :param conf: The configuration
        :rtype: dictionary
        :returns: The generated config
        """

        config = deepcopy(spec)
        match = re.search(r'^(\S+)', conf)

        intf = match.group(1)
        if match.group(1).lower() == "preconfigure":
            match = re.search(r'^(\S+) (.*)', conf)
            if match:
                intf = match.group(2)

        if get_interface_type(intf) == 'unknown':
            return {}
        # populate the facts from the configuration
        config['name'] = intf
        config['description'] = utils.parse_conf_arg(conf, 'description')
        if utils.parse_conf_arg(conf, 'speed'):
            config['speed'] = int(utils.parse_conf_arg(conf, 'speed'))
        if utils.parse_conf_arg(conf, 'mtu'):
            config['mtu'] = int(utils.parse_conf_arg(conf, 'mtu'))
        config['duplex'] = utils.parse_conf_arg(conf, 'duplex')
        enabled = utils.parse_conf_cmd_arg(conf, 'shutdown', False)
        config['enabled'] = enabled if enabled is not None else True

        return utils.remove_empties(config)
    def render_config(self, spec, conf):
        """
        Render config as dictionary structure and delete keys from spec for null values
        :param spec: The facts tree, generated from the argspec
        :param conf: The configuration
        :rtype: dictionary
        :returns: The generated config
        """
        config = deepcopy(spec)
        match = re.search(r"^(\S+)", conf)

        intf = match.group(1)

        if match.group(1).lower() == "preconfigure":
            match = re.search(r"^(\S+) (.*)", conf)
            if match:
                intf = match.group(2)

        if get_interface_type(intf) == "unknown":
            return {}

        if intf.lower().startswith("gi"):
            config["name"] = intf

            # populate the facts from the configuration
            native_vlan = re.search(r"dot1q native vlan (\d+)", conf)
            if native_vlan:
                config["native_vlan"] = int(native_vlan.group(1))

            dot1q = utils.parse_conf_arg(conf, "encapsulation dot1q")
            config["q_vlan"] = []
            if dot1q:
                config["q_vlan"].append(int(dot1q.split(" ")[0]))
                if len(dot1q.split(" ")) > 1:
                    config["q_vlan"].append(int(dot1q.split(" ")[2]))

            if utils.parse_conf_cmd_arg(conf, "l2transport", True):
                config["l2transport"] = True
            if utils.parse_conf_arg(conf, "propagate"):
                config["propagate"] = True
            config["l2protocol"] = []

            cdp = utils.parse_conf_arg(conf, "l2protocol cdp")
            pvst = utils.parse_conf_arg(conf, "l2protocol pvst")
            stp = utils.parse_conf_arg(conf, "l2protocol stp")
            vtp = utils.parse_conf_arg(conf, "l2protocol vtp")
            if cdp:
                config["l2protocol"].append({"cdp": cdp})
            if pvst:
                config["l2protocol"].append({"pvst": pvst})
            if stp:
                config["l2protocol"].append({"stp": stp})
            if vtp:
                config["l2protocol"].append({"vtp": vtp})

            return utils.remove_empties(config)
Example #9
0
    def render_config(self, spec, conf):
        """
        Render config as dictionary structure and delete keys from spec for null values
        :param spec: The facts tree, generated from the argspec
        :param conf: The configuration
        :rtype: dictionary
        :returns: The generated config
        """
        config = deepcopy(spec)
        match = re.search(r'^(\S+)', conf)

        intf = match.group(1)

        if match.group(1).lower() == "preconfigure":
            match = re.search(r'^(\S+) (.*)', conf)
            if match:
                intf = match.group(2)

        if get_interface_type(intf) == 'unknown':
            return {}

        if intf.lower().startswith('gi'):
            config['name'] = intf

            # populate the facts from the configuration
            native_vlan = re.search(r"dot1q native vlan (\d+)", conf)
            if native_vlan:
                config["native_vlan"] = int(native_vlan.group(1))

            dot1q = utils.parse_conf_arg(conf, 'encapsulation dot1q')
            config['q_vlan'] = []
            if dot1q:
                config['q_vlan'].append(int(dot1q.split(' ')[0]))
                if len(dot1q.split(' ')) > 1:
                    config['q_vlan'].append(int(dot1q.split(' ')[2]))

            if utils.parse_conf_cmd_arg(conf, 'l2transport', True):
                config['l2transport'] = True
            if utils.parse_conf_arg(conf, 'propagate'):
                config['propagate'] = True
            config['l2protocol'] = []

            cdp = utils.parse_conf_arg(conf, 'l2protocol cdp')
            pvst = utils.parse_conf_arg(conf, 'l2protocol pvst')
            stp = utils.parse_conf_arg(conf, 'l2protocol stp')
            vtp = utils.parse_conf_arg(conf, 'l2protocol vtp')
            if cdp:
                config['l2protocol'].append({'cdp': cdp})
            if pvst:
                config['l2protocol'].append({'pvst': pvst})
            if stp:
                config['l2protocol'].append({'stp': stp})
            if vtp:
                config['l2protocol'].append({'vtp': vtp})

            return utils.remove_empties(config)
Example #10
0
 def render_config(self, spec, conf, intf):
     config = deepcopy(spec)
     config["name"] = normalize_interface(intf)
     config["description"] = utils.parse_conf_arg(conf, "description")
     if utils.parse_conf_arg(conf, "speed"):
         config["speed"] = int(utils.parse_conf_arg(conf, "speed"))
     if utils.parse_conf_arg(conf, "mtu"):
         config["mtu"] = int(utils.parse_conf_arg(conf, "mtu"))
     config["duplex"] = utils.parse_conf_arg(conf, "duplex")
     enabled = utils.parse_conf_cmd_arg(conf, "shutdown", False)
     config["enabled"] = enabled if enabled is not None else True
     return utils.remove_empties(config)
Example #11
0
    def render_config(self, spec, conf):
        """
        Render config as dictionary structure and delete keys
          from spec for null values
        :param spec: The facts tree, generated from the argspec
        :param conf: The configuration
        :rtype: dictionary
        :returns: The generated config
        """
        config = deepcopy(spec)

        match = re.search(r'^(\S+)', conf)
        intf = match.group(1)
        if get_interface_type(intf) == 'unknown':
            return {}
        config['name'] = intf
        config['description'] = utils.parse_conf_arg(conf, 'description')
        config['speed'] = utils.parse_conf_arg(conf, 'speed')
        config['mtu'] = utils.parse_conf_arg(conf, 'mtu')
        config['duplex'] = utils.parse_conf_arg(conf, 'duplex')
        config['mode'] = utils.parse_conf_cmd_arg(conf, 'switchport', 'layer2',
                                                  'layer3')

        config['enabled'] = utils.parse_conf_cmd_arg(conf, 'shutdown', False,
                                                     True)

        # Capture the default 'enabled' state, which may be interface-specific
        config['enabled_def'] = default_intf_enabled(name=intf,
                                                     sysdefs=self.sysdefs,
                                                     mode=config['mode'])

        config['fabric_forwarding_anycast_gateway'] = utils.parse_conf_cmd_arg(
            conf, 'fabric forwarding mode anycast-gateway', True)
        config['ip_forward'] = utils.parse_conf_cmd_arg(
            conf, 'ip forward', True)

        interfaces_cfg = utils.remove_empties(config)
        return interfaces_cfg
Example #12
0
    def parse_config(self, spec, conf, intf):
        """ Render config as dictionary structure and delete keys
          from spec for null values

        :param spec: The facts tree, generated from the argspec
        :param conf: The configuration
        :rtype: dictionary
        :returns: The generated config
        """
        config = deepcopy(spec)
        config["name"] = intf
        config["description"] = utils.parse_conf_arg(conf, "description")
        if utils.parse_conf_arg(conf, "speed"):
            config["speed"] = int(utils.parse_conf_arg(conf, "speed"))
        if utils.parse_conf_arg(conf, "mtu"):
            config["mtu"] = int(utils.parse_conf_arg(conf, "mtu"))
        config["duplex"] = utils.parse_conf_arg(conf, "duplex")
        enabled = utils.parse_conf_cmd_arg(conf, "shutdown", False)
        config["enabled"] = enabled if enabled is not None else True
        return utils.remove_empties(config)
Example #13
0
    def render_config(self, spec, conf):
        """
        Render config as dictionary structure and delete keys
          from spec for null values

        :param spec: The facts tree, generated from the argspec
        :param conf: The configuration
        :rtype: dictionary
        :returns: The generated config
        """
        config = deepcopy(spec)

        match = re.search(r"^(\S+)", conf)
        intf = match.group(1)
        if get_interface_type(intf) == "unknown":
            return {}
        config["name"] = intf
        config["bfd"] = utils.parse_conf_cmd_arg(conf, "hsrp bfd", "enable", "disable")

        return utils.remove_empties(config)
Example #14
0
    def render_config(self, spec, conf):
        """
        Render config as dictionary structure and delete keys from spec for null values

        :param spec: The facts tree, generated from the argspec
        :param conf: The configuration
        :rtype: dictionary
        :returns: The generated config
        """
        config = deepcopy(spec)

        # populate the facts from the configuration
        config['name'] = re.match(r'(\S+)', conf).group(1)
        description = utils.parse_conf_arg(conf, 'description')
        if description is not None:
            config['description'] = description.replace('"', '')
        shutdown = utils.parse_conf_cmd_arg(conf, 'shutdown', False)
        config['enabled'] = shutdown if shutdown is False else True
        config['mtu'] = utils.parse_conf_arg(conf, 'mtu')

        speed_pair = utils.parse_conf_arg(conf, 'speed')
        if speed_pair:
            state = speed_pair.split()
            if state[0] == 'forced':
                state = state[1]
            else:
                state = state[0]

            if state == 'auto':
                config['duplex'] = state
            else:
                # remaining options are all e.g., 10half or 40gfull
                config['speed'] = state[:-4]
                config['duplex'] = state[-4:]

        return utils.remove_empties(config)