Test to do repeated, random boots

Utilizes additional keywords:
    Validate Connection
    Intersect Lists
    Search List

Change-Id: I29a2a4805bb685a0519d4e0f7eec5ab1568edca0
Signed-off-by: Gunnar Mills <gmills@us.ibm.com>
diff --git a/lib/connection_client.robot b/lib/connection_client.robot
index 5616071..7e88882 100755
--- a/lib/connection_client.robot
+++ b/lib/connection_client.robot
@@ -68,3 +68,69 @@
 
     ${https_num}=   Convert To Integer    ${HTTPS_PORT}
     Set Global Variable     ${AUTH_URI}    https://${OPENBMC_HOST}:${https_num}
+
+Validate Or Open Connection
+    [Documentation]  Checks for an open connection to a host or alias.
+    [Arguments]  ${alias}=None  ${host}=${EMPTY}  &{connection_args}
+
+    # alias            The alias of the connection to validate.
+    # host             The DNS name or IP of the host to validate.
+    # connection_args  A dictionary of arguments to pass to Open Conection
+    #                  and Log In (see above) if the connection is not open. May
+    #                  contain, but does not need to contain, the host or alias.
+
+    # Check to make sure we have an alias or host to search for.
+    Run Keyword If  '${host}' == '${EMPTY}'  Should Not Be Equal  ${alias}  None
+    ...  msg=Need to provide a host or an alias.  values=False
+
+    # Search the dictionary to see if it includes the host and alias.
+    ${host_exists}=  Run Keyword and Return Status
+    ...              Dictionary Should Contain Key  ${connection_args}  host
+    ${alias_exists}=  Run Keyword and Return Status
+    ...               Dictionary Should Contain Key  ${connection_args}  alias
+
+    # Add the alias and host back into the dictionary of connection arguments,
+    # if needed.
+    Run Keyword If  '${host}' != '${EMPTY}' and ${host_exists} == ${FALSE}
+    ...             Set to Dictionary  ${connection_args}  host  ${host}
+    Run Keyword If  '${alias}' != 'None' and ${alias_exists} == ${FALSE}
+    ...             Set to Dictionary  ${connection_args}  alias  ${alias}
+
+    @{open_connections}=  Get Connections
+    # If there are no open connections, open one and return.
+    Run Keyword If  '${open_connections}' == '[]'
+    ...             Open Connection and Log In  &{connection_args}
+    Return From Keyword If  '${open_connections}' == '[]'
+
+    # Connect to the alias or host that matches. If both are given, only connect
+    # to a connection that has both.
+    :FOR  ${connection}  IN  @{open_connections}
+    \  Log  ${connection}
+    \  ${alias_match}=  Evaluate  '${alias}' == '${connection.alias}'
+    \  ${host_match}=  Evaluate  '${host}' == '${connection.host}'
+    \  ${given_alias}=  Evaluate  '${alias}' != 'None'
+    \  ${no_alias}=  Evaluate  '${alias}' == 'None'
+    \  ${given_host}=  Evaluate  '${host}' != '${EMPTY}'
+    \  ${no_host}=  Evaluate  '${host}' == '${EMPTY}'
+    \  Run Keyword If
+    ...    ${given_alias} and ${given_host} and ${alias_match} and ${host_match}
+    ...    Run Keywords
+    ...      Switch Connection  ${alias}  AND
+    ...      Log to Console  Found connection. Switched to ${alias} ${host}  AND
+    ...      Return From Keyword If  ${alias_match} and ${host_match}
+    ...    ELSE  Run Keyword If
+    ...      ${given_alias} and ${no_host} and ${alias_match}
+    ...      Run Keywords
+    ...        Switch Connection  ${alias}  AND
+    ...        Log to Console  Found connection. Switched to: ${alias}  AND
+    ...        Return From Keyword If  ${alias_match}
+    ...    ELSE  Run Keyword If
+    ...       ${given_host} and ${no_alias} and ${host_match}
+    ...       Run Keywords
+    ...         Switch Connection  ${connection.index}  AND
+    ...         Log to Console  Found Connection. Switched to: ${host}  AND
+    ...         Return From Keyword If  ${host_match}
+
+    # If no connections are found, open a connection with the provided args.
+    Log  No connection with provided arguments.  Opening a connection.
+    Open Connection and Log In  &{connection_args}