diff --git a/admin_api/admin_api.go b/admin_api/admin_api.go index ad294da..d0d8fa0 100644 --- a/admin_api/admin_api.go +++ b/admin_api/admin_api.go @@ -560,6 +560,72 @@ func createSchema(db database.Database, pollChan chan uuid.UUID) (graphql.Schema return runner, nil }, }, + "updatePipeline": &graphql.Field{ + Type: pipelineType, + Description: "Create a new pipeline", + Args: graphql.FieldConfigArgument{ + "pipelineId": &graphql.ArgumentConfig{ + Type: graphql.NewNonNull(graphql.String), + }, + "name": &graphql.ArgumentConfig{ + Type: graphql.String, + }, + "url": &graphql.ArgumentConfig{ + Type: graphql.String, + }, + "pollInterval": &graphql.ArgumentConfig{ + Type: graphql.Int, + }, + "cloneCredentialId": &graphql.ArgumentConfig{ + Type: graphql.String, + }, + }, + Resolve: func(params graphql.ResolveParams) (interface{}, error) { + pipelineId, err := uuid.Parse(params.Args["pipelineId"].(string)) + if err != nil { + return nil, err + } + + var name *string + var url *string + var interval *int + + if nameVal, ok := params.Args["name"]; ok { + nameVal := nameVal.(string) + name = &nameVal + } else { + name = nil + } + + if urlVal, ok := params.Args["url"]; ok { + urlVal := urlVal.(string) + url = &urlVal + } else { + url = nil + } + + if intervalVal, ok := params.Args["pollInterval"]; ok { + intervalVal := intervalVal.(int) + interval = &intervalVal + } else { + interval = nil + } + + pipeline, err := db.UpdatePipeline( + pipelineId, + name, + url, + interval, + ) + if err != nil { + return nil, err + } + + pollChan <- pipeline.Id + + return pipeline, nil + }, + }, "setPipelineCloneCredential": &graphql.Field{ Type: pipelineType, Description: "Set the CloneCredential used by a pipeline to clone the source repo", diff --git a/database/func.go b/database/func.go index b17daef..3cbde6d 100644 --- a/database/func.go +++ b/database/func.go @@ -77,6 +77,49 @@ RETURNING id, name, url, poll_interval;` return pipeline, nil } +func (db *Database) UpdatePipeline(pipelineId uuid.UUID, name *string, url *string, pollInterval *int) (Pipeline, error) { + query := ` +UPDATE pipelines +SET name=$1, url=$2, poll_interval=$3 +WHERE id=$4 +RETURNING name, url, poll_interval, clone_credential;` + + pipeline, err := db.GetPipelineById(pipelineId) + if err != nil { + return pipeline, err + } + + var nameNew string + var urlNew string + var pollIntervalNew int + + if name != nil { + nameNew = *name + } else { + nameNew = pipeline.Name + } + if url != nil { + urlNew = *url + } else { + urlNew = pipeline.Url + } + if pollInterval != nil { + pollIntervalNew = *pollInterval + } else { + pollIntervalNew = pipeline.PollInterval + } + + err = db.Conn.QueryRow(context.Background(), + query, nameNew, urlNew, pollIntervalNew, pipelineId).Scan( + &pipeline.Name, &pipeline.Url, &pipeline.PollInterval, &pipeline.CloneCredential, + ) + if err != nil { + return pipeline, fmt.Errorf("Could not add credential to pipeline: %w", err) + } + + return pipeline, err +} + func (db *Database) SetPipelineCloneCredential(pipelineId uuid.UUID, credentialId *uuid.UUID) (Pipeline, error) { query := ` UPDATE pipelines diff --git a/poll/poll.go b/poll/poll.go index 7d8a28a..5e1f30c 100644 --- a/poll/poll.go +++ b/poll/poll.go @@ -157,10 +157,10 @@ func launchPollJobs(conf config.PipelineConf, db database.Database, pollChan cha if pipeline.PollInterval == 0 { continue } else { - log.Infof("Starting polling for pipeline %v with id %v", pipeline.Name, pipeline.Id) ctx, cancel := context.WithCancel(context.Background()) pipelineCancelations[pipeline.Id] = cancel + log.Infof("Starting polling for pipeline %v with id %v", pipeline.Name, pipeline.Id) go pollJob(ctx, pipeline, conf, db) } }