From eb865f44e7ba59f97259603ac253a8d00f20a982 Mon Sep 17 00:00:00 2001 From: whywaita Date: Thu, 20 Aug 2026 15:31:08 +0900 Subject: [PATCH] Revert "refactor: use Go 1.27 standard library uuid instead of satori/go.uuid (#276)" This reverts commit 4fc84c76d9e1da174065fe43a9135ae9263f9c8b. --- .github/workflows/test.yaml | 2 +- Dockerfile | 2 +- go.mod | 3 +- go.sum | 2 + pkg/datastore/interface.go | 2 +- pkg/datastore/memory/memory.go | 4 +- pkg/datastore/mysql/job.go | 58 ++------------------ pkg/datastore/mysql/job_test.go | 40 ++------------ pkg/datastore/mysql/runner.go | 85 +++++------------------------- pkg/datastore/mysql/runner_test.go | 72 ++++++------------------- pkg/datastore/mysql/target.go | 76 ++++---------------------- pkg/datastore/mysql/target_test.go | 48 +++-------------- pkg/metric/scrape_memory.go | 2 +- pkg/runner/util.go | 4 +- pkg/starter/starter.go | 2 +- pkg/web/target.go | 4 +- pkg/web/target_create.go | 2 +- pkg/web/target_test.go | 2 +- pkg/web/webhook.go | 2 +- 19 files changed, 72 insertions(+), 340 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 422c52d..b0b578f 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -25,7 +25,7 @@ jobs: go-version-file: 'go.mod' - name: lint run: | - go install honnef.co/go/tools/cmd/staticcheck@v0.8.0-rc.1 + go install honnef.co/go/tools/cmd/staticcheck@latest staticcheck ./... - name: vet run: | diff --git a/Dockerfile b/Dockerfile index a70e1ff..b4b9421 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.27 AS builder +FROM golang:1.25 AS builder WORKDIR /go/src/github.com/whywaita/myshoes diff --git a/go.mod b/go.mod index 5d741cd..a9f0674 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/whywaita/myshoes -go 1.27 +go 1.25 require ( github.com/bradleyfalzon/ghinstallation/v2 v2.17.0 @@ -16,6 +16,7 @@ require ( github.com/patrickmn/go-cache v2.1.0+incompatible github.com/prometheus/client_golang v1.23.2 github.com/r3labs/diff/v2 v2.15.1 + github.com/satori/go.uuid v1.2.0 goji.io v2.0.2+incompatible golang.org/x/oauth2 v0.32.0 golang.org/x/sync v0.18.0 diff --git a/go.sum b/go.sum index a71cc14..0ae1540 100644 --- a/go.sum +++ b/go.sum @@ -145,6 +145,8 @@ github.com/r3labs/diff/v2 v2.15.1 h1:EOrVqPUzi+njlumoqJwiS/TgGgmZo83619FNDB9xQUg github.com/r3labs/diff/v2 v2.15.1/go.mod h1:I8noH9Fc2fjSaMxqF3G2lhDdC0b+JXCfyx85tWFM9kc= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/pkg/datastore/interface.go b/pkg/datastore/interface.go index 84843e1..39b0ccc 100644 --- a/pkg/datastore/interface.go +++ b/pkg/datastore/interface.go @@ -9,7 +9,7 @@ import ( "strings" "time" - "uuid" + uuid "github.com/satori/go.uuid" "github.com/whywaita/myshoes/pkg/gh" "github.com/whywaita/myshoes/pkg/logger" diff --git a/pkg/datastore/memory/memory.go b/pkg/datastore/memory/memory.go index 5a4cccf..497d585 100644 --- a/pkg/datastore/memory/memory.go +++ b/pkg/datastore/memory/memory.go @@ -7,7 +7,7 @@ import ( "sync" "time" - "uuid" + uuid "github.com/satori/go.uuid" "github.com/whywaita/myshoes/pkg/datastore" ) @@ -214,7 +214,7 @@ func (m *Memory) ListRunnersByTargetID(ctx context.Context, targetID uuid.UUID) var runners []datastore.Runner for _, r := range m.runners { - if r.TargetID == targetID { + if uuid.Equal(r.TargetID, targetID) { runners = append(runners, r) } } diff --git a/pkg/datastore/mysql/job.go b/pkg/datastore/mysql/job.go index 6b9a966..58d757d 100644 --- a/pkg/datastore/mysql/job.go +++ b/pkg/datastore/mysql/job.go @@ -5,63 +5,15 @@ import ( "database/sql" "errors" "fmt" - "time" + uuid "github.com/satori/go.uuid" "github.com/whywaita/myshoes/pkg/datastore" - "uuid" ) -// rowJob mirrors datastore.Job but stores the UUID columns (uuid, target_id) as -// strings so that database/sql can scan the VARCHAR(36) columns. The standard -// library uuid.UUID is a [16]byte with no sql.Scanner. -type rowJob struct { - UUID string `db:"uuid"` - GHEDomain sql.NullString `db:"ghe_domain"` - Repository string `db:"repository"` - CheckEventJSON string `db:"check_event"` - TargetID string `db:"target_id"` - CreatedAt time.Time `db:"created_at"` - UpdatedAt time.Time `db:"updated_at"` -} - -func (r rowJob) job() (datastore.Job, error) { - u, err := uuid.Parse(r.UUID) - if err != nil { - return datastore.Job{}, fmt.Errorf("failed to parse job uuid %q: %w", r.UUID, err) - } - - tid, err := uuid.Parse(r.TargetID) - if err != nil { - return datastore.Job{}, fmt.Errorf("failed to parse target id %q: %w", r.TargetID, err) - } - - return datastore.Job{ - UUID: u, - GHEDomain: r.GHEDomain, - Repository: r.Repository, - CheckEventJSON: r.CheckEventJSON, - TargetID: tid, - CreatedAt: r.CreatedAt, - UpdatedAt: r.UpdatedAt, - }, nil -} - -func jobsFromRows(rows []rowJob) ([]datastore.Job, error) { - js := make([]datastore.Job, 0, len(rows)) - for _, r := range rows { - j, err := r.job() - if err != nil { - return nil, err - } - js = append(js, j) - } - return js, nil -} - // EnqueueJob add a job func (m *MySQL) EnqueueJob(ctx context.Context, job datastore.Job) error { query := `INSERT INTO jobs(uuid, ghe_domain, repository, check_event, target_id) VALUES (?, ?, ?, ?, ?)` - if _, err := m.Conn.ExecContext(ctx, query, job.UUID.String(), job.GHEDomain, job.Repository, job.CheckEventJSON, job.TargetID.String()); err != nil { + if _, err := m.Conn.ExecContext(ctx, query, job.UUID, job.GHEDomain, job.Repository, job.CheckEventJSON, job.TargetID.String()); err != nil { return fmt.Errorf("failed to execute INSERT query: %w", err) } @@ -77,9 +29,9 @@ func (m *MySQL) EnqueueJob(ctx context.Context, job datastore.Job) error { // ListJobs get all jobs func (m *MySQL) ListJobs(ctx context.Context) ([]datastore.Job, error) { - var rows []rowJob + var jobs []datastore.Job query := `SELECT uuid, ghe_domain, repository, check_event, target_id, created_at, updated_at FROM jobs` - if err := m.Conn.SelectContext(ctx, &rows, query); err != nil { + if err := m.Conn.SelectContext(ctx, &jobs, query); err != nil { if errors.Is(err, sql.ErrNoRows) { return nil, datastore.ErrNotFound } @@ -87,7 +39,7 @@ func (m *MySQL) ListJobs(ctx context.Context) ([]datastore.Job, error) { return nil, fmt.Errorf("failed to execute SELECT query: %w", err) } - return jobsFromRows(rows) + return jobs, nil } // DeleteJob delete a job diff --git a/pkg/datastore/mysql/job_test.go b/pkg/datastore/mysql/job_test.go index b2e666e..d98c60f 100644 --- a/pkg/datastore/mysql/job_test.go +++ b/pkg/datastore/mysql/job_test.go @@ -10,13 +10,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/jmoiron/sqlx" - "uuid" + uuid "github.com/satori/go.uuid" "github.com/whywaita/myshoes/internal/testutils" "github.com/whywaita/myshoes/pkg/datastore" ) -var testJobID = uuid.MustParse("1b4e5b7a-e3c1-4829-9cfd-eac4183f2c95") +var testJobID = uuid.FromStringOrNil("1b4e5b7a-e3c1-4829-9cfd-eac4183f2c95") func TestMySQL_EnqueueJob(t *testing.T) { testDatastore, teardown := testutils.GetTestDatastore() @@ -206,46 +206,16 @@ func TestMySQL_DeleteJob(t *testing.T) { } } -type sqlJobRow struct { - UUID string `db:"uuid"` - GHEDomain sql.NullString `db:"ghe_domain"` - Repository string `db:"repository"` - CheckEventJSON string `db:"check_event"` - TargetID string `db:"target_id"` - CreatedAt time.Time `db:"created_at"` - UpdatedAt time.Time `db:"updated_at"` -} - -func (r sqlJobRow) job() (*datastore.Job, error) { - u, err := uuid.Parse(r.UUID) - if err != nil { - return nil, err - } - tid, err := uuid.Parse(r.TargetID) - if err != nil { - return nil, err - } - return &datastore.Job{ - UUID: u, - GHEDomain: r.GHEDomain, - Repository: r.Repository, - CheckEventJSON: r.CheckEventJSON, - TargetID: tid, - CreatedAt: r.CreatedAt, - UpdatedAt: r.UpdatedAt, - }, nil -} - func getJobFromSQL(testDB *sqlx.DB, id uuid.UUID) (*datastore.Job, error) { - var row sqlJobRow + var j datastore.Job query := `SELECT uuid, ghe_domain, repository, check_event, target_id FROM jobs WHERE uuid = ?` stmt, err := testDB.Preparex(query) if err != nil { return nil, fmt.Errorf("failed to prepare: %w", err) } - err = stmt.Get(&row, id.String()) + err = stmt.Get(&j, id) if err != nil { return nil, fmt.Errorf("failed to get job: %w", err) } - return row.job() + return &j, nil } diff --git a/pkg/datastore/mysql/runner.go b/pkg/datastore/mysql/runner.go index 102fe97..b6761f4 100644 --- a/pkg/datastore/mysql/runner.go +++ b/pkg/datastore/mysql/runner.go @@ -7,67 +7,10 @@ import ( "fmt" "time" + uuid "github.com/satori/go.uuid" "github.com/whywaita/myshoes/pkg/datastore" - "uuid" ) -// rowRunner mirrors datastore.Runner but stores the UUID columns (runner_id, -// target_id) as strings so that database/sql can scan the VARCHAR(36) columns. -// The standard library uuid.UUID is a [16]byte with no sql.Scanner. -type rowRunner struct { - UUID string `db:"runner_id"` - ShoesType string `db:"shoes_type"` - IPAddress string `db:"ip_address"` - TargetID string `db:"target_id"` - CloudID string `db:"cloud_id"` - ResourceType datastore.ResourceType `db:"resource_type"` - RunnerUser sql.NullString `db:"runner_user"` - ProviderURL sql.NullString `db:"provider_url"` - RepositoryURL string `db:"repository_url"` - RequestWebhook string `db:"request_webhook"` - CreatedAt time.Time `db:"created_at"` - UpdatedAt time.Time `db:"updated_at"` -} - -func (r rowRunner) runner() (datastore.Runner, error) { - u, err := uuid.Parse(r.UUID) - if err != nil { - return datastore.Runner{}, fmt.Errorf("failed to parse runner uuid %q: %w", r.UUID, err) - } - - tid, err := uuid.Parse(r.TargetID) - if err != nil { - return datastore.Runner{}, fmt.Errorf("failed to parse target id %q: %w", r.TargetID, err) - } - - return datastore.Runner{ - UUID: u, - ShoesType: r.ShoesType, - IPAddress: r.IPAddress, - TargetID: tid, - CloudID: r.CloudID, - ResourceType: r.ResourceType, - RunnerUser: r.RunnerUser, - ProviderURL: r.ProviderURL, - RepositoryURL: r.RepositoryURL, - RequestWebhook: r.RequestWebhook, - CreatedAt: r.CreatedAt, - UpdatedAt: r.UpdatedAt, - }, nil -} - -func runnersFromRows(rows []rowRunner) ([]datastore.Runner, error) { - rs := make([]datastore.Runner, 0, len(rows)) - for _, r := range rows { - runner, err := r.runner() - if err != nil { - return nil, err - } - rs = append(rs, runner) - } - return rs, nil -} - // CreateRunner add a runner func (m *MySQL) CreateRunner(ctx context.Context, runner datastore.Runner) error { tx := m.Conn.MustBegin() @@ -99,10 +42,10 @@ func (m *MySQL) CreateRunner(ctx context.Context, runner datastore.Runner) error // ListRunners get a not deleted runners func (m *MySQL) ListRunners(ctx context.Context) ([]datastore.Runner, error) { - var rows []rowRunner + var runners []datastore.Runner query := `SELECT runner.runner_id, detail.shoes_type, detail.ip_address, detail.target_id, detail.cloud_id, detail.created_at, detail.updated_at, detail.resource_type, detail.repository_url, detail.request_webhook, detail.runner_user, detail.provider_url FROM runners_running AS runner JOIN runner_detail AS detail ON runner.runner_id = detail.runner_id` - err := m.Conn.SelectContext(ctx, &rows, query) + err := m.Conn.SelectContext(ctx, &runners, query) if err != nil { if errors.Is(err, sql.ErrNoRows) { return nil, datastore.ErrNotFound @@ -111,15 +54,15 @@ func (m *MySQL) ListRunners(ctx context.Context) ([]datastore.Runner, error) { return nil, fmt.Errorf("failed to execute SELECT query: %w", err) } - return runnersFromRows(rows) + return runners, nil } // ListRunnersByTargetID get a not deleted runners that has target_id func (m *MySQL) ListRunnersByTargetID(ctx context.Context, targetID uuid.UUID) ([]datastore.Runner, error) { - var rows []rowRunner + var runners []datastore.Runner query := `SELECT runner.runner_id, detail.shoes_type, detail.ip_address, detail.target_id, detail.cloud_id, detail.created_at, detail.updated_at, detail.resource_type, detail.repository_url, detail.request_webhook, detail.runner_user, detail.provider_url FROM runners_running AS runner JOIN runner_detail AS detail ON runner.runner_id = detail.runner_id WHERE detail.target_id = ?` - err := m.Conn.SelectContext(ctx, &rows, query, targetID.String()) + err := m.Conn.SelectContext(ctx, &runners, query, targetID) if err != nil { if errors.Is(err, sql.ErrNoRows) { return nil, datastore.ErrNotFound @@ -128,15 +71,15 @@ func (m *MySQL) ListRunnersByTargetID(ctx context.Context, targetID uuid.UUID) ( return nil, fmt.Errorf("failed to execute SELECT query: %w", err) } - return runnersFromRows(rows) + return runners, nil } // ListRunnersLogBySince ListRunnerLog get a runners since time func (m *MySQL) ListRunnersLogBySince(ctx context.Context, since time.Time) ([]datastore.Runner, error) { - var rows []rowRunner + var runners []datastore.Runner query := `SELECT runner_id, shoes_type, ip_address, target_id, cloud_id, created_at, updated_at, resource_type, repository_url, request_webhook, runner_user, provider_url FROM runner_detail WHERE created_at > ?` - err := m.Conn.SelectContext(ctx, &rows, query, since) + err := m.Conn.SelectContext(ctx, &runners, query, since) if err != nil { if errors.Is(err, sql.ErrNoRows) { return nil, datastore.ErrNotFound @@ -145,15 +88,15 @@ func (m *MySQL) ListRunnersLogBySince(ctx context.Context, since time.Time) ([]d return nil, fmt.Errorf("failed to execute SELECT query: %w", err) } - return runnersFromRows(rows) + return runners, nil } // GetRunner get a runner func (m *MySQL) GetRunner(ctx context.Context, id uuid.UUID) (*datastore.Runner, error) { - var row rowRunner + var r datastore.Runner query := `SELECT runner_id, shoes_type, ip_address, target_id, cloud_id, created_at, updated_at, resource_type, repository_url, request_webhook, runner_user, provider_url FROM runner_detail WHERE runner_id = ?` - if err := m.Conn.GetContext(ctx, &row, query, id.String()); err != nil { + if err := m.Conn.GetContext(ctx, &r, query, id.String()); err != nil { if errors.Is(err, sql.ErrNoRows) { return nil, datastore.ErrNotFound } @@ -161,10 +104,6 @@ func (m *MySQL) GetRunner(ctx context.Context, id uuid.UUID) (*datastore.Runner, return nil, fmt.Errorf("failed to execute SELECT query: %w", err) } - r, err := row.runner() - if err != nil { - return nil, err - } return &r, nil } diff --git a/pkg/datastore/mysql/runner_test.go b/pkg/datastore/mysql/runner_test.go index 610291e..d796aa3 100644 --- a/pkg/datastore/mysql/runner_test.go +++ b/pkg/datastore/mysql/runner_test.go @@ -11,12 +11,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/jmoiron/sqlx" + uuid "github.com/satori/go.uuid" "github.com/whywaita/myshoes/internal/testutils" "github.com/whywaita/myshoes/pkg/datastore" - "uuid" ) -var testRunnerID = uuid.MustParse("7943e412-c0ae-4068-ab24-3e71a13fbe53") +var testRunnerID = uuid.FromStringOrNil("7943e412-c0ae-4068-ab24-3e71a13fbe53") func TestMySQL_CreateRunner(t *testing.T) { testDatastore, teardown := testutils.GetTestDatastore() @@ -218,14 +218,14 @@ func TestMySQL_ListRunnersNotReturnDeleted(t *testing.T) { RepositoryURL: "https://github.com/octocat/Hello-World", RequestWebhook: "{}", } - input.UUID = uuid.MustParse(fmt.Sprintf(u, i)) + input.UUID = uuid.FromStringOrNil(fmt.Sprintf(u, i)) err := testDatastore.CreateRunner(context.Background(), input) if err != nil { t.Fatalf("failed to create runner: %+v", err) } } - err := testDatastore.DeleteRunner(context.Background(), uuid.MustParse(fmt.Sprintf(u, 0)), time.Now(), "deleted") + err := testDatastore.DeleteRunner(context.Background(), uuid.FromStringOrNil(fmt.Sprintf(u, 0)), time.Now(), "deleted") if err != nil { t.Fatalf("failed to delete runner: %+v", err) } @@ -250,7 +250,7 @@ func TestMySQL_ListRunnersNotReturnDeleted(t *testing.T) { RepositoryURL: "https://github.com/octocat/Hello-World", RequestWebhook: "{}", } - r.UUID = uuid.MustParse(fmt.Sprintf(u, i)) + r.UUID = uuid.FromStringOrNil(fmt.Sprintf(u, i)) want = append(want, r) } @@ -285,7 +285,7 @@ func TestMySQL_ListRunnersLogBySince(t *testing.T) { RepositoryURL: "https://github.com/octocat/Hello-World", RequestWebhook: "{}", } - input.UUID = uuid.MustParse(fmt.Sprintf(u, i)) + input.UUID = uuid.FromStringOrNil(fmt.Sprintf(u, i)) err := testDatastore.CreateRunner(context.Background(), input) if err != nil { t.Fatalf("failed to create runner: %+v", err) @@ -314,7 +314,7 @@ func TestMySQL_ListRunnersLogBySince(t *testing.T) { RepositoryURL: "https://github.com/octocat/Hello-World", RequestWebhook: "{}", } - r.UUID = uuid.MustParse(fmt.Sprintf(u, i)) + r.UUID = uuid.FromStringOrNil(fmt.Sprintf(u, i)) want = append(want, r) } @@ -462,86 +462,46 @@ func TestMySQL_DeleteRunner(t *testing.T) { } } -type sqlRunnerRow struct { - UUID string `db:"runner_id"` - ShoesType string `db:"shoes_type"` - IPAddress string `db:"ip_address"` - TargetID string `db:"target_id"` - CloudID string `db:"cloud_id"` - ResourceType datastore.ResourceType `db:"resource_type"` - RunnerUser sql.NullString `db:"runner_user"` - ProviderURL sql.NullString `db:"provider_url"` - RepositoryURL string `db:"repository_url"` - RequestWebhook string `db:"request_webhook"` - CreatedAt time.Time `db:"created_at"` - UpdatedAt time.Time `db:"updated_at"` -} - -func (r sqlRunnerRow) runner() (*datastore.Runner, error) { - u, err := uuid.Parse(r.UUID) - if err != nil { - return nil, err - } - tid, err := uuid.Parse(r.TargetID) - if err != nil { - return nil, err - } - return &datastore.Runner{ - UUID: u, - ShoesType: r.ShoesType, - IPAddress: r.IPAddress, - TargetID: tid, - CloudID: r.CloudID, - ResourceType: r.ResourceType, - RunnerUser: r.RunnerUser, - ProviderURL: r.ProviderURL, - RepositoryURL: r.RepositoryURL, - RequestWebhook: r.RequestWebhook, - CreatedAt: r.CreatedAt, - UpdatedAt: r.UpdatedAt, - }, nil -} - func getRunnerFromSQL(testDB *sqlx.DB, id uuid.UUID) (*datastore.Runner, error) { - var row sqlRunnerRow + var r datastore.Runner query := `SELECT runner_id, shoes_type, ip_address, target_id, cloud_id, created_at, updated_at, resource_type, repository_url, request_webhook, runner_user, provider_url FROM runner_detail WHERE runner_id = ?` stmt, err := testDB.Preparex(query) if err != nil { return nil, fmt.Errorf("failed to prepare: %w", err) } - err = stmt.Get(&row, id.String()) + err = stmt.Get(&r, id) if err != nil { return nil, fmt.Errorf("failed to get runner: %w", err) } - return row.runner() + return &r, nil } func getRunningRunnerFromSQL(testDB *sqlx.DB, id uuid.UUID) (*datastore.Runner, error) { - var row sqlRunnerRow + var r datastore.Runner query := `SELECT detail.runner_id, shoes_type, ip_address, target_id, cloud_id, detail.created_at, updated_at, detail.resource_type, detail.repository_url, detail.request_webhook FROM runner_detail AS detail JOIN runnesr_running AS running ON detail.runner_id = running.runner_id WHERE detail.runner_id = ?` stmt, err := testDB.Preparex(query) if err != nil { return nil, fmt.Errorf("failed to prepare: %w", err) } - err = stmt.Get(&row, id.String()) + err = stmt.Get(&r, id) if err != nil { return nil, fmt.Errorf("failed to get runner: %w", err) } - return row.runner() + return &r, nil } func getDeletedRunnerFromSQL(testDB *sqlx.DB, id uuid.UUID) (*datastore.Runner, error) { - var row sqlRunnerRow + var r datastore.Runner query := `SELECT detail.runner_id, shoes_type, ip_address, target_id, cloud_id, detail.created_at, updated_at, detail.resource_type, detail.repository_url, detail.request_webhook FROM runner_detail AS detail JOIN runners_deleted AS deleted ON detail.runner_id = deleted.runner_id WHERE detail.runner_id = ?` stmt, err := testDB.Preparex(query) if err != nil { return nil, fmt.Errorf("failed to prepare: %w", err) } - err = stmt.Get(&row, id.String()) + err = stmt.Get(&r, id) if err != nil { return nil, fmt.Errorf("failed to get runner: %w", err) } - return row.runner() + return &r, nil } diff --git a/pkg/datastore/mysql/target.go b/pkg/datastore/mysql/target.go index a9c1da9..4a0a5a2 100644 --- a/pkg/datastore/mysql/target.go +++ b/pkg/datastore/mysql/target.go @@ -7,60 +7,10 @@ import ( "fmt" "time" + uuid "github.com/satori/go.uuid" "github.com/whywaita/myshoes/pkg/datastore" - "uuid" ) -// rowTarget mirrors datastore.Target but stores the UUID column as a string so -// that database/sql can scan the VARCHAR(36) uuid column. The standard library -// uuid.UUID is a [16]byte with no sql.Scanner, so it cannot be scanned directly. -type rowTarget struct { - UUID string `db:"uuid"` - Scope string `db:"scope"` - GitHubToken string `db:"github_token"` - TokenExpiredAt time.Time `db:"token_expired_at"` - GHEDomain sql.NullString `db:"ghe_domain"` - ResourceType datastore.ResourceType `db:"resource_type"` - ProviderURL sql.NullString `db:"provider_url"` - Status datastore.TargetStatus `db:"status"` - StatusDescription sql.NullString `db:"status_description"` - CreatedAt time.Time `db:"created_at"` - UpdatedAt time.Time `db:"updated_at"` -} - -func (r rowTarget) target() (datastore.Target, error) { - u, err := uuid.Parse(r.UUID) - if err != nil { - return datastore.Target{}, fmt.Errorf("failed to parse target uuid %q: %w", r.UUID, err) - } - - return datastore.Target{ - UUID: u, - Scope: r.Scope, - GitHubToken: r.GitHubToken, - TokenExpiredAt: r.TokenExpiredAt, - GHEDomain: r.GHEDomain, - ResourceType: r.ResourceType, - ProviderURL: r.ProviderURL, - Status: r.Status, - StatusDescription: r.StatusDescription, - CreatedAt: r.CreatedAt, - UpdatedAt: r.UpdatedAt, - }, nil -} - -func targetsFromRows(rows []rowTarget) ([]datastore.Target, error) { - ts := make([]datastore.Target, 0, len(rows)) - for _, r := range rows { - t, err := r.target() - if err != nil { - return nil, err - } - ts = append(ts, t) - } - return ts, nil -} - // CreateTarget create a target func (m *MySQL) CreateTarget(ctx context.Context, target datastore.Target) error { expiredAtRFC3339 := target.TokenExpiredAt.Format("2006-01-02 15:04:05") @@ -69,7 +19,7 @@ func (m *MySQL) CreateTarget(ctx context.Context, target datastore.Target) error if _, err := m.Conn.ExecContext( ctx, query, - target.UUID.String(), + target.UUID, target.Scope, target.GHEDomain, target.GitHubToken, @@ -85,9 +35,9 @@ func (m *MySQL) CreateTarget(ctx context.Context, target datastore.Target) error // GetTarget get a target func (m *MySQL) GetTarget(ctx context.Context, id uuid.UUID) (*datastore.Target, error) { - var row rowTarget + var t datastore.Target query := `SELECT uuid, scope, github_token, token_expired_at, resource_type, provider_url, status, status_description, created_at, updated_at FROM targets WHERE uuid = ?` - if err := m.Conn.GetContext(ctx, &row, query, id.String()); err != nil { + if err := m.Conn.GetContext(ctx, &t, query, id.String()); err != nil { if errors.Is(err, sql.ErrNoRows) { return nil, datastore.ErrNotFound } @@ -95,18 +45,14 @@ func (m *MySQL) GetTarget(ctx context.Context, id uuid.UUID) (*datastore.Target, return nil, fmt.Errorf("failed to execute SELECT query: %w", err) } - t, err := row.target() - if err != nil { - return nil, err - } return &t, nil } // GetTargetByScope get a target from scope func (m *MySQL) GetTargetByScope(ctx context.Context, scope string) (*datastore.Target, error) { - var row rowTarget + var t datastore.Target query := `SELECT uuid, scope, github_token, token_expired_at, resource_type, provider_url, status, status_description, created_at, updated_at FROM targets WHERE scope = ?` - if err := m.Conn.GetContext(ctx, &row, query, scope); err != nil { + if err := m.Conn.GetContext(ctx, &t, query, scope); err != nil { if errors.Is(err, sql.ErrNoRows) { return nil, datastore.ErrNotFound } @@ -114,22 +60,18 @@ func (m *MySQL) GetTargetByScope(ctx context.Context, scope string) (*datastore. return nil, fmt.Errorf("failed to execute SELECT query: %w", err) } - t, err := row.target() - if err != nil { - return nil, err - } return &t, nil } // ListTargets get a all target func (m *MySQL) ListTargets(ctx context.Context) ([]datastore.Target, error) { - var rows []rowTarget + var ts []datastore.Target query := `SELECT uuid, scope, github_token, token_expired_at, resource_type, provider_url, status, status_description, created_at, updated_at FROM targets` - if err := m.Conn.SelectContext(ctx, &rows, query); err != nil { + if err := m.Conn.SelectContext(ctx, &ts, query); err != nil { return nil, fmt.Errorf("failed to SELECT query: %w", err) } - return targetsFromRows(rows) + return ts, nil } // DeleteTarget delete a target diff --git a/pkg/datastore/mysql/target_test.go b/pkg/datastore/mysql/target_test.go index c7e4aad..f828b0b 100644 --- a/pkg/datastore/mysql/target_test.go +++ b/pkg/datastore/mysql/target_test.go @@ -11,15 +11,15 @@ import ( "github.com/google/go-cmp/cmp" "github.com/jmoiron/sqlx" - "uuid" + uuid "github.com/satori/go.uuid" "github.com/whywaita/myshoes/internal/testutils" "github.com/whywaita/myshoes/pkg/datastore" ) -var testTargetID = uuid.MustParse("8a72d42c-372c-4e0d-9c6a-4304d44af137") -var testTargetID2 = uuid.MustParse("d14ccfea-b123-4ada-974e-bbff0937e9c7") -var testTargetID3 = uuid.MustParse("5c1816ff-4813-46b0-b1ba-30d135a2f3f5") +var testTargetID = uuid.FromStringOrNil("8a72d42c-372c-4e0d-9c6a-4304d44af137") +var testTargetID2 = uuid.FromStringOrNil("d14ccfea-b123-4ada-974e-bbff0937e9c7") +var testTargetID3 = uuid.FromStringOrNil("5c1816ff-4813-46b0-b1ba-30d135a2f3f5") var testScopeOrg = "octocat" var testScopeRepo = "octocat/hello-world" var testScopeRepo2 = "octocat/hello-world2" @@ -865,50 +865,16 @@ func TestMySQL_UpdateTargetParam(t *testing.T) { } } -type sqlTargetRow struct { - UUID string `db:"uuid"` - Scope string `db:"scope"` - GitHubToken string `db:"github_token"` - TokenExpiredAt time.Time `db:"token_expired_at"` - GHEDomain sql.NullString `db:"ghe_domain"` - ResourceType datastore.ResourceType `db:"resource_type"` - ProviderURL sql.NullString `db:"provider_url"` - Status datastore.TargetStatus `db:"status"` - StatusDescription sql.NullString `db:"status_description"` - CreatedAt time.Time `db:"created_at"` - UpdatedAt time.Time `db:"updated_at"` -} - -func (r sqlTargetRow) target() (*datastore.Target, error) { - u, err := uuid.Parse(r.UUID) - if err != nil { - return nil, err - } - return &datastore.Target{ - UUID: u, - Scope: r.Scope, - GitHubToken: r.GitHubToken, - TokenExpiredAt: r.TokenExpiredAt, - GHEDomain: r.GHEDomain, - ResourceType: r.ResourceType, - ProviderURL: r.ProviderURL, - Status: r.Status, - StatusDescription: r.StatusDescription, - CreatedAt: r.CreatedAt, - UpdatedAt: r.UpdatedAt, - }, nil -} - func getTargetFromSQL(testDB *sqlx.DB, uuid uuid.UUID) (*datastore.Target, error) { - var row sqlTargetRow + var t datastore.Target query := `SELECT uuid, scope, ghe_domain, github_token, token_expired_at, resource_type, provider_url, status, status_description, created_at, updated_at FROM targets WHERE uuid = ?` stmt, err := testDB.Preparex(query) if err != nil { return nil, fmt.Errorf("failed to prepare: %w", err) } - err = stmt.Get(&row, uuid.String()) + err = stmt.Get(&t, uuid) if err != nil { return nil, fmt.Errorf("failed to get target: %w", err) } - return row.target() + return &t, nil } diff --git a/pkg/metric/scrape_memory.go b/pkg/metric/scrape_memory.go index 20ac3a3..d4908e4 100644 --- a/pkg/metric/scrape_memory.go +++ b/pkg/metric/scrape_memory.go @@ -5,7 +5,7 @@ import ( "fmt" "sync/atomic" - "uuid" + uuid "github.com/satori/go.uuid" "github.com/prometheus/client_golang/prometheus" "github.com/whywaita/myshoes/pkg/config" diff --git a/pkg/runner/util.go b/pkg/runner/util.go index 1c1fed2..35ba490 100644 --- a/pkg/runner/util.go +++ b/pkg/runner/util.go @@ -4,8 +4,8 @@ import ( "fmt" "strings" + uuid "github.com/satori/go.uuid" "github.com/whywaita/myshoes/pkg/datastore" - "uuid" ) // ToName convert uuid to runner name @@ -16,7 +16,7 @@ func ToName(u string) string { // ToUUID convert runner name to uuid func ToUUID(name string) (uuid.UUID, error) { u := strings.TrimPrefix(name, "myshoes-") - return uuid.Parse(u) + return uuid.FromString(u) } // ToReason convert status from GitHub to datastore.RunnerStatus diff --git a/pkg/starter/starter.go b/pkg/starter/starter.go index fff6324..2c92675 100644 --- a/pkg/starter/starter.go +++ b/pkg/starter/starter.go @@ -18,6 +18,7 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + uuid "github.com/satori/go.uuid" "github.com/whywaita/myshoes/internal/util" "github.com/whywaita/myshoes/pkg/config" "github.com/whywaita/myshoes/pkg/datastore" @@ -26,7 +27,6 @@ import ( "github.com/whywaita/myshoes/pkg/runner" "github.com/whywaita/myshoes/pkg/shoes" "github.com/whywaita/myshoes/pkg/starter/safety" - "uuid" ) var ( diff --git a/pkg/web/target.go b/pkg/web/target.go index f6e16c5..7c8ea44 100644 --- a/pkg/web/target.go +++ b/pkg/web/target.go @@ -10,7 +10,7 @@ import ( "time" "github.com/r3labs/diff/v2" - "uuid" + uuid "github.com/satori/go.uuid" "github.com/whywaita/myshoes/pkg/datastore" "github.com/whywaita/myshoes/pkg/gh" @@ -221,7 +221,7 @@ func handleTargetDelete(w http.ResponseWriter, r *http.Request, ds datastore.Dat func parseReqTargetID(r *http.Request) (uuid.UUID, error) { targetIDStr := pat.Param(r, "id") - targetID, err := uuid.Parse(targetIDStr) + targetID, err := uuid.FromString(targetIDStr) if err != nil { return uuid.UUID{}, fmt.Errorf("failed to parse target id: %w", err) } diff --git a/pkg/web/target_create.go b/pkg/web/target_create.go index d7c7942..6ed0353 100644 --- a/pkg/web/target_create.go +++ b/pkg/web/target_create.go @@ -9,7 +9,7 @@ import ( "net/http" "time" - "uuid" + uuid "github.com/satori/go.uuid" "github.com/whywaita/myshoes/pkg/config" "github.com/whywaita/myshoes/pkg/datastore" diff --git a/pkg/web/target_test.go b/pkg/web/target_test.go index 3dd189c..0f2baaa 100644 --- a/pkg/web/target_test.go +++ b/pkg/web/target_test.go @@ -13,7 +13,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-github/v80/github" - "uuid" + uuid "github.com/satori/go.uuid" "github.com/whywaita/myshoes/internal/testutils" "github.com/whywaita/myshoes/pkg/datastore" diff --git a/pkg/web/webhook.go b/pkg/web/webhook.go index f4047e5..e221eeb 100644 --- a/pkg/web/webhook.go +++ b/pkg/web/webhook.go @@ -11,7 +11,7 @@ import ( "time" "github.com/google/go-github/v80/github" - "uuid" + uuid "github.com/satori/go.uuid" "github.com/whywaita/myshoes/pkg/config" "github.com/whywaita/myshoes/pkg/datastore"