+ ... Garbage collection is unconditionally logged to files. TODO: Make that reasonable conditional?
+ [Arguments] ${member_index_list}=${EMPTY} ${wait_for_sync}=True ${timeout}=360s ${karaf_home}=${EMPTY} ${export_java_home}=${EMPTY} ${gc_log_dir}=${EMPTY}
+ ... ${check_system_status}=False ${verify_restconf}=True ${service_list}=${EMPTY_LIST}
+ ${base_command} = BuiltIn.Set_Variable_If
+ ... """${karaf_home}""" != ""
+ ... ${karaf_home}/bin/start
+ ... ${NODE_START_COMMAND}
+ ${command} = BuiltIn.Set_Variable_If
+ ... """${export_java_home}""" != ""
+ ... export JAVA_HOME="${export_java_home}"; ${base_command}
+ ... ${base_command}
+ ${epoch} = DateTime.Get_Current_Date time_zone=UTC result_format=epoch exclude_millis=False
+ ${gc_filepath} = BuiltIn.Set_Variable_If
+ ... """${karaf_home}""" != ""
+ ... ${karaf_home}/data/log/gc_${epoch}.log
+ ... ${GC_LOG_PATH}/gc_${epoch}.log
+ ${gc_options} = BuiltIn.Set_Variable_If
+ ... "docker" not in """${node_start_command}"""
+ ... -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:${gc_filepath}
+ ... ${EMPTY}
+ Run_Bash_Command_On_List_Or_All command=${command} ${gc_options} member_index_list=${member_index_list}
+ BuiltIn.Wait_Until_Keyword_Succeeds
+ ... ${timeout}
+ ... 10s
+ ... Verify_Members_Are_Ready
+ ... ${member_index_list}
+ ... ${wait_for_sync}
+ ... ${verify_restconf}
+ ... ${check_system_status}
+ ... ${service_list}
+ [Teardown] Run_Bash_Command_On_List_Or_All command=netstat -pnatu | grep 2550
+
+Verify_Members_Are_Ready
+ [Documentation] Verifies the specified readiness conditions for the given listed members after startup.
+ ... If ${verify_cluster_sync}, verifies the datastores have synced with the rest of the cluster.
+ ... If ${verify_restconf}, verifies RESTCONF is available.
+ ... If ${verify_system_status}, verifies the system services are OPERATIONAL.
+ [Arguments] ${member_index_list} ${verify_cluster_sync} ${verify_restconf} ${verify_system_status} ${service_list}
+ IF ${verify_cluster_sync}
+ Check_Cluster_Is_In_Sync ${member_index_list}
+ END
+ IF ${verify_restconf}
+ Verify_Restconf_Is_Available ${member_index_list}
+ END
+ # for backward compatibility, some consumers might not be passing @{service_list}, but since we can't set a list to a default
+ # value, we need to check here if it's empty in order to skip the check which would throw an error
+ IF ${verify_system_status} and ("${service_list}" != "[[]]")
+ ClusterManagement.Check Status Of Services Is OPERATIONAL @{service_list}
+ END
+
+Verify_Restconf_Is_Available
+ [Arguments] ${member_index_list}
+ ${index_list} = List_Indices_Or_All given_list=${member_index_list}
+ FOR ${index} IN @{index_list}
+ ${session} = Resolve_Http_Session_For_Member member_index=${index}
+ TemplatedRequests.Get_As_Json_Templated session=${session} folder=${RESTCONF_MODULES_DIR} verify=False
+ END
+
+Freeze_Single_Member
+ [Documentation] Convenience keyword that stops the specified member of the cluster by freezing the jvm.
+ [Arguments] ${member}
+ ${index_list} = ClusterManagement__Build_List ${member}
+ Freeze_Or_Unfreeze_Members_From_List_Or_All ${NODE_FREEZE_COMMAND} ${index_list}
+
+Unfreeze_Single_Member
+ [Documentation] Convenience keyword that "continues" the specified member of the cluster by unfreezing the jvm.
+ [Arguments] ${member} ${wait_for_sync}=True ${timeout}=60s
+ ${index_list} = ClusterManagement__Build_List ${member}
+ Freeze_Or_Unfreeze_Members_From_List_Or_All ${NODE_UNFREEZE_COMMAND} ${index_list}
+ BuiltIn.Wait_Until_Keyword_Succeeds ${timeout} 10s Check_Cluster_Is_In_Sync
+
+Freeze_Or_Unfreeze_Members_From_List_Or_All
+ [Documentation] If the list is empty, stops/runs all ODL instances. Otherwise stop/run members based on \${stop_index_list}
+ ... For command parameter only ${NODE_FREEZE_COMMAND} and ${NODE_UNFREEZE_COMMAND} should be used
+ [Arguments] ${command} ${member_index_list}=${EMPTY}
+ ${freeze_index_list} = List_Indices_Or_All given_list=${member_index_list}