Start/restart poll job when created or updated
This currently contains the logic for restarting updated jobs, but nothing exercises this logic. The logic for starting polling for a newly created pipeline is implemented.
This commit is contained in:
+38
-8
@@ -1,17 +1,18 @@
|
||||
package poll
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/op/go-logging"
|
||||
|
||||
"git.ohea.xyz/cursorius/server/config"
|
||||
"git.ohea.xyz/cursorius/server/database"
|
||||
"git.ohea.xyz/cursorius/server/pipeline_executor"
|
||||
|
||||
"github.com/go-git/go-git/v5"
|
||||
"github.com/go-git/go-git/v5/plumbing"
|
||||
"github.com/go-git/go-git/v5/storage/memory"
|
||||
"github.com/google/uuid"
|
||||
"github.com/op/go-logging"
|
||||
)
|
||||
|
||||
var log = logging.MustGetLogger("cursorius-server")
|
||||
@@ -26,13 +27,27 @@ type tag struct {
|
||||
commitHash string
|
||||
}
|
||||
|
||||
func pollJob(pipeline database.Pipeline, pipelineConf config.PipelineConf, db database.Database) {
|
||||
func pollJob(ctx context.Context, pipeline database.Pipeline, pipelineConf config.PipelineConf, db database.Database) {
|
||||
firstScan := true
|
||||
for {
|
||||
// Don't sleep on first scan to ease testing
|
||||
// TODO: this should be replaced with a script that mocks a webhook
|
||||
if !firstScan {
|
||||
time.Sleep(time.Duration(pipeline.PollInterval) * time.Second)
|
||||
|
||||
ctx, cancel := context.WithTimeout(ctx, time.Duration(pipeline.PollInterval)*time.Second)
|
||||
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
switch ctx.Err() {
|
||||
case context.Canceled:
|
||||
log.Infof("Polling for pipeline %v canceled, stopping", pipeline.Name)
|
||||
cancel()
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
cancel()
|
||||
|
||||
log.Infof("Polling repo %v", pipeline.Name)
|
||||
} else {
|
||||
firstScan = false
|
||||
@@ -136,11 +151,17 @@ func launchPollJobs(conf config.PipelineConf, db database.Database, pollChan cha
|
||||
return
|
||||
}
|
||||
|
||||
pipelineCancelations := make(map[uuid.UUID]context.CancelFunc)
|
||||
|
||||
for _, pipeline := range pipelines {
|
||||
if pipeline.PollInterval == 0 {
|
||||
continue
|
||||
} else {
|
||||
go pollJob(pipeline, conf, db)
|
||||
log.Infof("Starting polling for pipeline %v with id %v", pipeline.Name, pipeline.Id)
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
pipelineCancelations[pipeline.Id] = cancel
|
||||
|
||||
go pollJob(ctx, pipeline, conf, db)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -151,8 +172,17 @@ func launchPollJobs(conf config.PipelineConf, db database.Database, pollChan cha
|
||||
log.Errorf("Could not get pipeline with id \"%v\" from database: %v", err)
|
||||
continue
|
||||
}
|
||||
// TODO: stop existing polling process for given uuid
|
||||
go pollJob(pipeline, conf, db)
|
||||
|
||||
// Cancel existing polling job if it exists
|
||||
if cancelFunc, ok := pipelineCancelations[pipeline.Id]; ok {
|
||||
cancelFunc()
|
||||
}
|
||||
|
||||
// Start new polling job
|
||||
log.Infof("Starting polling for pipeline %v with id %v", pipeline.Name, pipeline.Id)
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
pipelineCancelations[pipeline.Id] = cancel
|
||||
go pollJob(ctx, pipeline, conf, db)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user