示例#1
0
    def test_unified_diff(options_ios):
        host = Host(hostname="test_host", os="ios", hconfig_options=options_ios)
        config_a = HConfig(host=host)
        config_b = HConfig(host=host)
        # deep differences
        config_a.add_children_deep(["a", "aa", "aaa", "aaaa"])
        config_b.add_children_deep(["a", "aa", "aab", "aaba"])
        # these children will be the same and should not appear in the diff
        config_a.add_children_deep(["b", "ba", "baa"])
        config_b.add_children_deep(["b", "ba", "baa"])
        # root level differences
        config_a.add_children_deep(["c", "ca"])
        config_b.add_child("d")

        diff = list(config_a.unified_diff(config_b))
        assert diff == [
            "a",
            "  aa",
            "    - aaa",
            "      - aaaa",
            "    + aab",
            "      + aaba",
            "- c",
            "  - ca",
            "+ d",
        ]
示例#2
0
 def test_get_children(self):
     hier = HConfig(host=self.host_a)
     hier.add_child("interface Vlan2")
     hier.add_child("interface Vlan3")
     children = list(hier.get_children("startswith", "interface"))
     assert len(children) == 2
     for child in children:
         assert child.text.startswith("interface Vlan")
示例#3
0
 def test_config_to_get_to(self):
     running_config_hier = HConfig(self.host_a, self.os, self.options)
     running_config_hier.add_child('interface Vlan2')
     compiled_config_hier = HConfig(self.host_a, self.os, self.options)
     compiled_config_hier.add_child('interface Vlan3')
     remediation_config_hier = running_config_hier.config_to_get_to(
         compiled_config_hier)
     self.assertEqual(2, len(list(remediation_config_hier.all_children())))
示例#4
0
    def test_del_child(self):
        hier1 = HConfig(host=self.host_a)
        hier1.add_child("interface Vlan2")

        assert len(list(hier1.all_children())) == 1

        hier1.del_child(hier1.get_child("startswith", "interface"))

        assert len(list(hier1.all_children())) == 0
示例#5
0
    def test_del_child(self):
        hier1 = HConfig(host=self.host_a)
        hier1.add_child('interface Vlan2')

        self.assertEqual(1, len(list(hier1.all_children())))

        hier1.del_child(hier1.get_child('startswith', 'interface'))

        self.assertEqual(0, len(list(hier1.all_children())))
示例#6
0
 def test_config_to_get_to(self):
     running_config_hier = HConfig(host=self.host_a)
     interface = running_config_hier.add_child('interface Vlan2')
     interface.add_child('ip address 192.168.1.1/24')
     compiled_config_hier = HConfig(host=self.host_a)
     compiled_config_hier.add_child('interface Vlan3')
     remediation_config_hier = running_config_hier.config_to_get_to(
         compiled_config_hier)
     self.assertEqual(2, len(list(remediation_config_hier.all_children())))
示例#7
0
 def test_config_to_get_to(self):
     running_config_hier = HConfig(host=self.host_a)
     interface = running_config_hier.add_child("interface Vlan2")
     interface.add_child("ip address 192.168.1.1/24")
     generated_config_hier = HConfig(host=self.host_a)
     generated_config_hier.add_child("interface Vlan3")
     remediation_config_hier = running_config_hier.config_to_get_to(
         generated_config_hier
     )
     assert len(list(remediation_config_hier.all_children())) == 2
示例#8
0
    def test_merge(self):
        hier1 = HConfig(host=self.host_a)
        hier1.add_child('interface Vlan2')
        hier2 = HConfig(host=self.host_b)
        hier2.add_child('interface Vlan3')

        self.assertEqual(1, len(list(hier1.all_children())))
        self.assertEqual(1, len(list(hier2.all_children())))

        hier1.merge(hier2)

        self.assertEqual(2, len(list(hier1.all_children())))
示例#9
0
    def test_merge(self):
        hier1 = HConfig(host=self.host_a)
        hier1.add_child("interface Vlan2")
        hier2 = HConfig(host=self.host_b)
        hier2.add_child("interface Vlan3")

        assert len(list(hier1.all_children())) == 1
        assert len(list(hier2.all_children())) == 1

        hier1.merge(hier2)

        assert len(list(hier1.all_children())) == 2
