Started reimplementing scheduler

This commit is contained in:
frikky
2020-05-19 19:32:18 +02:00
parent 5863705d9a
commit ee85e7f267
5 changed files with 85 additions and 47 deletions
+1
View File
@@ -8,6 +8,7 @@ require (
cloud.google.com/go/pubsub v1.3.1 cloud.google.com/go/pubsub v1.3.1
cloud.google.com/go/storage v1.7.0 cloud.google.com/go/storage v1.7.0
github.com/basgys/goxml2json v1.1.0 github.com/basgys/goxml2json v1.1.0
github.com/carlescere/scheduler v0.0.0-20170109141437-ee74d2f83d82 // indirect
github.com/docker/distribution v2.7.1+incompatible // indirect github.com/docker/distribution v2.7.1+incompatible // indirect
github.com/docker/docker v1.13.1 github.com/docker/docker v1.13.1
github.com/docker/go-connections v0.4.0 github.com/docker/go-connections v0.4.0
+2
View File
@@ -38,6 +38,8 @@ github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYU
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/basgys/goxml2json v1.1.0 h1:4ln5i4rseYfXNd86lGEB+Vi652IsIXIvggKM/BhUKVw= github.com/basgys/goxml2json v1.1.0 h1:4ln5i4rseYfXNd86lGEB+Vi652IsIXIvggKM/BhUKVw=
github.com/basgys/goxml2json v1.1.0/go.mod h1:wH7a5Np/Q4QoECFIU8zTQlZwZkrilY0itPfecMw41Dw= github.com/basgys/goxml2json v1.1.0/go.mod h1:wH7a5Np/Q4QoECFIU8zTQlZwZkrilY0itPfecMw41Dw=
github.com/carlescere/scheduler v0.0.0-20170109141437-ee74d2f83d82 h1:9bAydALqAjBfPHd/eAiJBHnMZUYov8m2PkXVr+YGQeI=
github.com/carlescere/scheduler v0.0.0-20170109141437-ee74d2f83d82/go.mod h1:tyA14J0sA3Hph4dt+AfCjPrYR13+vVodshQSM7km9qw=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
+64 -37
View File
@@ -28,6 +28,8 @@ import (
"github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/storage/memory" "github.com/go-git/go-git/v5/storage/memory"
newscheduler "github.com/carlescere/scheduler"
//"github.com/gorilla/websocket" //"github.com/gorilla/websocket"
//"google.golang.org/appengine" //"google.golang.org/appengine"
//"google.golang.org/appengine/memcache" //"google.golang.org/appengine/memcache"
@@ -54,6 +56,17 @@ var shuffleTestPath = "./shuffle-test-258209-5a2e8d7e508a.json"
// }, // },
//} //}
type ExecutionRequest struct {
ExecutionId string `json:"execution_id"`
ExecutionArgument string `json:"execution_argument"`
WorkflowId string `json:"workflow_id"`
Environments []string `json:"environments"`
Authorization string `json:"authorization"`
Status string `json:"status"`
Start string `json:"start"`
Type string `json:"type"`
}
type Org struct { type Org struct {
Name string `json:"name"` Name string `json:"name"`
Org string `json:"org"` Org string `json:"org"`
@@ -371,14 +384,7 @@ func getWorkflowQueue(ctx context.Context, id string) (ExecutionRequestWrapper,
// Frequency = cronjob OR minutes between execution // Frequency = cronjob OR minutes between execution
func createSchedule(ctx context.Context, scheduleId, workflowId, name, frequency string, body []byte) error { func createSchedule(ctx context.Context, scheduleId, workflowId, name, frequency string, body []byte) error {
c, err := scheduler.NewCloudSchedulerClient(ctx)
if err != nil {
log.Printf("%s", err)
return err
}
testSplit := strings.Split(frequency, "*") testSplit := strings.Split(frequency, "*")
log.Println(len(testSplit))
cronJob := "" cronJob := ""
if len(testSplit) > 5 { if len(testSplit) > 5 {
cronJob = frequency cronJob = frequency
@@ -400,31 +406,61 @@ func createSchedule(ctx context.Context, scheduleId, workflowId, name, frequency
return errors.New("cronJob isn't formatted correctly") return errors.New("cronJob isn't formatted correctly")
} }
req := &schedulerpb.CreateJobRequest{ log.Printf("CRON: %s, body: %s", cronJob, string(body))
Parent: fmt.Sprintf("projects/%s/locations/europe-west2", gceProject),
Job: &schedulerpb.Job{ // FIXME:
Name: fmt.Sprintf("projects/%s/locations/europe-west2/jobs/schedule_%s", gceProject, scheduleId), // This may run multiple places if multiple servers,
Schedule: cronJob, // but that's a future problem
Description: name, job := func() {
Target: &schedulerpb.Job_HttpTarget{ request := &http.Request{
HttpTarget: &schedulerpb.HttpTarget{ Method: "POST",
Uri: fmt.Sprintf("https://shuffler.io/api/v1/workflows/%s/execute", workflowId), Body: ioutil.NopCloser(strings.NewReader(string(body))),
HttpMethod: 1,
Headers: map[string]string{
"Authorization": "",
},
Body: body,
},
},
},
// TODO: Fill request struct fields.
} }
resp, err := c.CreateJob(ctx, req)
_, _, err := handleExecution(workflowId, Workflow{}, request)
if err == nil {
log.Printf("Failed to execute: %s", err)
}
}
// FIXME - Create a real schedule based on cron:
// 1. Parse the cron in a function to match this schedule
// 2. Make main init check for schedules that aren't running
_, err := newscheduler.Every(5).Seconds().NotImmediately().Run(job)
if err != nil { if err != nil {
log.Printf("%s", err) log.Printf("Failed to schedule workflow: %s", err)
return err return err
} }
_ = resp
return errors.New("ERROR!!")
//log.Printf("REQUEST: %#v", executionRequest)
//req := &schedulerpb.CreateJobRequest{
// Parent: fmt.Sprintf("projects/%s/locations/europe-west2", gceProject),
// Job: &schedulerpb.Job{
// Name: fmt.Sprintf("projects/%s/locations/europe-west2/jobs/schedule_%s", gceProject, scheduleId),
// Schedule: cronJob,
// Description: name,
// Target: &schedulerpb.Job_HttpTarget{
// HttpTarget: &schedulerpb.HttpTarget{
// Uri: fmt.Sprintf("https://shuffler.io/api/v1/workflows/%s/execute", workflowId),
// HttpMethod: 1,
// Headers: map[string]string{
// "Authorization": "",
// },
// Body: body,
// },
// },
// },
// // TODO: Fill request struct fields.
//}
//resp, err := c.CreateJob(ctx, req)
//if err != nil {
// log.Printf("%s", err)
// return err
//}
//_ = resp
return nil return nil
} }
@@ -1443,15 +1479,6 @@ func getWorkflowLocal(fileId string, request *http.Request) ([]byte, error) {
return body, nil return body, nil
} }
type ExecutionRequest struct {
ExecutionId string `json:"execution_id"`
ExecutionArgument string `json:"execution_argument"`
WorkflowId string `json:"workflow_id"`
Authorization string `json:"authorization"`
Environments []string `json:"environments"`
Start string `json:"start"`
}
func abortExecution(resp http.ResponseWriter, request *http.Request) { func abortExecution(resp http.ResponseWriter, request *http.Request) {
cors := handleCors(resp, request) cors := handleCors(resp, request)
if cors { if cors {
File diff suppressed because one or more lines are too long
+12 -4
View File
@@ -37,11 +37,11 @@ type ExecutionRequestWrapper struct {
type ExecutionRequest struct { type ExecutionRequest struct {
ExecutionId string `json:"execution_id"` ExecutionId string `json:"execution_id"`
ExecutionArgument string `json:"execution_argument"`
WorkflowId string `json:"workflow_id"` WorkflowId string `json:"workflow_id"`
Authorization string `json:"authorization"` Authorization string `json:"authorization"`
ExecutionArgument string `json:"execution_argument"`
Environments []string `json:"environments"`
Status string `json:"status"` Status string `json:"status"`
Type string `json:"type"`
} }
// Deploys the internal worker whenever something happens // Deploys the internal worker whenever something happens
@@ -207,6 +207,7 @@ func main() {
time.Sleep(time.Duration(sleepTime) * time.Second) time.Sleep(time.Duration(sleepTime) * time.Second)
continue continue
} }
// FIXME - add check for StatusCode // FIXME - add check for StatusCode
if newresp.StatusCode != 200 { if newresp.StatusCode != 200 {
if hasStarted { if hasStarted {
@@ -243,7 +244,8 @@ func main() {
} }
if hasStarted && len(executionRequests.Data) > 0 { if hasStarted && len(executionRequests.Data) > 0 {
log.Println(string(body)) log.Printf("Body: %s", string(body))
// Type string `json:"type"`
} }
if len(executionRequests.Data) == 0 { if len(executionRequests.Data) == 0 {
@@ -259,7 +261,13 @@ func main() {
// New, abortable version. Should check executionid and remove everything else // New, abortable version. Should check executionid and remove everything else
var toBeRemoved ExecutionRequestWrapper var toBeRemoved ExecutionRequestWrapper
for _, execution := range executionRequests.Data { for _, execution := range executionRequests.Data {
log.Println(execution.ExecutionArgument) log.Printf("Argument: %#v", execution.ExecutionArgument)
if execution.Type == "schedule" {
log.Printf("SOMETHING ELSE :O: %s", execution.Type)
continue
}
if execution.Status == "ABORT" || execution.Status == "FAILED" { if execution.Status == "ABORT" || execution.Status == "FAILED" {
log.Printf("Executionstatus issue: ", execution.Status) log.Printf("Executionstatus issue: ", execution.Status)
} }