From 8bd3957247a3749ead9555a7af904c11fd38498d Mon Sep 17 00:00:00 2001
From: kkrishna <kumar.krishna@gmail.com>
Date: Sat, 27 Jan 2018 10:33:55 -0800
Subject: [PATCH] GetJobs api (#53)

* GetJobs API added
---
 examples/client.go | 14 +++++++++++++-
 realis.go          | 31 +++++++++++++++++++++++++++++++
 realis_e2e_test.go | 11 +++++++++--
 3 files changed, 53 insertions(+), 3 deletions(-)

diff --git a/examples/client.go b/examples/client.go
index 9c2e1b8..8160678 100644
--- a/examples/client.go
+++ b/examples/client.go
@@ -31,7 +31,7 @@ import (
 	"github.com/paypal/gorealis/response"
 )
 
-var cmd, executor, url, clustersConfig, clusterName, updateId, username, password, zkUrl, hostList string
+var cmd, executor, url, clustersConfig, clusterName, updateId, username, password, zkUrl, hostList, role string
 
 var CONNECTION_TIMEOUT = 20000
 
@@ -46,6 +46,8 @@ func init() {
 	flag.StringVar(&password, "password", "secret", "Password to use for authorization")
 	flag.StringVar(&zkUrl, "zkurl", "", "zookeeper url")
 	flag.StringVar(&hostList, "hostList", "", "Comma separated list of hosts to operate on")
+	flag.StringVar(&role, "role", "", "owner role to use")
+
 	flag.Parse()
 
 	// Attempt to load leader from zookeeper using a
@@ -593,6 +595,16 @@ func main() {
 		}
 
 		fmt.Print(result.String())
+	case "getJobs":
+		fmt.Println("GetJobs...role: ", role)
+		_, result, err := r.GetJobs(role)
+		if err != nil {
+			fmt.Print("error: %+v\n", err.Error())
+			os.Exit(1)
+		}
+		fmt.Println("map size: ", len(result.Configs))
+		fmt.Println(result.String())
+
 	default:
 		fmt.Println("Command not supported")
 		os.Exit(1)
diff --git a/realis.go b/realis.go
index 7caa3a4..03554aa 100644
--- a/realis.go
+++ b/realis.go
@@ -47,6 +47,7 @@ type Realis interface {
 	GetJobUpdateSummaries(jobUpdateQuery *aurora.JobUpdateQuery) (*aurora.Response, error)
 	GetTaskStatus(query *aurora.TaskQuery) ([]*aurora.ScheduledTask, error)
 	GetTasksWithoutConfigs(query *aurora.TaskQuery) ([]*aurora.ScheduledTask, error)
+	GetJobs(role string) (*aurora.Response, *aurora.GetJobsResult_, error)
 	JobUpdateDetails(updateQuery aurora.JobUpdateQuery) (*aurora.Response, error)
 	KillJob(key *aurora.JobKey) (*aurora.Response, error)
 	KillInstances(key *aurora.JobKey, instances ...int32) (*aurora.Response, error)
@@ -548,6 +549,33 @@ func (r *realisClient) GetJobUpdateSummaries(jobUpdateQuery *aurora.JobUpdateQue
 	return resp, nil
 }
 
+func (r *realisClient)	GetJobs(role string) (*aurora.Response, *aurora.GetJobsResult_, error) {
+	var resp *aurora.Response
+	var result *aurora.GetJobsResult_
+	var clientErr error
+
+	retryErr := ExponentialBackoff(*r.config.backoff, func() (bool, error) {
+		resp, clientErr = r.thriftCallHelper(func() (*aurora.Response, error) {
+			return r.readonlyClient.GetJobs(role)
+		})
+
+		if clientErr != nil {
+			return false, clientErr
+		}
+		return true, nil
+	})
+
+	if resp != nil && resp.GetResult_() != nil {
+		result = resp.GetResult_().GetJobsResult_
+	}
+
+	if retryErr != nil {
+		return nil, result, errors.Wrap(clientErr, retryErr.Error()+": Error getting Jobs from Aurora Scheduler")
+	}
+
+	return resp, result, nil
+}
+
 // Kill specific instances of a job.
 func (r *realisClient) KillInstances(key *aurora.JobKey, instances ...int32) (*aurora.Response, error) {
 
@@ -696,6 +724,9 @@ func (r *realisClient) DescheduleCronJob(key *aurora.JobKey) (*aurora.Response,
 
 }
 
+
+
+
 func (r *realisClient) StartCronJob(key *aurora.JobKey) (*aurora.Response, error) {
 	var resp *aurora.Response
 	var clientErr error
diff --git a/realis_e2e_test.go b/realis_e2e_test.go
index d278ffc..1538886 100644
--- a/realis_e2e_test.go
+++ b/realis_e2e_test.go
@@ -83,9 +83,10 @@ func TestGetCACerts(t *testing.T) {
 
 func TestRealisClient_CreateJob_Thermos(t *testing.T) {
 
+	role := "vagrant"
 	job := realis.NewJob().
 		Environment("prod").
-		Role("vagrant").
+		Role(role).
 		Name("create_thermos_job_test").
 		ExecutorName(aurora.AURORA_EXECUTOR_NAME).
 		ExecutorData(string(thermosPayload)).
@@ -109,7 +110,13 @@ func TestRealisClient_CreateJob_Thermos(t *testing.T) {
 	assert.True(t, success)
 	assert.NoError(t, err)
 
-	// Tasks must exist for it to be killed
+	//Fetch all obs
+	_, result, err := r.GetJobs(role)
+	fmt.Printf("GetJobs length: %+v \n", len(result.Configs))
+	assert.Equal(t, len(result.Configs), 1)
+	assert.NoError(t, err)
+
+	// Tasks must exist for it to, be killed
 	t.Run("TestRealisClient_KillJob_Thermos", func(t *testing.T) {
 		start := time.Now()
 		resp, err := r.KillJob(job.JobKey())