示例#10
0
 def test_add_sectional_exiting(self):
     hier = HConfig(host=self.host_a)
     bgp = hier.add_child("router bgp 64500")
     template = bgp.add_child("template peer-policy")
     hier.add_sectional_exiting()
     sectional_exit = template.get_child("equals", "exit-peer-policy")
     assert sectional_exit is not None
示例#11
0
 def test_add_sectional_exiting(self):
     hier = HConfig(host=self.host_a)
     bgp = hier.add_child('router bgp 64500')
     template = bgp.add_child('template peer-policy')
     hier.add_sectional_exiting()
     sectional_exit = template.get_child('equals', 'exit-peer-policy')
     self.assertIsNotNone(sectional_exit)
示例#12
0
 def test_cisco_style_text(self):
     hier = HConfig(host=self.host_a)
     interface = hier.add_child("interface Vlan2")
     ip_address = interface.add_child("ip address 192.168.1.1 255.255.255.0")
     assert ip_address.cisco_style_text() == "  ip address 192.168.1.1 255.255.255.0"
     assert isinstance(ip_address.cisco_style_text(), str)
     assert not isinstance(ip_address.cisco_style_text(), list)
示例#13
0
    def difference(self, target, delta=None):
        """
        Creates a new HConfig object with the config from self that is not in target

        Example usage:
        whats in the config.lines v.s. in running config
        i.e. did all my configuration changes get written to the running config

        :param target: HConfig - The configuration to check against
        :param delta: HConfig - The elements from self that are not in target
        :return: HConfig - missing config additions
        """
        if delta is None:
            from hier_config import HConfig
            delta = HConfig(host=self.host)

        for self_child in self.children:
            # Not dealing with negations and defaults for now
            if self_child.text.startswith(('no ', 'default ')):
                continue

            target_child = target.get_child('equals', self_child.text)

            if target_child:
                delta_child = delta.add_child(self_child.text)
                self_child.difference(target_child, delta_child)
                if not delta_child.children:
                    delta_child.delete()
            else:
                delta.add_deep_copy_of(self_child)

        return delta
示例#14
0
 def test_append_tags(self):
     config = HConfig(host=self.host_a)
     interface = config.add_child("interface Vlan2")
     ip_address = interface.add_child("ip address 192.168.1.1/24")
     ip_address.append_tags("test_tag")
     assert "test_tag" in config.tags
     assert "test_tag" in interface.tags
     assert "test_tag" in ip_address.tags
示例#15
0
    def test_all_children_sorted_by_lineage_rules(self, tags_ios):
        hier = HConfig(host=self.host_a)
        svi = hier.add_child("interface Vlan2")
        svi.add_child("description switch-mgmt-10.0.2.0/24")

        mgmt = hier.add_child("interface FastEthernet0")
        mgmt.add_child("description mgmt-192.168.0.0/24")

        assert len(list(hier.all_children())) == 4
        assert isinstance(hier.all_children(), types.GeneratorType)

        assert len(list(hier.all_children_sorted_with_lineage_rules(tags_ios))) == 2

        assert isinstance(
            hier.all_children_sorted_with_lineage_rules(tags_ios),
            types.GeneratorType,
        )
示例#16
0
    def test_add_children(self):
        interface_items1 = [
            "description switch-mgmt 192.168.1.0/24",
            "ip address 192.168.1.1/24",
        ]
        hier1 = HConfig(host=self.host_a)
        interface1 = hier1.add_child("interface Vlan2")
        interface1.add_children(interface_items1)

        assert len(list(hier1.all_children())) == 3

        interface_items2 = ["description switch-mgmt 192.168.1.0/24"]
        hier2 = HConfig(host=self.host_a)
        interface2 = hier2.add_child("interface Vlan2")
        interface2.add_children(interface_items2)

        assert len(list(hier2.all_children())) == 2
