Fix bgpcep-1node-userfeatures tests
[integration/test.git] / csit / libraries / PrefixCounting.robot
index 0c8a3061da6cec256602a739ba8606ad0c072eda..3e0fc146b405faf2b40544b845e9385aafcd10c6 100644 (file)
@@ -1,60 +1,81 @@
 *** Settings ***
 Documentation     Robot keyword library (Resource) for common BGP actions concerned with counting prefixes.
 ...
-...               Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
+...               Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
 ...
 ...               This program and the accompanying materials are made available under the
 ...               terms of the Eclipse Public License v1.0 which accompanies this distribution,
 ...               and is available at http://www.eclipse.org/legal/epl-v10.html
 ...
 ...
-...               Currently, all keywords count prefixes only in example-ipv4-topology.
+...               Currently, all keywords count prefixes only in ${topology}.
 ...               Prefix is identified by simplistic regular expression on JSON data.
 ...
 ...               This resource assumes that RequestsLibrary has open a connection named "operational"
-...               which points to (an analogue of) http://${ODL_SYSTEM_IP}:${RESTCONFPORT}/${OPERATIONAL_API}
+...               which points to (an analogue of) http://<ip-addr>:${RESTCONFPORT}
+...               or user has to provide a similar session.
 Library           RequestsLibrary
+Resource          ${CURDIR}/ShardStability.robot
 Resource          ${CURDIR}/WaitUtils.robot
+Resource          ${CURDIR}/ScalarClosures.robot
+
+*** Variables ***
+${PC_NW_TOPOLOGY}    ${REST_API}/network-topology:network-topology/topology
 
 *** Keywords ***
 PC_Setup
     [Documentation]    Call dependency setups and construct suite variables.
     WaitUtils.WU_Setup    # includes ScalarClosures.SC_Setup
-    ${getter} =    ScalarClosures.Closure_From_Keyword_And_Arguments    Get_Ipv4_Topology_Count
-    BuiltIn.Set_Suite_Variable    ${PrefixCounting__getter}    ${getter}
 
 Get_Ipv4_Topology
-    [Documentation]    GET the example-ipv4-topology data, check status is 200, return the topology data.
+    [Arguments]    ${session}=operational    ${topology}=example-ipv4-topology
+    [Documentation]    GET the ${topology} data, check status is 200, return the topology data.
     ...
     ...    Contrary to Utils.Get_Data_From_URI, this does not Log the (potentially huge) content.
-    ${response} =    RequestsLibrary.Get_Request    operational    network-topology:network-topology/topology/example-ipv4-topology
-    Run_Keyword_If    ${response.status_code} != 200    Fail    Get on example-ipv4-topology returned status code ${response.status_code} with message: ${response.text}
+    ${response} =    RequestsLibrary.Get_Request    ${session}    ${PC_NW_TOPOLOGY}=${topology}?content=nonconfig
+    Run_Keyword_If    ${response.status_code} != 200    Fail    Get on ${topology} returned status code ${response.status_code} with message: ${response.text}
     [Return]    ${response.text}
 
 Get_Ipv4_Topology_Count
+    [Arguments]    ${session}=operational    ${topology}=example-ipv4-topology
     [Documentation]    Get topology. If not fail, return number of prefixes in the topology.
-    ${topology} =    Get_Ipv4_Topology
+    ${topology} =    Get_Ipv4_Topology    session=${session}    topology=${topology}
+    # Triple quotes are precaution against formatted output.
+    ${prefix_count} =    Builtin.Evaluate    len(re.findall('"prefix":"', '''${topology}'''))    modules=re
+    [Return]    ${prefix_count}
+
+Get_Ipv4_Topology_Count_With_Shards_Check
+    [Arguments]    ${shards_list}    ${details_exp}    ${session}=operational    ${topology}=example-ipv4-topology
+    [Documentation]    Get topology after the shards stability check passes. If not fail, return number of prefixes in the topology.
+    ${details_actual}=    ShardStability.Shards_Stability_Get_Details    ${shards_list}    http_timeout=125
+    ShardStability.Shards_Stability_Compare_Same    ${details_actual}    stateless_details=${details_exp}
+    ${topology} =    Get_Ipv4_Topology    session=${session}    topology=${topology}
     # Triple quotes are precaution against formatted output.
     ${prefix_count} =    Builtin.Evaluate    len(re.findall('"prefix":"', '''${topology}'''))    modules=re
     [Return]    ${prefix_count}
 
 Check_Ipv4_Topology_Count
