Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ require (
github.com/apex/log v1.1.1
github.com/evanphx/json-patch v4.5.0+incompatible // indirect
github.com/gogo/protobuf v1.2.1 // indirect
github.com/golang-jwt/jwt v3.2.0 // indirect
github.com/google/gofuzz v1.0.0 // indirect
github.com/googleapis/gnostic v0.2.0 // indirect
github.com/json-iterator/go v1.1.6 // indirect
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nA
github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I=
github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE=
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
Expand Down
34 changes: 23 additions & 11 deletions handlers/jobs.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,12 +58,19 @@ func getJobClient() batchtypev1.JobInterface {
return jobClient
}

func getJobByID(jobid string) (*batchv1.Job, error) {
func getJobByID(jobid string, email string) (*batchv1.Job, error) {
log.WithField("jobid", jobid).Debug("Get Job By ID")

jc := getJobClient()

jobs, err := jc.List(metav1.ListOptions{LabelSelector: "app=sowerjob"})
labelSelector := ""
if email == "" { // this is needed for StartMonitoringProcess function only
labelSelector = fmt.Sprintf("app=%s", "sowerjob")
} else {
labelSelector = fmt.Sprintf("app=%s,email=%s", "sowerjob", email)
}

jobs, err := jc.List(metav1.ListOptions{LabelSelector: labelSelector})
if err != nil {
return nil, err
}
Expand All @@ -75,21 +82,23 @@ func getJobByID(jobid string) (*batchv1.Job, error) {
return nil, fmt.Errorf("job with jobid %s not found", jobid)
}

func getJobStatusByID(jobid string) (*JobInfo, error) {
func getJobStatusByID(jobid string, email string) (*JobInfo, error) {
log.WithField("jobid", jobid).Debug("Get Job Status By ID")

job, err := getJobByID(jobid)
job, err := getJobByID(jobid, email)
if err != nil {
return nil, err
}
ji := JobInfo{Name: job.Name, UID: string(job.GetUID()), Status: jobStatusToString(&job.Status)}
return &ji, nil
}

func listJobs(jc batchtypev1.JobInterface) []JobInfo {
func listJobs(jc batchtypev1.JobInterface, email string) []JobInfo {
jobs := []JobInfo{}

jobsList, err := jc.List(metav1.ListOptions{LabelSelector: "app=sowerjob"})
labelSelector := fmt.Sprintf("app=%s,email=%s", "sowerjob", email)

jobsList, err := jc.List(metav1.ListOptions{LabelSelector: labelSelector})
if err != nil {
return jobs
}
Expand Down Expand Up @@ -121,7 +130,7 @@ func jobStatusToString(status *batchv1.JobStatus) string {
return "Unknown"
}

func createK8sJob(currentAction string, inputData string, accessFormat string, accessToken string, userName string) (*JobInfo, error) {
func createK8sJob(currentAction string, inputData string, accessFormat string, accessToken string, userName string, email string) (*JobInfo, error) {
var availableActions = loadSowerConfigs("/sower_config.json")
var getCurrentAction = func(s SowerConfig) bool { return s.Action == currentAction }
var actions = filter(availableActions, getCurrentAction)
Expand All @@ -146,6 +155,8 @@ func createK8sJob(currentAction string, inputData string, accessFormat string, a
var backoff int32 = 1
labels := make(map[string]string)
labels["app"] = "sowerjob"
labels["email"] = email

annotations := make(map[string]string)
annotations["gen3username"] = userName

Expand All @@ -161,7 +172,7 @@ func createK8sJob(currentAction string, inputData string, accessFormat string, a
Value: accessToken,
},
{
Name: "ACCESS_FORMAT",
Name: "ACCESS_FORMAT",
Value: accessFormat,
},
}
Expand Down Expand Up @@ -243,6 +254,7 @@ func createK8sJob(currentAction string, inputData string, accessFormat string, a

newJob, err := jobsClient.Create(batchJob)
if err != nil {
fmt.Println(err)
return nil, err
}
fmt.Println("New job name: ", newJob.Name)
Expand Down Expand Up @@ -270,8 +282,8 @@ func getPodMatchingJob(jobname string) *k8sv1.Pod {
return nil
}

func getJobLogs(jobid string) (*JobOutput, error) {
job, err := getJobByID(jobid)
func getJobLogs(jobid string, username string) (*JobOutput, error) {
job, err := getJobByID(jobid, username)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -340,7 +352,7 @@ func StartMonitoringProcess() {
}

for _, job := range jobsList.Items {
k8sJob, err := getJobStatusByID(string(job.GetUID()))
k8sJob, err := getJobStatusByID(string(job.GetUID()), "")
if err != nil {
fmt.Println("Can't get job status by UID: ", job.Name, err)
} else {
Expand Down
59 changes: 54 additions & 5 deletions handlers/sower.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"strings"

"github.com/apex/log"
"github.com/golang-jwt/jwt"
)

func RegisterSower() {
Expand Down Expand Up @@ -50,7 +51,7 @@ func dispatch(w http.ResponseWriter, r *http.Request) {

var accessFormat string = "presigned_url"

if inputRequest.Format != ""{
if inputRequest.Format != "" {
accessFormat = inputRequest.Format
}

Expand All @@ -66,7 +67,9 @@ func dispatch(w http.ResponseWriter, r *http.Request) {
accessTokenVal = *accessToken
}

result, err := createK8sJob(currentAction, string(out), accessFormat, accessTokenVal, userName)
email := getEmailFromToken(accessTokenVal)

result, err := createK8sJob(currentAction, string(out), accessFormat, accessTokenVal, userName, email)
if err != nil {
http.Error(w, err.Error(), 500)
return
Expand All @@ -81,9 +84,11 @@ func dispatch(w http.ResponseWriter, r *http.Request) {
}

func status(w http.ResponseWriter, r *http.Request) {
email := ""

UID := r.URL.Query().Get("UID")
if UID != "" {
result, errUID := getJobStatusByID(UID)
result, errUID := getJobStatusByID(UID, email)
if errUID != nil {
http.Error(w, errUID.Error(), 500)
return
Expand All @@ -103,9 +108,18 @@ func status(w http.ResponseWriter, r *http.Request) {
}

func output(w http.ResponseWriter, r *http.Request) {
accessToken := getBearerToken(r)

accessTokenVal := ""
if accessToken != nil {
accessTokenVal = *accessToken
}

email := getEmailFromToken(accessTokenVal)

UID := r.URL.Query().Get("UID")
if UID != "" {
result, errUID := getJobLogs(UID)
result, errUID := getJobLogs(UID, email)
if errUID != nil {
http.Error(w, errUID.Error(), 500)
return
Expand Down Expand Up @@ -145,7 +159,16 @@ func output(w http.ResponseWriter, r *http.Request) {
}

func list(w http.ResponseWriter, r *http.Request) {
result := listJobs(getJobClient())
accessToken := getBearerToken(r)

accessTokenVal := ""
if accessToken != nil {
accessTokenVal = *accessToken
}

email := getEmailFromToken(accessTokenVal)

result := listJobs(getJobClient(), email)

out, err := json.Marshal(result)
if err != nil {
Expand All @@ -168,3 +191,29 @@ func getBearerToken(r *http.Request) *string {
}
return nil
}

func getEmailFromToken(accessTokenVal string) string {
var hmacSampleSecret []byte
token, err := jwt.Parse(accessTokenVal, func(token *jwt.Token) (interface{}, error) {
// Don't forget to validate the alg is what you expect:
if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok {
return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
}

// hmacSampleSecret is a []byte containing your secret, e.g. []byte("my_secret_key")
return hmacSampleSecret, nil
})

email := "bad email"
// the check should be
// ok && token.Valid
if claims, ok := token.Claims.(jwt.MapClaims); ok {
fmt.Println(claims["context"])
context := claims["context"].(map[string]interface{})
user := context["user"].(map[string]interface{})
email = user["name"].(string)
} else {
fmt.Println(err)
}
return strings.ReplaceAll(email, "@", "_")
}