示例#17
0
    def test_add_children(self):
        interface_items1 = [
            'description switch-mgmt 192.168.1.0/24',
            'ip address 192.168.1.1/24'
        ]
        hier1 = HConfig(host=self.host_a)
        interface1 = hier1.add_child('interface Vlan2')
        interface1.add_children(interface_items1)

        self.assertEqual(3, len(list(hier1.all_children())))

        interface_items2 = "description switch-mgmt 192.168.1.0/24"
        hier2 = HConfig(host=self.host_a)
        interface2 = hier2.add_child('interface Vlan2')
        interface2.add_children(interface_items2)

        self.assertEqual(2, len(list(hier2.all_children())))
示例#18
0
 def test_append_tags(self):
     config = HConfig(host=self.host_a)
     interface = config.add_child('interface Vlan2')
     ip_address = interface.add_child('ip address 192.168.1.1/24')
     ip_address.append_tags('test_tag')
     self.assertIn('test_tag', config.tags)
     self.assertIn('test_tag', interface.tags)
     self.assertIn('test_tag', ip_address.tags)
示例#19
0
 def test_get_child_deep(self):
     hier = HConfig(host=self.host_a)
     interface = hier.add_child('interface Vlan2')
     interface.add_child('ip address 192.168.1.1 255.255.255.0')
     child = hier.get_child_deep([('equals', 'interface Vlan2'),
                                  ('equals',
                                   'ip address 192.168.1.1 255.255.255.0')])
     self.assertIsNotNone(child)
示例#20
0
    def test_all_children_sorted_by_lineage_rules(self):
        hier = HConfig(host=self.host_a)
        svi = hier.add_child('interface Vlan2')
        svi.add_child('description switch-mgmt-10.0.2.0/24')

        mgmt = hier.add_child('interface FastEthernet0')
        mgmt.add_child('description mgmt-192.168.0.0/24')

        self.assertEqual(4, len(list(hier.all_children())))
        self.assertTrue(isinstance(hier.all_children(), types.GeneratorType))

        self.assertEqual(
            2,
            len(list(hier.all_children_sorted_with_lineage_rules(self.tags))))
        self.assertTrue(
            isinstance(hier.all_children_sorted_with_lineage_rules(self.tags),
                       types.GeneratorType))
示例#21
0
    def test_add_tags(self):
        hier = HConfig(host=self.host_a)
        tag_rules = [{"lineage": [{"equals": "interface Vlan2"}], "add_tags": "test"}]
        child = hier.add_child("interface Vlan2")

        hier.add_tags(tag_rules)

        assert {"test"} == child.tags
示例#22
0
    def test_add_shallow_copy_of(self):
        base_config = HConfig(host=self.host_a)

        config_a = HConfig(host=self.host_a)
        interface_a = config_a.add_child("interface Vlan2")
        interface_a.append_tags({"ta", "tb"})
        interface_a.comments.add("ca")
        interface_a.order_weight = 200

        config_b = HConfig(host=self.host_b)
        interface_b = config_b.add_child("interface Vlan2")
        interface_b.append_tags({"tc"})
        interface_b.comments.add("cc")
        interface_b.order_weight = 201

        copied_interface = base_config.add_shallow_copy_of(interface_a, merged=True)
        assert copied_interface.tags == {"ta", "tb"}
        assert copied_interface.comments == {"ca"}
        assert copied_interface.order_weight == 200
        assert copied_interface.instances == [
            {
                "hostname": interface_a.host.hostname,
                "comments": interface_a.comments,
                "tags": interface_a.tags,
            }
        ]

        copied_interface = base_config.add_shallow_copy_of(interface_b, merged=True)

        assert copied_interface.tags == {"ta", "tb", "tc"}
        assert copied_interface.comments == {"ca", "cc"}
        assert copied_interface.order_weight == 201
        assert copied_interface.instances == [
            {
                "hostname": interface_a.host.hostname,
                "comments": interface_a.comments,
                "tags": interface_a.tags,
            },
            {
                "hostname": interface_b.host.hostname,
                "comments": interface_b.comments,
                "tags": interface_b.tags,
            },
        ]
