Files
threshold/internal/scheduler/job/testing.go
T
Louis Ruch 4cacd0a605 bug(scheduler): Fix controller id length check (#2226)
* bug(scheduler): Fix controller id length check

The job_run table has a foreign key to the server_controller private_id.
While this column is called a prviate_id it does not implement the wt_private_id
postgres domain type, and therefore does not have a minimum length of 10 characters.
2022-06-22 13:20:27 -07:00

150 lines
3.3 KiB
Go

package job
import (
"context"
"fmt"
"testing"
"time"
"github.com/hashicorp/boundary/internal/server/store"
"github.com/hashicorp/boundary/internal/db"
"github.com/hashicorp/boundary/internal/kms"
"github.com/hashicorp/boundary/internal/server"
wrapping "github.com/hashicorp/go-kms-wrapping/v2"
"github.com/hashicorp/go-uuid"
"github.com/stretchr/testify/require"
)
func testJob(t testing.TB, conn *db.DB, name, description string, wrapper wrapping.Wrapper, opt ...Option) *Job {
t.Helper()
require := require.New(t)
rw := db.New(conn)
kms := kms.TestKms(t, conn, wrapper)
repo, err := NewRepository(rw, rw, kms)
require.NoError(err)
job, err := repo.UpsertJob(context.Background(), name, description, opt...)
require.NoError(err)
require.NotNil(job)
return job
}
func testRun(conn *db.DB, pluginId, name, cId string) (*Run, error) {
query := `
insert into job_run (
job_plugin_id, job_name, controller_id
)
values (?,?,?)
on conflict (job_plugin_id, job_name) where status = 'running'
do nothing
returning *;
`
rw := db.New(conn)
run := allocRun()
ctx := context.Background()
rows, err := rw.Query(ctx, query, []interface{}{pluginId, name, cId})
if err != nil {
return nil, err
}
if !rows.Next() {
return nil, nil
}
err = rw.ScanRows(ctx, rows, run)
if err != nil {
return nil, err
}
_ = rows.Close()
return run, nil
}
func testRunWithUpdateTime(conn *db.DB, pluginId, name, cId string, updateTime time.Time) (*Run, error) {
query := `
insert into job_run (
job_plugin_id, job_name, controller_id, update_time
)
values (?,?,?,?)
returning *;
`
rw := db.New(conn)
run := allocRun()
ctx := context.Background()
rows, err := rw.Query(ctx, query, []interface{}{pluginId, name, cId, updateTime})
if err != nil {
return nil, err
}
if !rows.Next() {
return nil, fmt.Errorf("expected to rows")
}
err = rw.ScanRows(ctx, rows, run)
if err != nil {
return nil, err
}
_ = rows.Close()
return run, nil
}
func testController(t *testing.T, conn *db.DB, wrapper wrapping.Wrapper, opt ...testOption) *store.Controller {
t.Helper()
rw := db.New(conn)
kms := kms.TestKms(t, conn, wrapper)
serversRepo, err := server.NewRepository(rw, rw, kms)
require.NoError(t, err)
opts := getTestOpts(t, opt...)
privateId := opts.controllerId
if privateId == "" {
// generate a unique ID for the test
id, err := uuid.GenerateUUID()
require.NoError(t, err)
privateId = "test-job-server-" + id
}
controller := &store.Controller{
PrivateId: privateId,
Address: "127.0.0.1",
}
_, err = serversRepo.UpsertController(context.Background(), controller)
require.NoError(t, err)
return controller
}
func getTestOpts(t testing.TB, opt ...testOption) testOptions {
t.Helper()
opts := getDefaultTestOptions(t)
for _, o := range opt {
o(t, &opts)
}
return opts
}
// testOption - how Options are passed as arguments.
type testOption func(testing.TB, *testOptions)
// options = how options are represented
type testOptions struct {
controllerId string
}
func getDefaultTestOptions(t testing.TB) testOptions {
t.Helper()
return testOptions{
controllerId: "",
}
}
// withControllerId sets the controller id
func withControllerId(p string) testOption {
return func(t testing.TB, o *testOptions) {
t.Helper()
o.controllerId = p
}
}