def test_basic_uncfg(self): Genie.testbed = testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='nxos') dev2 = Device(testbed=testbed, name='PE2', os='nxos') rpl1 = RoutePolicy(policy_definition='rpl1', route_disposition='permit') dev1.add_feature(rpl1) rpl1.device_attr[dev1].statement_attr['10'] rpl1.device_attr[dev1].statement_attr['10'].match_med_eq = 5 # Unconfig testing # Set a mock dev1.configure = Mock() dev1.add_feature(rpl1) # Mock config uncfg1 = rpl1.build_unconfig(apply=False) self.assertCountEqual(uncfg1.keys(), ['PE1']) self.assertMultiLineEqual(str(uncfg1['PE1']), '\n'.join(['no route-map rpl1 permit 10'])) partial_uncfg1 = rpl1.build_unconfig( apply=False, attributes={'device_attr':{'*':{'statement_attr':\ {'*':"match_med_eq"}}}}) self.assertCountEqual(partial_uncfg1.keys(), ['PE1']) self.assertMultiLineEqual( str(partial_uncfg1['PE1']), '\n'.join( ['route-map rpl1 permit 10', ' no match metric 5', ' exit']))
def create_test_device(name, os, platform=None): """This function does boilerplate work of creating a device for unittests. - Sets the device os and platform - Sets the device abstraction order - Modifies device attributes to simulate being connected - Mocks the configure method Arguments: name (str): The name of the new device. os (str): The os of the new device. platform (str, optional): The platform of the new device. returns: device (obj): That is ready to be used to unittests. """ if platform: device = Device(name, os=os, platform=platform) else: device = Device(name, os=os) device.custom.abstraction = {'order': ['os', 'platform']} # This enables calling parsers without explicitly passing output. device.is_connected = Mock(return_value=True) setattr(device, 'cli', device) device.configure = Mock() return device
def test_basic_uncfg_with_name(self): ''' Testing in case of having 'name' as the route-policy name. ''' Genie.testbed = testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='iosxr') rpl1 = RoutePolicy(name='rpl1') dev1.add_feature(rpl1) rpl1.device_attr[dev1].statement_attr['10'] rpl1.device_attr[dev1].statement_attr['10'].match_med_eq = 5 rpl1.device_attr[dev1].statement_attr['10'].match_nexthop_in = 'hop' rpl1.device_attr[dev1].statement_attr['10'].actions = 'pass' # Unconfig testing # Set a mock dev1.configure = Mock() dev1.add_feature(rpl1) # Mock config uncfg1 = rpl1.build_unconfig(apply=False) self.assertCountEqual(uncfg1.keys(), ['PE1']) self.assertMultiLineEqual(str(uncfg1['PE1']), '\n'.join( ['no route-policy rpl1' ]))
def test_disable_no_instance(self): tb = Genie.testbed = Testbed() dev = Device(testbed=tb, name='PE1', os='nxos') rip = Rip(instance_id=1) rip.add_force_vrf(None) dev.add_feature(rip) # Default configuration, let's make sure it works output = rip.build_unconfig(unconfig_feature=True, apply=False) self.assertMultiLineDictEqual(output, {'PE1': 'no feature rip'}) # Set a mock dev.cli = Mock() dev.configure = Mock() output = rip.build_unconfig(unconfig_feature=True, apply=True) expected_output = None self.assertEqual(output, expected_output)
def test_uncfg(self): tb = Genie.testbed = Testbed() dev = Device(testbed=tb, name='PE1', os='nxos') rip = Rip(instance_id=1) rip.add_force_vrf(None) # Default configuration, let's make sure it works output = rip.build_unconfig(apply=False) # There was nothing to unconfigure self.assertMultiLineDictEqual(output, {}) dev.add_feature(rip) output = rip.build_unconfig(apply=False) self.assertMultiLineDictEqual(output, {'PE1': 'feature rip\nno router rip 1'}) # Set a mock dev.cli = Mock() dev.configure = Mock() output = rip.build_unconfig(apply=True) expected_output = None self.assertEqual(output, expected_output)
def test_basic_uncfg(self): testbed = Genie.testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='iosxe') dev2 = Device(testbed=testbed, name='PE2', os='iosxe') intf1 = Interface(name='GigabitEthernet0/0/1',device=dev1) intf1.switchport = True intf2 = Interface(name='GigabitEthernet0/0/2',device=dev2) intf3 = Interface(name='Vlan100',device=dev1) vlan = Vlan() vlan.device_attr[dev1].vlan_id = 100 vlan.device_attr[dev2].vlan_id = 300 access_map_id = 'ed' vlan_configuration_id = '3' vlan.device_attr[dev1] vlan.device_attr[dev2] vlan.device_attr[dev1].interface_attr[intf1].switchport_mode = \ 'trunk' vlan.device_attr[dev1].interface_attr[intf1].sw_trunk_allowed_vlan = \ '200-201' vlan.device_attr[dev1].access_map_attr[access_map_id] vlan.device_attr[dev2].access_map_attr[access_map_id] vlan.device_attr[dev1].vlan_configuration_attr[vlan_configuration_id] vlan.device_attr[dev2].vlan_configuration_attr[vlan_configuration_id] # Defining attributes section with self.assertRaises(ValueError): vlan.media = 'invalid' vlan.media = 'enet' self.assertIs(type(vlan.media), Vlan.Media) vlan.accounting_type = 'input' vlan.device_attr[dev1].access_map_action = 'drop' # Unconfig testing # Set a mock dev1.configure = Mock() dev2.configure = Mock() dev1.add_feature(vlan) dev2.add_feature(vlan) # Mock config uncfg1 = vlan.build_unconfig(apply=False) self.assertCountEqual(uncfg1.keys(), ['PE1', 'PE2']) self.assertMultiLineEqual( str(uncfg1['PE1']), '\n'.join([ 'no vlan 100', 'no vlan accounting input', 'no vlan access-map ed', 'no vlan configuration 3', 'interface GigabitEthernet0/0/1', ' no switchport mode trunk', ' no switchport trunk allowed vlan 200-201', ' exit', ])) self.assertMultiLineEqual( str(uncfg1['PE2']), '\n'.join([ 'no vlan 300', 'no vlan accounting input', 'no vlan access-map ed', 'no vlan configuration 3', ])) uncfg_intf = intf1.build_unconfig(apply=False, attributes="switchport") self.assertMultiLineEqual( str(uncfg_intf), '\n'.join([ 'interface GigabitEthernet0/0/1', ' no switchport', ' exit', ])) partial_uncfg1 = vlan.build_unconfig(apply=False, attributes={'device_attr':\ {'*':"media"}}) self.assertCountEqual(partial_uncfg1.keys(), ['PE1', 'PE2']) self.assertMultiLineEqual( str(partial_uncfg1['PE1']), '\n'.join([ 'vlan 100', ' no media enet', ' exit', ])) partial_unconfigure = vlan.build_unconfig(apply=False, attributes={'device_attr':\ {'*':{'access_map_attr':\ {'*':"access_map_action"}}}}) self.assertCountEqual(partial_unconfigure.keys(), ['PE1', 'PE2']) self.assertMultiLineEqual( str(partial_unconfigure['PE1']), '\n'.join([ 'vlan access-map ed', ' no action drop', ' exit', ])) all_vlan_interface_uncfg = vlan.build_unconfig(apply=False, attributes={'device_attr':\ {'*':{'interface_attr':'*'}}}) self.assertCountEqual(all_vlan_interface_uncfg.keys(), ['PE1', 'PE2']) self.assertMultiLineEqual( str(all_vlan_interface_uncfg['PE1']), '\n'.join([ 'interface GigabitEthernet0/0/1', ' no switchport mode trunk', ' no switchport trunk allowed vlan 200-201', ' exit', ])) partial_vlan_interface_uncfg = vlan.build_unconfig(apply=False, attributes={'device_attr':\ {'*':{'interface_attr':\ {'*':"sw_trunk_allowed_vlan"}}}}) self.assertCountEqual(partial_vlan_interface_uncfg.keys(), ['PE1', 'PE2']) self.assertMultiLineEqual( str(partial_vlan_interface_uncfg['PE1']), '\n'.join([ 'interface GigabitEthernet0/0/1', ' no switchport trunk allowed vlan 200-201', ' exit', ]))
def test_basic_uncfg(self): testbed = Genie.testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='nxos', context='yang') dev2 = Device(testbed=testbed, name='PE2', os='nxos', context='yang') intf1 = Interface(name='Ethernet0/0/1', device=dev1) intf2 = Interface(name='Ethernet0/0/2', device=dev2) vlan = Vlan() for dev in testbed.devices: dev.connections = Mock() dev.connections = {'netconf': NetconfConnectionInfo()} vlan.device_attr[dev1].vlan_id = 100 vlan.device_attr[dev2].vlan_id = 300 # Unconfig testing # Set a mock dev1.configure = Mock() dev2.configure = Mock() dev1.add_feature(vlan) dev2.add_feature(vlan) # Mock config uncfg1 = vlan.build_unconfig(apply=False) self.assertCountEqual(uncfg1.keys(), ['PE1', 'PE2']) compare = "" for i in uncfg1['PE1']: compare += str(i) self.assertMultiLineEqual( compare, '\n'.join([ '<edit-config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">\n' ' <target>\n' ' <running></running>\n' ' </target>\n' ' <config>\n' ' <vlan xmlns="http://cisco.com/ns/yang/ned/ios">\n' ' <vlan-list>\n' ' <id>100</id>\n' ' </vlan-list>\n' ' </vlan>\n' ' </config>\n' '</edit-config>\n' ])) compare = "" for i in uncfg1['PE2']: compare += str(i) self.assertMultiLineEqual( compare, '\n'.join([ '<edit-config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">\n' ' <target>\n' ' <running></running>\n' ' </target>\n' ' <config>\n' ' <vlan xmlns="http://cisco.com/ns/yang/ned/ios">\n' ' <vlan-list>\n' ' <id>300</id>\n' ' </vlan-list>\n' ' </vlan>\n' ' </config>\n' '</edit-config>\n' ]))
def test_cfg(self): tb = Genie.testbed = Testbed() dev = Device(testbed=tb, name='PE1', os='nxos') rip = Rip(instance_id=1) rip.add_force_vrf(None) dev.add_feature(rip) rip.device_attr['PE1'] output = rip.build_config(apply=False) self.assertMultiLineDictEqual(output, {'PE1': 'feature rip\n' 'router rip 1\n' ' address-family ipv4 unicast\n' ' exit\n' ' exit' }) vrf1 = Vrf('vrf1') intf1 = Interface(device=dev, name='Ethernet0/0', vrf=vrf1) intf1.add_feature(rip) rip.address_families |= {AddressFamily.ipv6_unicast} rip.shutdown = False rip.device_attr['PE1'].vrf_attr[None].address_family_attr['ipv4 unicast'].maximum_paths = 2 rip.device_attr['PE1'].vrf_attr[None].address_family_attr['ipv4 unicast'].default_metric = 1 rip.device_attr['PE1'].vrf_attr[None].address_family_attr['ipv4 unicast'].distance = 120 rip.device_attr['PE1'].vrf_attr[None].address_family_attr['ipv4 unicast'].redistribute_direct_rmap\ = 'rmap1' rip.device_attr['PE1'].vrf_attr[None].address_family_attr['ipv4 unicast'].redistribute_static_rmap\ = 'rmap2' rip.device_attr['PE1'].vrf_attr[None].address_family_attr['ipv4 unicast'].redistribute_lisp_rmap\ = 'rmap3' rip.device_attr['PE1'].vrf_attr[None].address_family_attr['ipv6 unicast'].maximum_paths = 7 rip.device_attr['PE1'].vrf_attr[None].address_family_attr['ipv6 unicast'].default_metric = 3 rip.device_attr['PE1'].vrf_attr[None].address_family_attr['ipv6 unicast'].distance = 120 rip.device_attr['PE1'].vrf_attr[None].address_family_attr['ipv6 unicast'].redistribute_direct_rmap\ = 'rmap4' rip.device_attr['PE1'].vrf_attr[None].address_family_attr['ipv6 unicast'].redistribute_static_rmap\ = 'rmap5' rip.device_attr['PE1'].vrf_attr[None].address_family_attr['ipv6 unicast'].redistribute_lisp_rmap\ = 'rmap6' rip.device_attr['PE1'].vrf_attr['vrf1'].address_family_attr['ipv6 unicast'].\ maximum_paths = 10 rip.device_attr['PE1'].vrf_attr['vrf1'].address_family_attr['ipv6 unicast'].\ default_metric = 7 rip.device_attr['PE1'].vrf_attr['vrf1'].address_family_attr['ipv6 unicast'].\ distance = 127 rip.device_attr['PE1'].vrf_attr['vrf1'].address_family_attr['ipv6 unicast'].\ redistribute_direct_rmap = 'rmap14' rip.device_attr['PE1'].vrf_attr['vrf1'].address_family_attr['ipv6 unicast'].\ redistribute_static_rmap = 'rmap15' rip.device_attr['PE1'].vrf_attr['vrf1'].address_family_attr['ipv6 unicast'].\ redistribute_lisp_rmap = 'rmap16' # rip.build_config(apply=False) output = rip.build_config(apply=False) expected_output = {'PE1': '''\ router rip 1 no shutdown address-family ipv4 unicast default-metric 1 distance 120 maximum-paths 2 redistribute lisp route-map rmap3 redistribute direct route-map rmap1 redistribute static route-map rmap2 exit address-family ipv6 unicast default-metric 3 distance 120 maximum-paths 7 redistribute lisp route-map rmap6 redistribute direct route-map rmap4 redistribute static route-map rmap5 exit vrf vrf1 address-family ipv4 unicast exit address-family ipv6 unicast default-metric 7 distance 127 maximum-paths 10 redistribute lisp route-map rmap16 redistribute direct route-map rmap14 redistribute static route-map rmap15 exit exit exit'''} self.maxDiff = None self.assertMultiLineDictEqual(output, expected_output) # Set a mock dev.cli = Mock() dev.configure = Mock() dev.add_feature(rip) # Mock config output = rip.build_config(apply=True)
def test_multi_device_configuration(self): tb = Genie.testbed = Testbed() dev1 = Device(testbed=tb, name='dev1', os='nxos') dev2 = Device(testbed=tb, name='dev2', os='nxos') rip = Rip(instance_id=1) rip.add_force_vrf(None) dev1.cli = Mock() dev1.configure = Mock() dev2.cli = Mock() dev2.configure = Mock() dev1.add_feature(rip) dev2.add_feature(rip) # Default configuration, let's make sure it works output = rip.build_config(apply=False) self.assertMultiLineDictEqual(output, { 'dev1': 'feature rip\n' 'router rip 1\n' ' address-family ipv4 unicast\n' ' exit\n' ' exit', 'dev2': 'feature rip\n' 'router rip 1\n' ' address-family ipv4 unicast\n' ' exit\n' ' exit'}) rip.address_families |= {AddressFamily.ipv6_unicast} rip.shutdown = True rip.device_attr['dev1'].vrf_attr[None].address_family_attr['ipv4 unicast'].maximum_paths = 2 rip.device_attr['dev1'].vrf_attr[None].address_family_attr['ipv4 unicast'].default_metric = 1 rip.device_attr['dev1'].vrf_attr[None].address_family_attr['ipv4 unicast'].distance = 120 rip.device_attr['dev1'].vrf_attr[None].address_family_attr['ipv4 unicast'].redistribute_direct_rmap\ = 'rmap1' rip.device_attr['dev1'].vrf_attr[None].address_family_attr['ipv4 unicast'].redistribute_static_rmap\ = 'rmap2' rip.device_attr['dev1'].vrf_attr[None].address_family_attr['ipv4 unicast'].redistribute_lisp_rmap\ = 'rmap3' rip.device_attr['dev1'].vrf_attr[None].address_family_attr['ipv6 unicast'].maximum_paths = 7 rip.device_attr['dev1'].vrf_attr[None].address_family_attr['ipv6 unicast'].default_metric = 3 rip.device_attr['dev1'].vrf_attr[None].address_family_attr['ipv6 unicast'].distance = 120 rip.device_attr['dev1'].vrf_attr[None].address_family_attr['ipv6 unicast'].redistribute_direct_rmap\ = 'rmap4' rip.device_attr['dev1'].vrf_attr[None].address_family_attr['ipv6 unicast'].redistribute_static_rmap\ = 'rmap5' rip.device_attr['dev1'].vrf_attr[None].address_family_attr['ipv6 unicast'].redistribute_lisp_rmap\ = 'rmap6' rip.device_attr['dev2'].vrf_attr[None].address_family_attr['ipv4 unicast'].maximum_paths = 4 rip.device_attr['dev2'].vrf_attr[None].address_family_attr['ipv4 unicast'].default_metric = 3 rip.device_attr['dev2'].vrf_attr[None].address_family_attr['ipv4 unicast'].distance = 122 rip.device_attr['dev2'].vrf_attr[None].address_family_attr['ipv4 unicast'].redistribute_direct_rmap\ = 'rmap_direct' rip.device_attr['dev2'].vrf_attr[None].address_family_attr['ipv4 unicast'].redistribute_static_rmap\ = 'rmap_static' rip.device_attr['dev2'].vrf_attr[None].address_family_attr['ipv4 unicast'].redistribute_lisp_rmap\ = 'rmap_lisp' rip.device_attr['dev2'].vrf_attr[None].address_family_attr['ipv6 unicast'].maximum_paths = 7 rip.device_attr['dev2'].vrf_attr[None].address_family_attr['ipv6 unicast'].default_metric = 3 rip.device_attr['dev2'].vrf_attr[None].address_family_attr['ipv6 unicast'].distance = 120 rip.device_attr['dev2'].vrf_attr[None].address_family_attr['ipv6 unicast'].redistribute_direct_rmap\ = 'rmap_direct_ipv6' rip.device_attr['dev2'].vrf_attr[None].address_family_attr['ipv6 unicast'].redistribute_static_rmap\ = 'rmap_static_ipv6' rip.device_attr['dev2'].vrf_attr[None].address_family_attr['ipv6 unicast'].redistribute_lisp_rmap\ = 'rmap_lisp_ipv6' output = rip.build_config(apply=False) expected_output = {'dev1': '''\ router rip 1 shutdown address-family ipv4 unicast default-metric 1 distance 120 maximum-paths 2 redistribute lisp route-map rmap3 redistribute direct route-map rmap1 redistribute static route-map rmap2 exit address-family ipv6 unicast default-metric 3 distance 120 maximum-paths 7 redistribute lisp route-map rmap6 redistribute direct route-map rmap4 redistribute static route-map rmap5 exit exit''', 'dev2': '''\ router rip 1 shutdown address-family ipv4 unicast default-metric 3 distance 122 maximum-paths 4 redistribute lisp route-map rmap_lisp redistribute direct route-map rmap_direct redistribute static route-map rmap_static exit address-family ipv6 unicast default-metric 3 distance 120 maximum-paths 7 redistribute lisp route-map rmap_lisp_ipv6 redistribute direct route-map rmap_direct_ipv6 redistribute static route-map rmap_static_ipv6 exit exit'''} self.maxDiff = None self.assertMultiLineDictEqual(output, expected_output) output = rip.build_config(apply=True)
def test_basic_uncfg(self): testbed = Genie.testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='nxos') dev2 = Device(testbed=testbed, name='PE2', os='nxos') intf1 = Interface(name='Ethernet0/0/1', device=dev1, layer=Layer.L3) intf2 = Interface(name='Ethernet0/0/2', device=dev2, layer=Layer.L2) link = Link(name='1_2_1', testbed=testbed) link.connect_interface(interface=intf1) link.connect_interface(interface=intf2) vlan = Vlan() link.add_feature(vlan) vlan.vlan_id = 100 access_map_id = 'ed' vlan_configuration_id = '3' vlan.device_attr[dev1] vlan.device_attr[dev2] vlan.device_attr[dev1].access_map_attr[access_map_id] vlan.device_attr[dev2].access_map_attr[access_map_id] vlan.device_attr[dev1].interface_attr[intf1] vlan.device_attr[dev2].interface_attr[intf2] vlan.device_attr[dev2].interface_attr[intf2].switchport_mode = \ L2_type.TRUNK vlan.device_attr[dev2].interface_attr[intf2].sw_trunk_allowed_vlan = \ '200-201' vlan.device_attr[dev1].vlan_configuration_attr[vlan_configuration_id] vlan.device_attr[dev2].vlan_configuration_attr[vlan_configuration_id] # Defining attributes section vlan.shutdown = False with self.assertRaises(ValueError): vlan.media = 'invalid' vlan.media = 'enet' self.assertIs(type(vlan.media), Vlan.Media) vlan.egress_port_channel_load_balance_random = True vlan.device_attr[dev1].access_map_action = 'drop' vlan.datalink_flow_monitor = True # Unconfig testing # Set a mock dev1.cli = Mock() dev1.configure = Mock() dev2.cli = Mock() dev2.configure = Mock() dev1.add_feature(vlan) dev2.add_feature(vlan) # Mock config output = vlan.build_config(apply=True) uncfg1 = vlan.build_unconfig(apply=False) self.assertCountEqual(uncfg1.keys(), ['PE1', 'PE2']) self.assertMultiLineEqual( str(uncfg1['PE1']), '\n'.join([ 'no vlan 100', 'no vlan access-map ed', 'no vlan configuration 3', ])) self.assertMultiLineEqual( str(uncfg1['PE2']), '\n'.join([ 'no vlan 100', 'no vlan access-map ed', 'no vlan configuration 3', 'interface Ethernet0/0/2', ' no switchport mode trunk', ' no switchport trunk allowed vlan 200-201', ' exit', ])) partial_uncfg1 = vlan.build_unconfig(apply=False, attributes={'device_attr': \ {'*': "media"}}) self.assertCountEqual(partial_uncfg1.keys(), ['PE1', 'PE2']) self.assertMultiLineEqual( str(partial_uncfg1['PE1']), '\n'.join([ 'vlan 100', ' no media enet', ' exit', ])) partial_unconfigure = vlan.build_unconfig(apply=False, attributes={'device_attr': \ {'*': {'access_map_attr': \ {'*': "access_map_action"}}}}) self.assertCountEqual(partial_unconfigure.keys(), ['PE1', 'PE2']) self.assertMultiLineEqual( str(partial_unconfigure['PE1']), '\n'.join([ 'vlan access-map ed', ' no action drop', ' exit', ])) all_vlan_interface_uncfg = vlan.build_unconfig(apply=False, attributes={ \ 'device_attr': {'*': { \ 'interface_attr': '*'}}}) self.assertCountEqual(all_vlan_interface_uncfg.keys(), ['PE1', 'PE2']) self.assertMultiLineEqual( str(all_vlan_interface_uncfg['PE2']), '\n'.join([ 'interface Ethernet0/0/2', ' no switchport mode trunk', ' no switchport trunk allowed vlan 200-201', ' exit', ])) partial_vlan_interface_uncfg = vlan.build_unconfig(apply=False, attributes={ \ 'device_attr': {'*': \ {'interface_attr': \ { '*': "sw_trunk_allowed_vlan"}}}}) self.assertCountEqual(partial_vlan_interface_uncfg.keys(), ['PE1', 'PE2']) self.assertMultiLineEqual( str(partial_vlan_interface_uncfg['PE2']), '\n'.join([ 'interface Ethernet0/0/2', ' no switchport trunk allowed vlan 200-201', ' exit', ]))
def test_basic_uncfg(self): testbed = Genie.testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='iosxr') dev2 = Device(testbed=testbed, name='PE2', os='iosxr') intf1 = Interface(name='GigabitEthernet0/0/1', device=dev1) intf2 = Interface(name='GigabitEthernet0/0/2', device=dev2) intf3 = Interface(name='GigabitEthernet0/0/3', device=dev1) link = Link(name='1_2_1', testbed=testbed) link.connect_interface(interface=intf1) link.connect_interface(interface=intf2) vlan = Vlan() link.add_feature(vlan) # Defining attributes section vlan.device_attr[dev1] vlan.device_attr[dev2] vlan.device_attr[dev1].interface_attr[intf1] vlan.device_attr[dev1].interface_attr[intf1].eth_encap_type1 = 'dot1q' vlan.device_attr[dev1].interface_attr[intf1].eth_encap_val1 = 2 vlan.device_attr[dev1].interface_attr[ intf1].eth_encap_type2 = 'second-dot1q' vlan.device_attr[dev1].interface_attr[intf1].eth_encap_val2 = 5 # Unconfig testing # Set a mock dev1.cli = Mock() dev1.configure = Mock() dev2.cli = Mock() dev2.configure = Mock() dev1.add_feature(vlan) dev2.add_feature(vlan) # Mock config output = vlan.build_config(apply=True) uncfg = vlan.build_unconfig(apply=False) self.assertMultiLineEqual( str(uncfg['PE1']), '\n'.join([ 'interface GigabitEthernet0/0/1', ' no encapsulation dot1q 2 second-dot1q 5', ' exit', ])) all_vlan_interface_uncfg = vlan.build_unconfig(apply=False, attributes={'device_attr':\ {'*':{'interface_attr':'*'}}}) self.assertCountEqual(all_vlan_interface_uncfg.keys(), ['PE1', 'PE2']) self.assertMultiLineEqual( str(all_vlan_interface_uncfg['PE1']), '\n'.join([ 'interface GigabitEthernet0/0/1', ' no encapsulation dot1q 2 second-dot1q 5', ' exit', ])) partial_vlan_interface_uncfg = vlan.build_unconfig(apply=False, attributes={'device_attr':\ {'*':{'interface_attr':\ {'*':"eth_encap_type1"}}}}) self.assertCountEqual(partial_vlan_interface_uncfg.keys(), ['PE1', 'PE2']) self.assertMultiLineEqual( str(partial_vlan_interface_uncfg['PE1']), '\n'.join([ 'interface GigabitEthernet0/0/1', ' no encapsulation dot1q 2 second-dot1q 5', ' exit', ]))
def test_basic_uncfg(self): testbed = Genie.testbed = Testbed() dev1 = Device(testbed=testbed, name='PE1', os='iosxe', context='yang') dev2 = Device(testbed=testbed, name='PE2', os='iosxe', context='yang') intf1 = Interface(name='GigabitEthernet0/0/1', device=dev1) intf2 = Interface(name='GigabitEthernet0/0/2', device=dev2) intf3 = Interface(name='Vlan100', device=dev1) vlan = Vlan() for dev in testbed.devices: dev.connections = Mock() dev.connections = {'netconf': NetconfConnectionInfo()} vlan.device_attr[dev1].vlan_id = 100 vlan.device_attr[dev2].vlan_id = 300 # Unconfig testing # Set a mock dev1.configure = Mock() dev2.configure = Mock() dev1.add_feature(vlan) dev2.add_feature(vlan) # Mock config uncfg1 = vlan.build_unconfig(apply=False) self.assertCountEqual(uncfg1.keys(), ['PE1', 'PE2']) compare = "" for i in uncfg1['PE1']: compare += str(i) # A case has been already raised by JB so the unconfig for yang works as expected. # Currently, retruned xml for yang unconfig is exactly the same for the unconfig one. self.assertMultiLineEqual( compare, '\n'.join([ '<edit-config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">\n' ' <target>\n' ' <running></running>\n' ' </target>\n' ' <config>\n' ' <vlan xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-native">\n' ' <vlan-list xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-vlan">\n' ' <id>100</id>\n' ' </vlan-list>\n' ' </vlan>\n' ' </config>\n' '</edit-config>\n' ])) compare = "" for i in uncfg1['PE2']: compare += str(i) self.assertMultiLineEqual( compare, '\n'.join([ '<edit-config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">\n' ' <target>\n' ' <running></running>\n' ' </target>\n' ' <config>\n' ' <vlan xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-native">\n' ' <vlan-list xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-vlan">\n' ' <id>300</id>\n' ' </vlan-list>\n' ' </vlan>\n' ' </config>\n' '</edit-config>\n' ]))