示例#23
0
    def test_all_children_sorted_untagged(self):
        config = HConfig(host=self.host_a)
        interface = config.add_child("interface Vlan2")
        ip_address_a = interface.add_child("ip address 192.168.1.1/24")
        ip_address_a.append_tags("a")
        ip_address_none = interface.add_child("ip address 192.168.2.1/24")

        assert ip_address_none is list(config.all_children_sorted_untagged())[1]
        assert len(list(config.all_children_sorted_untagged())) == 2
        assert ip_address_none is list(config.all_children_sorted_untagged())[1]
示例#24
0
    def test_line_inclusion_test(self):
        config = HConfig(host=self.host_a)
        interface = config.add_child('interface Vlan2')
        ip_address_ab = interface.add_child('ip address 192.168.2.1/24')
        ip_address_ab.append_tags(['a', 'b'])

        self.assertFalse(ip_address_ab.line_inclusion_test('a', 'b'))
        self.assertFalse(ip_address_ab.line_inclusion_test('', 'a'))
        self.assertTrue(ip_address_ab.line_inclusion_test('a', ''))
        self.assertFalse(ip_address_ab.line_inclusion_test('', ''))
示例#25
0
    def test_add_ancestor_copy_of(self):
        hier1 = HConfig(host=self.host_a)
        interface = hier1.add_child("interface Vlan2")
        interface.add_children(
            ["description switch-mgmt-192.168.1.0/24", "ip address 192.168.1.0/24"]
        )
        hier1.add_ancestor_copy_of(interface)

        assert len(list(hier1.all_children())) == 3
        assert isinstance(hier1.all_children(), types.GeneratorType)
示例#26
0
    def test_line_inclusion_test(self):
        config = HConfig(host=self.host_a)
        interface = config.add_child("interface Vlan2")
        ip_address_ab = interface.add_child("ip address 192.168.2.1/24")
        ip_address_ab.append_tags(["a", "b"])

        assert not ip_address_ab.line_inclusion_test({"a"}, {"b"})
        assert not ip_address_ab.line_inclusion_test(set(), {"a"})
        assert ip_address_ab.line_inclusion_test({"a"}, set())
        assert not ip_address_ab.line_inclusion_test(set(), set())
示例#27
0
 def test_cisco_style_text(self):
     hier = HConfig(host=self.host_a)
     interface = hier.add_child('interface Vlan2')
     ip_address = interface.add_child(
         'ip address 192.168.1.1 255.255.255.0')
     self.assertEqual('  ip address 192.168.1.1 255.255.255.0',
                      ip_address.cisco_style_text())
     self.assertNotEqual(' ip address 192.168.1.1 255.255.255.0',
                         ip_address.cisco_style_text())
     self.assertTrue(isinstance(ip_address.cisco_style_text(), str))
     self.assertFalse(isinstance(ip_address.cisco_style_text(), list))
示例#28
0
    def test_add_ancestor_copy_of(self):
        hier1 = HConfig(host=self.host_a)
        interface = hier1.add_child('interface Vlan2')
        interface.add_children([
            'description switch-mgmt-192.168.1.0/24',
            'ip address 192.168.1.0/24'
        ])
        hier1.add_ancestor_copy_of(interface)

        self.assertEqual(3, len(list(hier1.all_children())))
        self.assertTrue(isinstance(hier1.all_children(), types.GeneratorType))
示例#29
0
    def test_rebuild_children_dict(self):
        hier1 = HConfig(host=self.host_a)
        interface = hier1.add_child("interface Vlan2")
        interface.add_children(
            ["description switch-mgmt-192.168.1.0/24", "ip address 192.168.1.0/24"]
        )
        delta_a = hier1
        hier1.rebuild_children_dict()
        delta_b = hier1

        assert list(delta_a.all_children()) == list(delta_b.all_children())
示例#30
0
 def test_get_child_deep(self):
     hier = HConfig(host=self.host_a)
     interface = hier.add_child("interface Vlan2")
     interface.add_child("ip address 192.168.1.1 255.255.255.0")
     child = hier.get_child_deep(
         [
             ("equals", "interface Vlan2"),
             ("equals", "ip address 192.168.1.1 255.255.255.0"),
         ]
     )
     assert child is not None