def test_nf_false_flag_toggle_lacp_active(topology, step, main_setup):
    """Toggle 'lacp' flag to 'active' with 'false' flag.

    The source code must handle also the possibility to retrieve from OVSDB the
    'lacp-fallback-ab' flag with 'false' even when by default the flag is not
    present.

    To disable LAG 1 on both switches, 'lacp' flag will be toggled between
    '[]' and 'active'.
    """

    sw1 = topology.get('sw1')
    sw2 = topology.get('sw2')

    assert sw1 is not None
    assert sw2 is not None

    print_header('Fallback disabled with false flag, toggle "lacp" flag to '
                 'active')

    ##########################################################################
    # Add 'fallback' flag as 'false'
    ##########################################################################
    print('Setting "lacp-fallback-ab" flag into OVSDB')
    set_port_parameter(sw1, test_lag, disable_fallback)
    set_port_parameter(sw2, test_lag, disable_fallback)

    ##########################################################################
    # LAG 1 disabled on sw1
    ##########################################################################
    print('Shutting down LAG1 on sw1')
    set_port_parameter(sw1, test_lag, disable_lag)
    print('Verify that all sw2 SMs are in "Defaulted and Expired"')
    sw_wait_until_all_sm_ready([sw2], intf_labels, active_no_fallback)

    print('Enabling LAG1 on sw1')
    set_port_parameter(sw1, test_lag, active_lag)
    print('Verify all interface SM from both switches are working')
    sw_wait_until_all_sm_ready([sw1, sw2], intf_labels, active_ready)

    ##########################################################################
    # LAG 1 disabled on sw2
    ##########################################################################
    print('Shutting down LAG1 on sw2')
    set_port_parameter(sw2, test_lag, disable_lag)
    print('Verify that all sw1 SMs are in "Defaulted and Expired"')
    sw_wait_until_all_sm_ready([sw1], intf_labels, active_no_fallback)

    print('Enabling LAG1 on sw2')
    set_port_parameter(sw2, test_lag, active_lag)

    ##########################################################################
    # Remove added flag
    ##########################################################################
    print('Clearing "lacp-fallback-ab" flag from OVSDB')
    remove_port_parameter(sw1, test_lag, other_config_key, [fallback_key])
    remove_port_parameter(sw2, test_lag, other_config_key, [fallback_key])

    print('Verify all interface SM from both switches are working')
    sw_wait_until_all_sm_ready([sw1, sw2], intf_labels, active_ready)
def test_nf_toggle_lacp_flag_active(topology, step, main_setup):
    """Toggle 'lacp' flag to 'active'.

    To disable LAG 1 on both switches, 'lacp' flag will be toggled between
    '[]' and 'active'.
    """

    sw1 = topology.get('sw1')
    sw2 = topology.get('sw2')

    assert sw1 is not None
    assert sw2 is not None

    print_header('Fallback disabled, toggle "lacp" flag to active')

    ##########################################################################
    # LAG 1 disabled on sw1
    ##########################################################################
    print('Shutting down LAG1 on sw1')
    set_port_parameter(sw1, test_lag, disable_lag)
    print('Verify that all sw2 SMs are in "Defaulted and Expired"')
    sw_wait_until_all_sm_ready([sw2], intf_labels, active_no_fallback)

    print('Enabling LAG1 on sw1')
    set_port_parameter(sw1, test_lag, active_lag)
    print('Verify all interface SM from both switches are working')
    sw_wait_until_all_sm_ready([sw1, sw2], intf_labels, active_ready)

    ##########################################################################
    # LAG 1 disabled on sw2
    ##########################################################################
    print('Shutting down LAG1 on sw2')
    set_port_parameter(sw2, test_lag, disable_lag)
    print('Verify that all sw1 SMs are in "Defaulted and Expired"')
    sw_wait_until_all_sm_ready([sw1], intf_labels, active_no_fallback)

    print('Enabling LAG1 on sw2')
    set_port_parameter(sw2, test_lag, active_lag)
    print('Verify all interface SM from both switches are working')
    sw_wait_until_all_sm_ready([sw1, sw2], intf_labels, active_ready)
