Ejemplo n.º 1
0
    def test_ipv4_multiple_lines_confg(self):
        # For failures
        self.maxDiff = None

        # Set Genie Tb
        testbed = Testbed()
        Genie.testbed = testbed

        # Device
        dev1 = Device(name='PE1', testbed=testbed, os='nxos')
        intf1 = Interface(name='Ethernet3/7', device=dev1, \
            aliases=['PE1_1'])
        vrf = Vrf(name='test', testbed=testbed)
        dev1.add_feature(vrf)

        # Apply configuration
        intf1.description = 'multiple lines config'

        ipv4a = IPv4Addr(device=dev1)
        ipv4a.ipv4 = IPv4Address('192.168.1.1')
        ipv4a.prefix_length = '24'
        intf1.add_ipv4addr(ipv4a)
        ipv4b = IPv4Addr(device=dev1)
        ipv4b.ipv4 = IPv4Address('192.168.1.2')
        ipv4b.prefix_length = '24'
        ipv4b.ipv4_secondary = True
        intf1.add_ipv4addr(ipv4b)
        intf1.shutdown = False
        # make intf2 as L3 interface
        intf1.switchport_enable = False

        # Build config
        cfgs = intf1.build_config(apply=False)
        # Check config build correctly
        self.assertMultiLineEqual(
            str(cfgs),
            '\n'.join([
                'interface Ethernet3/7',
                ' description multiple lines config',
                ' no shutdown',
                ' no switchport',
                ' ip address 192.168.1.1/24',
                ' ip address 192.168.1.2/24 secondary',
                ' exit'
                ]))

        # Build unconfig
        uncfgs = intf1.build_unconfig(apply=False, attributes={'switchport_enable': True,
                                                               'description': True,
                                                               'shutdown': True})
        # Check config build correctly
        self.assertMultiLineEqual(
            str(uncfgs),
            '\n'.join([
                'interface Ethernet3/7',
                ' no description',
                ' shutdown',
                ' switchport',
                ' exit'
                ]))        
Ejemplo n.º 2
0
def config_interface_subinterface_and_secondary_addresses(
    device,
    interface,
    sub_interface_num,
    ip_address,
    prefix,
    encap_type,
    start,
    end,
):
    """ Configure sub-interface and secondary addresses on device

        Args:
            device (`obj`): Device object
            interface (`str`): Interface name
            sub_interface_num (`int`): Subinterface to be added to
                                 interface name
            ip_address(`str`): IP addressed to be configured on interface
            prefix(`str`): prefix to be used in configuration
            encap_type (`str`): Encapsulation type
            start (`int`): start number on ip
            end (`int`): end number on ip

        Returns:
            None

        Raises:
            SubCommandFailure
    """
    # interface {interface}.999
    #  encapsulation dot1Q 999
    #  ip address 10.4.0.1 255.255.255.0
    #  ip address 1.1.x.1 255.255.255.0 secondary (x -> 1 to 15)
    name = interface + "." + str(sub_interface_num)
    sub_intf = Interface(device=device, name=name)
    sub_intf.eth_encap_type1 = encap_type
    sub_intf.eth_encap_val1 = sub_interface_num
    ipv4a = IPv4Addr(device=device)
    ipv4a.ipv4 = IPv4Address(ip_address.format(x=start))
    ipv4a.prefix_length = prefix
    sub_intf.add_ipv4addr(ipv4a)

    for x in range(end - start):
        ipv4b = IPv4Addr(device=device)
        ipv4b.ipv4 = IPv4Address(ip_address.format(x=x + 1))
        ipv4b.prefix_length = prefix
        ipv4b.ipv4_secondary = True
        sub_intf.add_ipv4addr(ipv4b)

    try:
        config = str(sub_intf.build_config(apply=False))
        sub_intf.build_config()
    except Exception as e:
        log.error(str(e))
        raise Exception("Failed to config \n {}".format(config))
    return config
Ejemplo n.º 3
0
 def configure_intf_ip(self, conf_obj, ip, mask, **kwargs):
     ipv4 = IPv4Addr(device=kwargs['device'])
     ipv4.ipv4 = IPv4Address(ip)
     ipv4.prefix_length = mask
     conf_obj.add_ipv4addr(ipv4)
     conf_obj.build_config()
