Add suite for prefixcounting and shard monitoring
[integration/test.git] / csit / libraries / ShardStability.robot
diff --git a/csit/libraries/ShardStability.robot b/csit/libraries/ShardStability.robot
new file mode 100644 (file)
index 0000000..015c2c9
--- /dev/null
@@ -0,0 +1,57 @@
+*** Settings ***
+Documentation     Robot library to monitor shard stability.
+...
+...               Copyright (c) 2017 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
+...
+...               This is a "stateful" library to monitor shard leaders and candidates. During the initial phase
+...               all leaders and followeres are stored and then checked with new value on verify.
+...               TODO: investigate whether pure stateless library would be easier or harder to use.
+...
+...               Requirements: ClusterManagement.ClusterManagement_Setup must be called before Shard_Stability_Init
+...
+...               It is possible to use it for stateless comparison.
+Library           Collections
+Library           String
+Resource          ${CURDIR}/ClusterManagement.robot
+
+*** Variables ***
+&{stored_details}
+
+*** Keywords ***
+Shards_Stability_Init_Details
+    [Arguments]    ${shard_list}    ${member_index_list}=${EMPTY}
+    [Documentation]    Initialize data for given shards.
+    ...    ${shard_list} should be initialized as @{list} shard_name1:shard_type1 shard_name2:shard..
+    ${shards_details} =    Shards_Stability_Get_Details    ${shard_list}    member_index_list=${member_index_list}
+    BuiltIn.Set_Suite_Variable    ${stored_details}    ${shards_details}
+
+Shards_Stability_Get_Details
+    [Arguments]    ${shard_list}    ${member_index_list}=${EMPTY}
+    [Documentation]    Return shard details stored in dictionary.
+    ...    ${shard_list} should be initialized as @{list} shard_name1:shard_type1 shard_name2:shard..
+    &{shards_details}    BuiltIn.Create_Dictionary
+    : FOR    ${shard_details}    IN    @{shard_list}
+    \    ${shard_name}    ${shard_type}    String.Split_String    ${shard_details}    separator=:
+    \    ${leader}    ${followers}    ClusterManagement.Get_Leader_And_Followers_For_Shard    shard_name=${shard_name}    shard_type=${shard_type}    member_index_list=${member_index_list}
+    \    Collections.Sort_List    ${followers}
+    \    Collections.Set_To_Dictionary    ${shards_details}    ${shard_name}_${shard_type}_leader=${leader}
+    \    Collections.Set_To_Dictionary    ${shards_details}    ${shard_name}_${shard_type}_followers=${followers}
+    BuiltIn.Return_From_Keyword    ${shards_details}
+
+Shards_Stability_Verify
+    [Arguments]    ${shard_list}    ${member_index_list}=${EMPTY}
+    [Documentation]    Verify that present details as the same as the stored one from Shards_Stability_Init_Details
+    ${present_details} =    Shards_Stability_Get_Details    ${shard_list}    member_index_list=${member_index_list}
+    Shards_Stability_Compare_Same    ${present_details}
+
+Shards_Stability_Compare_Same
+    [Arguments]    ${details}    ${stateless_details}=${EMPTY}
+    [Documentation]    Compare two distionaries created by Shards_Stability_Get_Details
+    ${exp_details} =    BuiltIn.Set_Variable_If    "${stateless_details}" == "${EMPTY}"    ${stored_details}    ${stateless_details}
+    Collections.Log_Dictionary    ${exp_details}
+    Collections.Log_Dictionary    ${details}
+    Collections.Dictionaries_Should_Be_Equal    ${exp_details}    ${details}