def test_fb_toggle_lacp_flag_passive(topology, step, main_setup):
    """Toggle 'lacp' flag to 'passive'.

    To disable LAG 1 on both switches, 'lacp' flag will be toggled between
    '[]' and 'passive'.

    Note: Both switches cannot be in the same state of 'passive' or
    connectivity will be lost.
    """

    sw1 = topology.get('sw1')
    sw2 = topology.get('sw2')

    assert sw1 is not None
    assert sw2 is not None

    print_header('Fallback enabled, toggle "lacp" flag to passive')

    ##########################################################################
    # Add 'fallback' flag
    ##########################################################################
    print('Enabling Fallback on both switches')
    set_port_parameter(sw1, test_lag, enable_fallback)
    set_port_parameter(sw2, test_lag, enable_fallback)

    ##########################################################################
    # LAG 1 disabled on sw1
    ##########################################################################
    print('Setting sw2 LAG to "passive"')
    set_port_parameter(sw2, test_lag, passive_lag)
    print('Shutting down LAG1 on sw1')
    set_port_parameter(sw1, test_lag, disable_lag)

    print('Verify that one interface is "Collecting, Distributing and '
          'Defaulted" on sw2')
    intf_fallback_enabled = sw_wait_until_one_sm_ready([sw2], intf_labels,
                                                       passive_fallback)

    print('Found interface: %s' % intf_fallback_enabled)

    print('Verify that other interfaces are "Defaulted" on sw2')
    tmp = list(intf_labels)
    tmp.remove(intf_fallback_enabled)
    sw_wait_until_all_sm_ready([sw2], tmp, passive_other_intf)

    print('Enabling LAG1 on sw1')
    set_port_parameter(sw1, test_lag, active_lag)
    print('Verify all interface SM from sw1 are "active"')
    sw_wait_until_all_sm_ready([sw1], intf_labels, active_ready)
    print('Verify all interface SM from sw2 are "passive"')
    sw_wait_until_all_sm_ready([sw2], intf_labels, passive_ready)

    print('Setting sw2 LAG to "active"')
    set_port_parameter(sw2, test_lag, active_lag)
    print('Verify all interface SM from both switches are working')
    sw_wait_until_all_sm_ready([sw1, sw2], intf_labels, active_ready)

    ##########################################################################
    # LAG 1 disabled on sw2
    ##########################################################################
    print('Setting sw1 LAG to "passive"')
    set_port_parameter(sw1, test_lag, passive_lag)
    print('Shutting down LAG1 on sw2')
    set_port_parameter(sw2, test_lag, disable_lag)

    print('Verify that one interface is "Collecting, Distributing and '
          'Defaulted" on sw1')
    intf_fallback_enabled = sw_wait_until_one_sm_ready([sw1], intf_labels,
                                                       passive_fallback)

    print('Found interface: %s' % intf_fallback_enabled)

    print('Verify that other interfaces are "Defaulted" on sw1')
    tmp = list(intf_labels)
    tmp.remove(intf_fallback_enabled)
    sw_wait_until_all_sm_ready([sw1], tmp, passive_other_intf)

    print('Enabling LAG1 on sw2')
    set_port_parameter(sw2, test_lag, active_lag)
    print('Verify all interface SM from sw1 are "passive"')
    sw_wait_until_all_sm_ready([sw1], intf_labels, passive_ready)
    print('Verify all interface SM from sw2 are "active"')
    sw_wait_until_all_sm_ready([sw2], intf_labels, active_ready)

    print('Setting sw1 LAG to "active"')
    set_port_parameter(sw1, test_lag, active_lag)

    ##########################################################################
    # Remove added flag
    ##########################################################################
    print('Clearing "lacp-fallback-ab" flag from OVSDB')
    remove_port_parameter(sw1, test_lag, other_config_key, [fallback_key])
    remove_port_parameter(sw2, test_lag, other_config_key, [fallback_key])

    print('Verify all interface SM from both switches are working')
    sw_wait_until_all_sm_ready([sw1, sw2], intf_labels, active_ready)
def test_fb_toggle_admin_flag(topology, step, main_setup):
    """Toggle 'admin' flag.

    To disable LAG 1 on both switches, 'admin' flag will be toggled between
    'up' and 'down'.
    """

    sw1 = topology.get('sw1')
    sw2 = topology.get('sw2')

    assert sw1 is not None
    assert sw2 is not None

    print_header('Fallback enabled, toggle "admin" flag')

    ##########################################################################
    # Add 'fallback' flag
    ##########################################################################
    print('Enabling Fallback on both switches')
    set_port_parameter(sw1, test_lag, enable_fallback)
    set_port_parameter(sw2, test_lag, enable_fallback)

    ##########################################################################
    # LAG 1 disabled on sw1
    ##########################################################################
    print('Shutting down LAG1 on sw1')
    set_port_parameter(sw1, test_lag, disable_admin)
    print('Verify that one interface is "Collecting, Distributing and '
          'Defaulted" on sw2')
    intf_fallback_enabled = sw_wait_until_one_sm_ready([sw2], intf_labels,
                                                       active_fallback)

    print('Found interface: %s' % intf_fallback_enabled)

    print('Verify that other interfaces are "Defaulted" on sw2')
    tmp = list(intf_labels)
    tmp.remove(intf_fallback_enabled)
    sw_wait_until_all_sm_ready([sw2], tmp, active_other_intf)

    print('Enabling LAG1 on sw1')
    set_port_parameter(sw1, test_lag, enable_admin)
    print('Verify all interfaces SM from both switches are working')
    sw_wait_until_all_sm_ready([sw1, sw2], intf_labels, active_ready)

    ##########################################################################
    # LAG 1 disabled on sw2
    ##########################################################################
    print('Shutting down LAG1 on sw2')
    set_port_parameter(sw2, test_lag, disable_admin)
    print('Verify that one interface is "Collecting, Distributing and '
          'Defaulted" on sw1')
    intf_fallback_enabled = sw_wait_until_one_sm_ready([sw1], intf_labels,
                                                       active_fallback)

    print('Found interface: %s' % intf_fallback_enabled)

    print('Verify that other interfaces are "Defaulted" on sw1')
    tmp = list(intf_labels)
    tmp.remove(intf_fallback_enabled)
    sw_wait_until_all_sm_ready([sw1], tmp, active_other_intf)

    print('Enabling LAG1 on sw2')
    set_port_parameter(sw2, test_lag, enable_admin)

    ##########################################################################
    # Remove added flag
    ##########################################################################
    print('Clearing "lacp-fallback-ab" flag from OVSDB')
    remove_port_parameter(sw1, test_lag, other_config_key, [fallback_key])
    remove_port_parameter(sw2, test_lag, other_config_key, [fallback_key])

    print('Verify all interfaces SM from both switches are working')
    sw_wait_until_all_sm_ready([sw1, sw2], intf_labels, active_ready)