code: func (r *realisClient) DrainHosts(hosts ...string) (*aurora.Response, *aurora.DrainHostsResult_, error) {
  
  	var result *aurora.DrainHostsResult_
  
  	if len(hosts) == 0 {
  		return nil, nil, errors.New("no hosts provided to drain")
  	}
  
  	drainList := aurora.NewHosts()
  	drainList.HostNames = hosts
  
  	r.logger.DebugPrintf("DrainHosts Thrift Payload: %v\n", drainList)
  
  	resp, retryErr := r.thriftCallWithRetries(func() (*aurora.Response, error) {
  		return r.adminClient.DrainHosts(nil, drainList)
  	})
  
  	if retryErr != nil {
  		return resp, result, errors.Wrap(retryErr, "Unable to recover connection")
  	}
  
  	if resp.GetResult_() != nil {
  		result = resp.GetResult_().GetDrainHostsResult_()
  	}
  
  	return resp, result, nil
  }
docs: /* Admin functions */
  // TODO(rdelvalle): Consider moving these functions to another interface. It would be a backwards incompatible change,
  // but would add safety.
  // Set a list of nodes to DRAINING. This means nothing will be able to be scheduled on them and any existing
  // tasks will be killed and re-scheduled elsewhere in the cluster. Tasks from DRAINING nodes are not guaranteed
  // to return to running unless there is enough capacity in the cluster to run them.