-    [Arguments]    ${expected_count}
+    [Arguments]    ${expected_count}    ${session}=operational    ${topology}=example-ipv4-topology
     [Documentation]    Check that the count of prefixes matches the expected count. Fails if it does not. In either case, collect garbage.
-    ${actual_count} =    ScalarClosures.Run_Keyword_And_Collect_Garbage    Get_Ipv4_Topology_Count
+    ${actual_count} =    ScalarClosures.Run_Keyword_And_Collect_Garbage    Get_Ipv4_Topology_Count    session=${session}    topology=${topology}
     BuiltIn.Should_Be_Equal_As_Strings    ${actual_count}    ${expected_count}
 
 Check_Ipv4_Topology_Is_Empty
+    [Arguments]    ${session}=operational    ${topology}=example-ipv4-topology
     [Documentation]    Example_Ipv4_Topology has to give status 200 with zero prefixes.
     ...
     ...    Functional suites should use a more strict Keyword which tests for the whole JSON structure.
-    Check_Ipv4_Topology_Count    0
+    Check_Ipv4_Topology_Count    0    session=${session}    topology=${topology}
 
 Wait_For_Ipv4_Topology_Prefixes_To_Become_Stable
-    [Arguments]    ${timeout}=60s    ${period}=5s    ${repetitions}=1    ${excluded_count}=-1
-    [Documentation]    Each ${period} get prefix count. After ${repetitions} of stable different from ${excluded_count} within ${timeout}, Return validator output. Fail early on getter error.
+    [Arguments]    ${timeout}=60s    ${period}=5s    ${repetitions}=1    ${excluded_count}=-1    ${session}=operational    ${topology}=example-ipv4-topology
+    ...    ${shards_list}=${EMPTY}    ${shards_details}=${EMPTY}
+    [Documentation]    Each ${period} get prefix count. When called with shard list, the check is done before the count is get. After ${repetitions} of stable different from ${excluded_count} within ${timeout}, Return validator output. Fail early on getter error.
     # This is very similar to ChangeCounter keyword, but attempt to extract common code would increase overall code size.
+    ${getter} =    BuiltIn.Run_Keyword_If    """${shards_list}"""=="""${EMPTY}"""    ScalarClosures.Closure_From_Keyword_And_Arguments    Get_Ipv4_Topology_Count    session=${session}    topology=${topology}
+    ...    ELSE    ScalarClosures.Closure_From_Keyword_And_Arguments    Get_Ipv4_Topology_Count_With_Shards_Check    ${shards_list}    ${shards_details}    session=${session}
+    ...    topology=${topology}
     ${validator} =    ScalarClosures.Closure_From_Keyword_And_Arguments    WaitUtils.Excluding_Stability_Safe_Stateful_Validator_As_Keyword    state_holder    data_holder    excluded_value=${excluded_count}
-    ${result} =    WaitUtils.Wait_For_Getter_Error_Or_Safe_Stateful_Validator_Consecutive_Success    timeout=${timeout}    period=${period}    count=${repetitions}    getter=${PrefixCounting__getter}    safe_validator=${validator}
+    ${result} =    WaitUtils.Wait_For_Getter_Error_Or_Safe_Stateful_Validator_Consecutive_Success    timeout=${timeout}    period=${period}    count=${repetitions}    getter=${getter}    safe_validator=${validator}
     ...    initial_state=${excluded_count}
     [Return]    ${result}