Ejemplo n.º 4
0
    def test_mcast_config(self):

        # For failures
        self.maxDiff = None

        # VRF configuration
        vrf1 = Vrf('VRF1')
        self.igmp.device_attr[self.dev1].require_router_alert = True
        igmp1 = self.igmp.device_attr[self.dev1].vrf_attr[vrf1]
        ssm1 = Ssm(device=self.dev1)
        ssm1.ssm_group_range = '239.1.1.0/24'
        ssm1.ssm_source_addr = '1.1.1.1'
        igmp1.add_ssm(ssm1)
        ssm2 = Ssm(device=self.dev1)
        ssm2.ssm_group_range = '239.1.1.0/24'
        ssm2.ssm_source_addr = '2.2.2.2'
        igmp1.add_ssm(ssm2)

        # Interface configuration
        intf1_obj = Interface(device=self.dev1, name='Ethernet2/4')
        intf1_obj.vrf = vrf1
        intf1 = intf1_obj.name
        self.igmp.device_attr[self.dev1].vrf_attr[vrf1].interface_attr[intf1]\
            .enable = True
        self.igmp.device_attr[self.dev1].vrf_attr[vrf1].interface_attr[intf1]\
            .robustness_variable = 7
        self.igmp.device_attr[self.dev1].vrf_attr[vrf1].interface_attr[intf1]\
            .group_policy = 'test2'
        self.igmp.device_attr[self.dev1].vrf_attr[vrf1].interface_attr[intf1]\
            .immediate_leave = True
        self.igmp.device_attr[self.dev1].vrf_attr[vrf1].interface_attr[intf1]\
            .max_groups = 10
        self.igmp.device_attr[self.dev1].vrf_attr[vrf1].interface_attr[intf1]\
            .query_interval = 133
        self.igmp.device_attr[self.dev1].vrf_attr[vrf1].interface_attr[intf1]\
            .query_max_response_time = 15
        self.igmp.device_attr[self.dev1].vrf_attr[vrf1].interface_attr[intf1]\
            .version = 3

        # join and static groups configuration
        igmp_intf1 = self.igmp.device_attr[
            self.dev1].vrf_attr[vrf1].interface_attr[intf1]
        join_group1 = IgmpGroup(device=self.dev1)
        join_group1.join_group = '239.1.1.1'
        join_group2 = IgmpGroup(device=self.dev1)
        join_group2.join_group = '239.3.3.3'
        join_group2.join_group_source_addr = '1.1.1.1'
        join_group3 = IgmpGroup(device=self.dev1)
        join_group3.join_group = '239.2.2.2'
        static_group1 = IgmpGroup(device=self.dev1)
        static_group1.static_group = '239.5.5.5'
        static_group2 = IgmpGroup(device=self.dev1)
        static_group2.static_group = '239.6.6.6'
        static_group2.static_group_source_addr = '2.2.2.1'
        static_group3 = IgmpGroup(device=self.dev1)
        static_group3.static_group = '239.6.6.6'
        static_group3.static_group_source_addr = '2.2.2.2'
        igmp_intf1.add_groups(join_group1)
        igmp_intf1.add_groups(join_group2)
        igmp_intf1.add_groups(join_group3)
        igmp_intf1.add_groups(static_group1)
        igmp_intf1.add_groups(static_group2)
        igmp_intf1.add_groups(static_group3)

        vrf2 = Vrf('default')
        igmp2 = self.igmp.device_attr[self.dev1].vrf_attr[vrf2]
        ssm1 = Ssm(device=self.dev1)
        ssm1.ssm_group_range = '239.1.2.0/24'
        ssm1.ssm_source_addr = '3.3.3.3'
        igmp2.add_ssm(ssm1)
        ssm2 = Ssm(device=self.dev1)
        ssm2.ssm_group_range = '239.1.1.0/24'
        ssm2.ssm_source_addr = '3.3.3.3'
        igmp2.add_ssm(ssm2)

        # Interface configuration
        intf2_obj = Interface(device=self.dev1, name='Ethernet2/1')
        ipv4a = IPv4Addr(device=self.dev1)
        ipv4a.ipv4 = '20.1.2.1'
        ipv4a.prefix_length = '24'
        intf2_obj.add_ipv4addr(ipv4a)

        intf2 = intf2_obj.name
        self.igmp.device_attr[self.dev1].vrf_attr[vrf2].interface_attr[intf2]\
            .enable = True

        # join and static groups configuration
        igmp_intf1 = self.igmp.device_attr[
            self.dev1].vrf_attr[vrf2].interface_attr[intf2]
        join_group = IgmpGroup(device=self.dev1)
        join_group.join_group = '239.3.3.3'
        join_group.join_group_source_addr = '1.1.1.1'
        static_group = IgmpGroup(device=self.dev1)
        static_group.static_group = '239.5.5.5'
        igmp_intf1.add_groups(join_group)
        igmp_intf1.add_groups(static_group)

        # Build interface config for none-default vrfs
        intf_cfgs = intf1_obj.build_config(apply=False)
        self.assertMultiLineEqual(
            str(intf_cfgs), '\n'.join([
                'interface Ethernet2/4',
                ' vrf member VRF1',
                ' exit',
            ]))

        intf_cfgs = intf2_obj.build_config(apply=False)
        self.assertMultiLineEqual(
            str(intf_cfgs), '\n'.join([
                'interface Ethernet2/1',
                ' ip address 20.1.2.1/24',
                ' exit',
            ]))

        # Build igmp configuration
        cfgs = self.igmp.build_config(apply=False)

        # Check config built correctly
        self.assertMultiLineEqual(
            str(cfgs[self.dev1.name]), '\n'.join([
                'ip igmp enforce-router-alert',
                'ip igmp ssm-translate 239.1.1.0/24 3.3.3.3',
                'ip igmp ssm-translate 239.1.2.0/24 3.3.3.3',
                'interface Ethernet2/1',
                ' ip pim sparse-mode',
                ' ip igmp join-group 239.3.3.3 source 1.1.1.1',
                ' ip igmp static-oif 239.5.5.5',
                ' exit',
                'vrf context VRF1',
                ' ip igmp ssm-translate 239.1.1.0/24 1.1.1.1',
                ' ip igmp ssm-translate 239.1.1.0/24 2.2.2.2',
                ' exit',
                'interface Ethernet2/4',
                ' ip pim sparse-mode',
                ' ip igmp access-group test2',
                ' ip igmp immediate-leave',
                ' ip igmp state-limit 10',
                ' ip igmp query-interval 133',
                ' ip igmp query-max-response-time 15',
                ' ip igmp robustness-variable 7',
                ' ip igmp version 3',
                ' ip igmp join-group 239.1.1.1',
                ' ip igmp join-group 239.2.2.2',
                ' ip igmp join-group 239.3.3.3 source 1.1.1.1',
                ' ip igmp static-oif 239.5.5.5',
                ' ip igmp static-oif 239.6.6.6 source 2.2.2.1',
                ' ip igmp static-oif 239.6.6.6 source 2.2.2.2',
                ' exit',
            ]))

        # Build unconfig
        cfgs = self.igmp.build_unconfig(apply=False)

        # Check config correctly unconfigured
        self.assertMultiLineEqual(
            str(cfgs[self.dev1.name]), '\n'.join([
                'no ip igmp enforce-router-alert',
                'no ip igmp ssm-translate 239.1.1.0/24 3.3.3.3',
                'no ip igmp ssm-translate 239.1.2.0/24 3.3.3.3',
                'interface Ethernet2/1',
                ' no ip pim sparse-mode',
                ' no ip igmp join-group 239.3.3.3 source 1.1.1.1',
                ' no ip igmp static-oif 239.5.5.5',
                ' exit',
                'no vrf context VRF1',
                'interface Ethernet2/4',
                ' no ip pim sparse-mode',
                ' no ip igmp access-group test2',
                ' no ip igmp immediate-leave',
                ' no ip igmp state-limit 10',
                ' no ip igmp query-interval 133',
                ' no ip igmp query-max-response-time 15',
                ' no ip igmp robustness-variable 7',
                ' no ip igmp version 3',
                ' no ip igmp join-group 239.1.1.1',
                ' no ip igmp join-group 239.2.2.2',
                ' no ip igmp join-group 239.3.3.3 source 1.1.1.1',
                ' no ip igmp static-oif 239.5.5.5',
                ' no ip igmp static-oif 239.6.6.6 source 2.2.2.1',
                ' no ip igmp static-oif 239.6.6.6 source 2.2.2.2',
                ' exit',
            ]))

        # Build unconfig with attribute
        cfgs = self.igmp.build_unconfig(apply=False,
                                        attributes={
                                            'device_attr': {
                                                self.dev1: {
                                                    'require_router_alert':
                                                    True,
                                                    'vrf_attr': {
                                                        vrf1: {
                                                            'ssm': None,
                                                        },
                                                        vrf2: {
                                                            'interface_attr': {
                                                                'Ethernet2/1':
                                                                {
                                                                    'enable':
                                                                    True
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        })

        # Check config correctly unconfigured
        self.assertMultiLineEqual(
            str(cfgs[self.dev1.name]), '\n'.join([
                'no ip igmp enforce-router-alert',
                'interface Ethernet2/1',
                ' no ip pim sparse-mode',
                ' exit',
                'vrf context VRF1',
                ' no ip igmp ssm-translate 239.1.1.0/24 1.1.1.1',
                ' no ip igmp ssm-translate 239.1.1.0/24 2.2.2.2',
                ' exit',
            ]))
    def test_all_ethernet(self):
        testbed = Testbed()
        Genie.testbed = Testbed()
        dev1 = Device(name='PE1', os='iosxe')
        intf1 = Interface(device=dev1, name='GigabitEthernet0/0/1')
        vrf = Vrf(name='test', testbed=testbed)
        dev1.add_feature(vrf)

        # Defining attributes section
        intf1.description = 'test desc'
        intf1.enabled = True
        intf1.link_up_down_trap_enable = True
        intf1.mtu = 500
        intf1.vrf = vrf
        intf1.vrf_downstream = 'vrf_downstream_test'
        intf1.mac_address = 'aaaa.bbbb.cccc'
        intf1.bandwidth = 768
        intf1.link_status = True
        intf1.load_interval = 30
        intf1.encapsulation = 'dot1q'
        intf1.first_dot1q = '20'
        intf1.second_dot1q = '30'

        ipv4a = IPv4Addr(device=dev1)
        ipv4a.ipv4 = IPv4Address('192.168.1.1')
        ipv4a.prefix_length = '24'
        intf1.add_ipv4addr(ipv4a)
        ipv4b = IPv4Addr(device=dev1)
        ipv4b.ipv4 = IPv4Address('192.168.1.2')
        ipv4b.prefix_length = '24'
        ipv4b.ipv4_secondary = True
        intf1.add_ipv4addr(ipv4b)

        ipv6a = IPv6Addr(device=dev1)
        ipv6a.ipv6 = IPv6Address('2001:db1:1::1')
        ipv6a.ipv6_prefix_length = '64'
        intf1.add_ipv6addr(ipv6a)
        ipv6b = IPv6Addr(device=dev1)
        ipv6b.ipv6 = IPv6Address('2001:db1:2::2')
        ipv6b.ipv6_prefix_length = '64'
        intf1.add_ipv6addr(ipv6b)
        ipv6b.ipv6_anycast = True

        intf1.dhcp = True
        intf1.dhcp_client_id = '10'
        intf1.dhcp_hostname = 'dhcp-host'
        intf1.unnumbered_intf_ref = 'GigabitEthernet0/0/2.20'
        intf1.ipv6_unnumbered_intf_ref = 'GigabitEthernet0/0/3.100'
        intf1.ipv6_enabled = True
        intf1.ipv6_autoconf = True
        intf1.ipv6_autoconf_default = True
        intf1.medium = "broadcast"
        intf1.delay = 100
        intf1.port_speed = '1000'
        intf1.auto_negotiate = True
        intf1.duplex_mode = "full"
        intf1.flow_control_receive = True
        intf1.flow_control_send = False

        # Check config
        cfg = intf1.build_config(apply=False)
        self.assertMultiLineEqual(
            str(cfg), '\n'.join([
                'interface GigabitEthernet0/0/1',
                ' encapsulation dot1q 20 second-dot1q 30',
                ' vrf forwarding test downstream vrf_downstream_test',
                ' description test desc',
                ' bandwidth 768',
                ' mtu 500',
                ' no shutdown',
                ' snmp trap link-status',
                ' logging event link-status',
                ' load-interval 30',
                ' ipv6 enable',
                ' ipv6 address autoconfig default',
                ' ip unnumbered GigabitEthernet0/0/2.20',
                ' ipv6 unnumbered GigabitEthernet0/0/3.100',
                ' speed 1000',
                ' negotiation auto',
                ' duplex full',
                ' flowcontrol receive on',
                ' flowcontrol send off',
                ' ip address dhcp client-id 10 hostname dhcp-host',
                ' medium broadcast',
                ' delay 100',
                ' ip address 192.168.1.1 255.255.255.0',
                ' ip address 192.168.1.2 255.255.255.0 secondary',
                ' ipv6 address 2001:db1:1::1/64',
                ' ipv6 address 2001:db1:2::2/64 anycast',
                ' mac-address aaaa.bbbb.cccc',
                ' exit',
            ]))

        # Check unconfig without attribtues
        uncfg = intf1.build_unconfig(apply=False)
        self.assertMultiLineEqual(
            str(uncfg), '\n'.join([
                'default interface GigabitEthernet0/0/1',
                'interface GigabitEthernet0/0/1',
                'shutdown',
            ]))

        # Check ipv4 unconfig
        uncfg = intf1.build_unconfig(apply=False, attributes="ipv4addr")
        self.assertMultiLineEqual(
            str(uncfg), '\n'.join([
                'interface GigabitEthernet0/0/1',
                ' no ip address 192.168.1.1 255.255.255.0',
                ' no ip address 192.168.1.2 255.255.255.0 secondary',
                ' exit',
            ]))

        # Check encapsulation unconfig
        uncfg = intf1.build_unconfig(apply=False,
                                     attributes={
                                         "encapsulation": None,
                                         "first_dot1q": None
                                     })
        self.assertMultiLineEqual(
            str(uncfg), '\n'.join([
                'interface GigabitEthernet0/0/1',
                ' no encapsulation dot1q',
                ' exit',
            ]))
Ejemplo n.º 6
0
    def test_mcast_config(self):

        # For failures
        self.maxDiff = None

        # VRF configuration
        vrf1 = Vrf('VRF1')
        self.igmp.device_attr[self.dev1].vrf_attr[vrf1].global_max_groups = 63999
        igmp1 = self.igmp.device_attr[self.dev1].vrf_attr[vrf1]
        ssm1 = Ssm(device=self.dev1)
        ssm1.ssm_group_policy = 'test'
        ssm1.ssm_source_addr = '1.1.1.1'
        igmp1.add_ssm(ssm1)
        ssm2 = Ssm(device=self.dev1)
        ssm2.ssm_group_policy = 'test1'
        ssm2.ssm_source_addr = '2.2.2.2'
        igmp1.add_ssm(ssm2)

        # Interface configuration
        intf1_obj = Interface(device=self.dev1, name='GigabitEthernet2')
        intf1_obj.vrf = vrf1
        intf1 = intf1_obj.name
        self.igmp.device_attr[self.dev1].vrf_attr[vrf1].interface_attr[intf1]\
            .enable = True
        self.igmp.device_attr[self.dev1].vrf_attr[vrf1].interface_attr[intf1]\
            .last_member_query_interval = 100
        self.igmp.device_attr[self.dev1].vrf_attr[vrf1].interface_attr[intf1]\
            .group_policy = 'test2'
        self.igmp.device_attr[self.dev1].vrf_attr[vrf1].interface_attr[intf1]\
            .immediate_leave = True
        self.igmp.device_attr[self.dev1].vrf_attr[vrf1].interface_attr[intf1]\
            .max_groups = 10
        self.igmp.device_attr[self.dev1].vrf_attr[vrf1].interface_attr[intf1]\
            .query_interval = 133
        self.igmp.device_attr[self.dev1].vrf_attr[vrf1].interface_attr[intf1]\
            .query_max_response_time = 15
        self.igmp.device_attr[self.dev1].vrf_attr[vrf1].interface_attr[intf1]\
            .version = 3

        # join and static groups configuration
        igmp_intf1 = self.igmp.device_attr[self.dev1].vrf_attr[vrf1].interface_attr[intf1]
        join_group1 = IgmpGroup(device=self.dev1)
        join_group1.join_group = '239.1.1.1'
        join_group2 = IgmpGroup(device=self.dev1)
        join_group2.join_group = '239.3.3.3'
        join_group2.join_group_source_addr = '1.1.1.1'
        join_group3 = IgmpGroup(device=self.dev1)
        join_group3.join_group = '239.2.2.2'
        static_group1 = IgmpGroup(device=self.dev1)
        static_group1.static_group = '239.5.5.5'
        static_group2 = IgmpGroup(device=self.dev1)
        static_group2.static_group = '239.6.6.6'
        static_group2.static_group_source_addr = '2.2.2.1'
        static_group3 = IgmpGroup(device=self.dev1)
        static_group3.static_group = '239.6.6.6'
        static_group3.static_group_source_addr = '2.2.2.2'
        igmp_intf1.add_groups(join_group1)
        igmp_intf1.add_groups(join_group2)
        igmp_intf1.add_groups(join_group3)
        igmp_intf1.add_groups(static_group1)
        igmp_intf1.add_groups(static_group2)
        igmp_intf1.add_groups(static_group3)

        
        vrf2 = Vrf('default')
        self.igmp.device_attr[self.dev1].vrf_attr[vrf2].global_max_groups = 63999
        igmp2 = self.igmp.device_attr[self.dev1].vrf_attr[vrf2]
        ssm1 = Ssm(device=self.dev1)
        ssm1.ssm_group_policy = 'test'
        ssm1.ssm_source_addr = '1.1.1.1'
        igmp2.add_ssm(ssm1)
        ssm2 = Ssm(device=self.dev1)
        ssm2.ssm_group_policy = 'test2'
        ssm2.ssm_source_addr = '3.3.3.3'
        igmp2.add_ssm(ssm2)

        # Interface configuration
        intf2_obj = Interface(device=self.dev1, name='GigabitEthernet1')
        ipv4a = IPv4Addr(device=self.dev1)
        ipv4a.ipv4 = '10.1.2.1'
        ipv4a.prefix_length = '24'
        intf2_obj.add_ipv4addr(ipv4a)

        intf2 = intf2_obj.name
        self.igmp.device_attr[self.dev1].vrf_attr[vrf2].interface_attr[intf2]\
            .enable = True

        # join and static groups configuration
        igmp_intf1 = self.igmp.device_attr[self.dev1].vrf_attr[vrf2].interface_attr[intf2]
        join_group = IgmpGroup(device=self.dev1)
        join_group.join_group = '239.3.3.3'
        join_group.join_group_source_addr = '1.1.1.1'
        static_group = IgmpGroup(device=self.dev1)
        static_group.static_group = '239.5.5.5'
        igmp_intf1.add_groups(join_group)
        igmp_intf1.add_groups(static_group)

        # Build interface config for none-default vrfs
        intf_cfgs = intf1_obj.build_config(apply=False)
        self.assertMultiLineEqual(
            str(intf_cfgs),
            '\n'.join([
                'interface GigabitEthernet2',
                ' vrf forwarding VRF1',
                ' exit',
            ]))

        intf_cfgs = intf2_obj.build_config(apply=False)
        self.assertMultiLineEqual(
            str(intf_cfgs),
            '\n'.join([
                'interface GigabitEthernet1',
                ' ip address 10.1.2.1 255.255.255.0',
                ' exit',
            ]))



        # Build igmp configuration
        cfgs = self.igmp.build_config(apply=False)

        # Check config built correctly
        self.assertMultiLineEqual(
            str(cfgs[self.dev1.name]),
            '\n'.join([
                'ip igmp limit 63999',
                'ip igmp ssm-map enable',
                'ip igmp ssm-map static test 1.1.1.1',
                'ip igmp ssm-map static test2 3.3.3.3',
                'interface GigabitEthernet1',
                ' ip pim sparse-mode',
                ' ip igmp join-group 239.3.3.3 source 1.1.1.1',
                ' ip igmp static-group 239.5.5.5',
                ' exit',
                'ip igmp vrf VRF1 limit 63999',
                'ip igmp vrf VRF1 ssm-map enable',
                'ip igmp vrf VRF1 ssm-map static test 1.1.1.1',
                'ip igmp vrf VRF1 ssm-map static test1 2.2.2.2',
                'interface GigabitEthernet2',
                ' ip pim sparse-mode',
                ' ip igmp last-member-query-interval 100',
                ' ip igmp access-group test2',
                ' ip igmp immediate-leave group-list all-groups',
                ' ip igmp limit 10',
                ' ip igmp query-interval 133',
                ' ip igmp query-max-response-time 15',
                ' ip igmp version 3',
                ' ip igmp join-group 239.1.1.1',
                ' ip igmp join-group 239.2.2.2',
                ' ip igmp join-group 239.3.3.3 source 1.1.1.1',
                ' ip igmp static-group 239.5.5.5',
                ' ip igmp static-group 239.6.6.6 source 2.2.2.1',
                ' ip igmp static-group 239.6.6.6 source 2.2.2.2',
                ' exit',
            ]))

        # Build unconfig
        cfgs = self.igmp.build_unconfig(apply=False)

        # Check config correctly unconfigured
        self.assertMultiLineEqual(
            str(cfgs[self.dev1.name]),
            '\n'.join([
                'no ip igmp limit 63999',
                'no ip igmp ssm-map enable',
                'no ip igmp ssm-map static test 1.1.1.1',
                'no ip igmp ssm-map static test2 3.3.3.3',
                'interface GigabitEthernet1',
                ' no ip pim sparse-mode',
                ' no ip igmp join-group 239.3.3.3 source 1.1.1.1',
                ' no ip igmp static-group 239.5.5.5',
                ' exit',
                'no ip igmp vrf VRF1 limit 63999',
                'no ip igmp vrf VRF1 ssm-map enable',
                'no ip igmp vrf VRF1 ssm-map static test 1.1.1.1',
                'no ip igmp vrf VRF1 ssm-map static test1 2.2.2.2',
                'interface GigabitEthernet2',
                ' no ip pim sparse-mode',
                ' no ip igmp last-member-query-interval 100',
                ' no ip igmp access-group test2',
                ' no ip igmp immediate-leave group-list all-groups',
                ' no ip igmp limit 10',
                ' no ip igmp query-interval 133',
                ' no ip igmp query-max-response-time 15',
                ' no ip igmp version 3',
                ' no ip igmp join-group 239.1.1.1',
                ' no ip igmp join-group 239.2.2.2',
                ' no ip igmp join-group 239.3.3.3 source 1.1.1.1',
                ' no ip igmp static-group 239.5.5.5',
                ' no ip igmp static-group 239.6.6.6 source 2.2.2.1',
                ' no ip igmp static-group 239.6.6.6 source 2.2.2.2',
                ' exit',
            ]))

        # Build unconfig with attribute
        cfgs = self.igmp.build_unconfig(apply=False,
                                        attributes={'device_attr': {
                                                        self.dev1: {
                                                            'vrf_attr': {
                                                                vrf1: {
                                                                    'global_max_groups': None,
                                                                    'ssm': {ssm1: None}},
                                                                vrf2: {
                                                                    'interface_attr': {
                                                                        'GigabitEthernet1': {
                                                                            'enable': True
                                                                        }
                                                                    }
                                                                }}}}})

        # Check config correctly unconfigured
        self.assertMultiLineEqual(
            str(cfgs[self.dev1.name]),
            '\n'.join([
                'interface GigabitEthernet1',
                ' no ip pim sparse-mode',
                ' exit',
                'no ip igmp vrf VRF1 limit 63999',
                'no ip igmp vrf VRF1 ssm-map enable',
                'no ip igmp vrf VRF1 ssm-map static test 1.1.1.1',
            ]))