From 99ea6aa0946a5e6c5e1c2893d4f4f38b7c1e6a1c Mon Sep 17 00:00:00 2001
From: Renan DelValle <rdelval@users.noreply.github.com>
Date: Mon, 24 Jul 2017 15:45:24 -0700
Subject: [PATCH] Adding API call to get tasks without a fully hydrated object
 which results in less overhead

---
 examples/client.go | 14 ++++++++++++++
 realis.go          | 38 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 52 insertions(+)

diff --git a/examples/client.go b/examples/client.go
index 7cdfc82..53b6d1e 100644
--- a/examples/client.go
+++ b/examples/client.go
@@ -468,6 +468,20 @@ func main() {
 		fmt.Printf("length: %d\n ", len(tasks))
 		fmt.Printf("tasks: %+v\n", tasks)
 
+	case "tasksWithoutConfig":
+		fmt.Println("Getting task status")
+		taskQ := &aurora.TaskQuery{Role: job.JobKey().Role,
+			Environment: job.JobKey().Environment,
+			JobName:     job.JobKey().Name,
+		}
+		tasks, err := r.GetTasksWithoutConfigs(taskQ)
+		if err != nil {
+			fmt.Printf("error: %+v\n ", err)
+			os.Exit(1)
+		}
+		fmt.Printf("length: %d\n ", len(tasks))
+		fmt.Printf("tasks: %+v\n", tasks)
+
 	default:
 		fmt.Println("Command not supported")
 		os.Exit(1)
diff --git a/realis.go b/realis.go
index 1a0944b..dbf205b 100644
--- a/realis.go
+++ b/realis.go
@@ -40,6 +40,7 @@ type Realis interface {
 	CreateJob(auroraJob Job) (*aurora.Response, error)
 	DescheduleCronJob(key *aurora.JobKey) (*aurora.Response, error)
 	GetTaskStatus(query *aurora.TaskQuery) ([]*aurora.ScheduledTask, error)
+	GetTasksWithoutConfigs(query *aurora.TaskQuery) ([]*aurora.ScheduledTask, error)
 	FetchTaskConfig(instKey aurora.InstanceKey) (*aurora.TaskConfig, error)
 	GetInstanceIds(key *aurora.JobKey, states map[aurora.ScheduleStatus]bool) (map[int32]bool, error)
 	JobUpdateDetails(updateQuery aurora.JobUpdateQuery) (*aurora.Response, error)
@@ -957,6 +958,7 @@ func (r *realisClient) RemoveInstances(key *aurora.JobKey, count int32) (*aurora
 	return r.KillInstances(key, instanceList...)
 }
 
+// Get information about task including a fully hydrated task configuration object
 func (r *realisClient) GetTaskStatus(query *aurora.TaskQuery) (tasks []*aurora.ScheduledTask, e error) {
 
 	var resp *aurora.Response
@@ -993,6 +995,42 @@ func (r *realisClient) GetTaskStatus(query *aurora.TaskQuery) (tasks []*aurora.S
 	return response.ScheduleStatusResult(resp).GetTasks(), nil
 }
 
+// Get information about task including without a task configuration object
+func (r *realisClient) GetTasksWithoutConfigs(query *aurora.TaskQuery) (tasks []*aurora.ScheduledTask, e error) {
+	var resp *aurora.Response
+	var err error
+	defaultBackoff := r.config.backoff
+	duration := defaultBackoff.Duration
+	for i := 0; i < defaultBackoff.Steps; i++ {
+		if i != 0 {
+			adjusted := duration
+			if defaultBackoff.Jitter > 0.0 {
+				adjusted = Jitter(duration, defaultBackoff.Jitter)
+			}
+			fmt.Println(" sleeping for: ", adjusted)
+			time.Sleep(adjusted)
+			duration = time.Duration(float64(duration) * defaultBackoff.Factor)
+		}
+		if resp, err = r.client.GetTasksWithoutConfigs(query); err == nil {
+			break
+		}
+		err1 := r.ReestablishConn()
+		if err1 != nil {
+			fmt.Println("error in ReestablishConn: ", err1)
+		}
+	}
+
+	if err != nil {
+		return nil, errors.Wrap(err, "Error querying Aurora Scheduler for task status without configs")
+	}
+	//Check for response code..
+	if resp.GetResponseCode() != aurora.ResponseCode_OK {
+		return nil, errors.New(resp.ResponseCode.String() + "--" + response.CombineMessage(resp))
+	}
+
+	return response.ScheduleStatusResult(resp).GetTasks(), nil
+}
+
 func (r *realisClient) FetchTaskConfig(instKey aurora.InstanceKey) (*aurora.TaskConfig, error) {
 
 	ids := make(map[int32]bool)