docs: def waitForVMState(rh, userid, desiredState, maxQueries=90, sleepSecs=5):
      """
      Wait for the virtual machine to go into the indicated state.
  
      Input:
         Request Handle
         userid whose state is to be monitored
         Desired state, 'on' or 'off', case sensitive
         Maximum attempts to wait for desired state before giving up
         Sleep duration between waits
  
      Output:
         Dictionary containing the following:
            overallRC - overall return code, 0: success, non-zero: failure
            rc        - RC returned from SMCLI if overallRC = 0.
            rs        - RS returned from SMCLI if overallRC = 0.
  
      Note:
  
      """
  
      rh.printSysLog("Enter vmUtils.waitForVMState, userid: " + userid +
                             " state: " + desiredState +
                             " maxWait: " + str(maxQueries) +
                             " sleepSecs: " + str(sleepSecs))
  
      results = {}
  
      cmd = ["sudo", "/sbin/vmcp", "query", "user", userid]
      strCmd = " ".join(cmd)
      stateFnd = False
  
      for i in range(1, maxQueries + 1):
          rh.printSysLog("Invoking: " + strCmd)
          try:
              out = subprocess.check_output(
                  cmd,
                  close_fds=True,
                  stderr=subprocess.STDOUT)
              if isinstance(out, bytes):
                  out = bytes.decode(out)
              if desiredState == 'on':
                  stateFnd = True
                  break
          except CalledProcessError as e:
              match = re.search('(^HCP\w\w\w045E|^HCP\w\w\w361E)', e.output)
              if match:
                  # Logged off
                  if desiredState == 'off':
                      stateFnd = True
                      break
              else:
                  # Abnormal failure
                  out = e.output
                  rh.printLn("ES", msgs.msg['0415'][1] % (modId, strCmd,
                      e.returncode, out))
                  results = msgs.msg['0415'][0]
                  results['rs'] = e.returncode
                  break
          except Exception as e:
              # All other exceptions.
              rh.printLn("ES", msgs.msg['0421'][1] % (modId, strCmd,
                  type(e).__name__, str(e)))
              results = msgs.msg['0421'][0]
  
          if i < maxQueries:
              # Sleep a bit before looping.
              time.sleep(sleepSecs)
  
      if stateFnd is True:
          results = {
                  'overallRC': 0,
                  'rc': 0,
                  'rs': 0,
              }
      else:
          maxWait = maxQueries * sleepSecs
          rh.printLn("ES", msgs.msg['0414'][1] % (modId, userid,
              desiredState, maxWait))
          results = msgs.msg['0414'][0]
  
      rh.printSysLog("Exit vmUtils.waitForVMState, rc: " +
          str(results['overallRC']))
      return results