Add runner query api

This commit is contained in:
2023-02-24 22:28:07 -07:00
parent 620c20f717
commit 62b4e8f17e
4 changed files with 148 additions and 5 deletions
+63
View File
@@ -14,6 +14,43 @@ import (
var log = logging.MustGetLogger("cursorius-server") var log = logging.MustGetLogger("cursorius-server")
func createSchema(db database.Database) (graphql.Schema, error) { func createSchema(db database.Database) (graphql.Schema, error) {
runnerType := graphql.NewObject(graphql.ObjectConfig{
Name: "Runner",
Description: "A runner available for use inside of a pipeline.",
Fields: graphql.Fields{
"id": &graphql.Field{
Type: graphql.NewNonNull(graphql.String),
Description: "The id of the runner.",
Resolve: func(p graphql.ResolveParams) (interface{}, error) {
if runner, ok := p.Source.(database.Runner); ok {
return runner.Id, nil
}
return nil, nil
},
},
"name": &graphql.Field{
Type: graphql.NewNonNull(graphql.String),
Description: "The name of the runner.",
Resolve: func(p graphql.ResolveParams) (interface{}, error) {
if runner, ok := p.Source.(database.Runner); ok {
return runner.Name, nil
}
return nil, nil
},
},
"token": &graphql.Field{
Type: graphql.NewNonNull(graphql.String),
Description: "The token.",
Resolve: func(p graphql.ResolveParams) (interface{}, error) {
if runner, ok := p.Source.(database.Runner); ok {
return runner.Token, nil
}
return nil, nil
},
},
},
})
secretType := graphql.NewObject(graphql.ObjectConfig{ secretType := graphql.NewObject(graphql.ObjectConfig{
Name: "Secret", Name: "Secret",
Description: "A secret available for use inside of a pipeline.", Description: "A secret available for use inside of a pipeline.",
@@ -348,6 +385,13 @@ func createSchema(db database.Database) (graphql.Schema, error) {
return db.GetSecrets() return db.GetSecrets()
}, },
}, },
"Runners": &graphql.Field{
Type: graphql.NewNonNull(graphql.NewList(runnerType)),
Args: graphql.FieldConfigArgument{},
Resolve: func(p graphql.ResolveParams) (interface{}, error) {
return db.GetRunners()
},
},
}, },
}) })
@@ -485,6 +529,25 @@ func createSchema(db database.Database) (graphql.Schema, error) {
return secret, nil return secret, nil
}, },
}, },
"createRunner": &graphql.Field{
Type: runnerType,
Description: "Create a new runner",
Args: graphql.FieldConfigArgument{
"name": &graphql.ArgumentConfig{
Type: graphql.NewNonNull(graphql.String),
},
},
Resolve: func(params graphql.ResolveParams) (interface{}, error) {
runner, err := db.CreateRunner(
params.Args["name"].(string),
)
if err != nil {
return nil, err
}
return runner, nil
},
},
"setPipelineCloneCredential": &graphql.Field{ "setPipelineCloneCredential": &graphql.Field{
Type: pipelineType, Type: pipelineType,
Description: "Set the CloneCredential used by a pipeline to clone the source repo", Description: "Set the CloneCredential used by a pipeline to clone the source repo",
+2 -2
View File
@@ -175,8 +175,8 @@ CREATE TABLE command_executions (
CREATE TABLE runners ( CREATE TABLE runners (
id UUID PRIMARY KEY, id UUID PRIMARY KEY,
name TEXT, name TEXT NOT NULL UNIQUE,
secret TEXT token TEXT NOT NULL
); );
CREATE TABLE pipeline_refs ( CREATE TABLE pipeline_refs (
+80
View File
@@ -531,3 +531,83 @@ WHERE
return secrets, nil return secrets, nil
} }
func (db *Database) GetRunners() ([]Runner, error) {
query := `
SELECT id, name, token
FROM runners;`
runners := make([]Runner, 0)
rows, err := db.Conn.Query(context.Background(), query)
if err != nil {
return runners, fmt.Errorf("Could not query database for runners: %w", err)
}
defer rows.Close()
for rows.Next() {
var runner Runner
var idStr string
if err := rows.Scan(&idStr, &runner.Name, &runner.Token); err != nil {
return runners, err
}
runner.Id, err = uuid.Parse(idStr)
if err != nil {
return runners, err
}
runners = append(runners, runner)
}
return runners, nil
}
func (db *Database) GetRunnerById(id uuid.UUID) (Runner, error) {
query := `
SELECT name, token
FROM runners
WHERE id=$1;`
runner := Runner{
Id: id,
}
err := db.Conn.QueryRow(context.Background(), query, id).Scan(nil, &runner.Name, &runner.Token)
if err != nil {
return runner, fmt.Errorf("Could not query database for runner with id %v: %w", id.String(), err)
}
return runner, nil
}
func (db *Database) CreateRunner(name string) (Runner, error) {
s := Runner{}
// validate that the runner name is only A-Z or underscores and less than 256 characters
if len(name) > 256 {
return s, fmt.Errorf("runner name must be 256 characters or less")
}
validName := regexp.MustCompile(`[A-Z0-9_]+$`)
if !validName.MatchString(name) {
return s, fmt.Errorf("secren name must be made up of only uppercase letters, numbers, and underscores")
}
query := `
INSERT INTO runners (id, name, token)
VALUES (uuid_generate_v4(), $1, TODO_GENERATE_STRING)
RETURNING id, name, token;`
var idStr string
err := db.Conn.QueryRow(context.Background(), query, name).Scan(&idStr, &s.Name, &s.Token)
if err != nil {
return s, fmt.Errorf("Could not create runner: %w", err)
}
s.Id, err = uuid.Parse(idStr)
if err != nil {
return s, fmt.Errorf("Could not parse UUID generated by DB: %w", err)
}
return s, nil
}
+3 -3
View File
@@ -74,7 +74,7 @@ type CommandExecution struct {
} }
type Runner struct { type Runner struct {
Id uuid.UUID Id uuid.UUID
Name string Name string
Secret string Token string
} }