From df3f4503bfdf96ca4e28e2e6549febef72bbca1e Mon Sep 17 00:00:00 2001 From: "Claire.Nicholas" Date: Thu, 21 Dec 2023 10:40:57 -0500 Subject: [PATCH] new types changes --- api/deployment/create.go | 4 +- api/webhook/post.go | 52 ++++++- database/deployment/count_repo_test.go | 8 +- database/deployment/count_test.go | 10 +- database/deployment/create_test.go | 11 +- database/deployment/delete_test.go | 5 +- database/deployment/deployment_test.go | 6 +- database/deployment/get.go | 4 +- database/deployment/get_repo.go | 4 +- database/deployment/get_repo_test.go | 9 +- database/deployment/get_test.go | 9 +- database/deployment/list.go | 4 +- database/deployment/list_repo.go | 4 +- database/deployment/list_repo_test.go | 12 +- database/deployment/list_test.go | 14 +- database/deployment/table.go | 6 +- database/deployment/update_test.go | 11 +- scm/github/deployment.go | 137 ------------------- scm/github/deployment_test.go | 182 ------------------------- scm/github/repo.go | 2 +- scm/github/webhook.go | 33 +++-- 21 files changed, 136 insertions(+), 391 deletions(-) diff --git a/api/deployment/create.go b/api/deployment/create.go index 7cd3bd5c6..4f5d0faf1 100644 --- a/api/deployment/create.go +++ b/api/deployment/create.go @@ -5,6 +5,7 @@ package deployment import ( "fmt" "net/http" + "time" "github.com/gin-gonic/gin" "github.com/go-vela/server/database" @@ -83,7 +84,8 @@ func CreateDeployment(c *gin.Context) { // update fields in deployment object input.SetRepoID(r.GetID()) - input.SetUser(u.GetName()) + input.SetCreatedBy(u.GetName()) + input.SetCreatedAt(time.Now().Unix()) if len(input.GetDescription()) == 0 { input.SetDescription("Deployment request from Vela") diff --git a/api/webhook/post.go b/api/webhook/post.go index 58be102e9..027e8535b 100644 --- a/api/webhook/post.go +++ b/api/webhook/post.go @@ -5,6 +5,7 @@ package webhook import ( "bytes" "context" + "errors" "fmt" "io" "net/http" @@ -24,6 +25,7 @@ import ( "github.com/go-vela/types/library" "github.com/go-vela/types/pipeline" "github.com/sirupsen/logrus" + "gorm.io/gorm" ) var baseErr = "unable to process webhook" @@ -664,13 +666,51 @@ func PostWebhook(c *gin.Context) { // set the BuildID field h.SetBuildID(b.GetID()) + // if event is deployment, update the deployment record to include this build if b.GetEvent() == constants.EventDeploy { - d, _ := database.FromContext(c).GetDeploymentForRepo(c, repo, *webhook.DeploymentID) - builds := new([]library.Build) - *builds = append(*builds, *b) - d.SetBuilds(builds) - logrus.Debugf("PINEAPPLE %d ", webhook.DeploymentID) - database.FromContext(c).UpdateDeployment(c, d) + builds := []*library.Build{} + builds = append(builds, b) + + d, err := database.FromContext(c).GetDeploymentForRepo(c, repo, webhook.Deployment.GetNumber()) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + deployment := webhook.Deployment + + deployment.SetRepoID(repo.GetID()) + deployment.SetBuilds(builds) + + _, err := database.FromContext(c).CreateDeployment(c, deployment) + if err != nil { + retErr := fmt.Errorf("%s: failed to create deployment %s/%d: %w", baseErr, repo.GetFullName(), deployment.GetNumber(), err) + util.HandleError(c, http.StatusInternalServerError, retErr) + + h.SetStatus(constants.StatusFailure) + h.SetError(retErr.Error()) + + return + } + } else { + retErr := fmt.Errorf("%s: failed to get deployment %s/%d: %w", baseErr, repo.GetFullName(), webhook.Deployment.GetNumber(), err) + util.HandleError(c, http.StatusInternalServerError, retErr) + + h.SetStatus(constants.StatusFailure) + h.SetError(retErr.Error()) + + return + } + } else { + d.SetBuilds(builds) + _, err := database.FromContext(c).UpdateDeployment(c, d) + if err != nil { + retErr := fmt.Errorf("%s: failed to update deployment %s/%d: %w", baseErr, repo.GetFullName(), d.GetNumber(), err) + util.HandleError(c, http.StatusInternalServerError, retErr) + + h.SetStatus(constants.StatusFailure) + h.SetError(retErr.Error()) + + return + } + } } c.JSON(http.StatusOK, b) diff --git a/database/deployment/count_repo_test.go b/database/deployment/count_repo_test.go index f8478236e..f69fffb1a 100644 --- a/database/deployment/count_repo_test.go +++ b/database/deployment/count_repo_test.go @@ -14,7 +14,7 @@ import ( ) func TestDeployment_Engine_CountDeploymentssForRepo(t *testing.T) { - builds := new([]library.Build) + builds := []*library.Build{} // setup types _deploymentOne := testDeployment() @@ -22,13 +22,14 @@ func TestDeployment_Engine_CountDeploymentssForRepo(t *testing.T) { _deploymentOne.SetRepoID(1) _deploymentOne.SetNumber(1) _deploymentOne.SetURL("https://github.com/github/octocat/deployments/1") - _deploymentOne.SetUser("octocat") _deploymentOne.SetCommit("48afb5bdc41ad69bf22588491333f7cf71135163") _deploymentOne.SetRef("refs/heads/master") _deploymentOne.SetTask("vela-deploy") _deploymentOne.SetTarget("production") _deploymentOne.SetDescription("Deployment request from Vela") _deploymentOne.SetPayload(map[string]string{"foo": "test1"}) + _deploymentOne.SetCreatedAt(1) + _deploymentOne.SetCreatedBy("octocat") _deploymentOne.SetBuilds(builds) _deploymentTwo := testDeployment() @@ -36,13 +37,14 @@ func TestDeployment_Engine_CountDeploymentssForRepo(t *testing.T) { _deploymentTwo.SetRepoID(2) _deploymentTwo.SetNumber(2) _deploymentTwo.SetURL("https://github.com/github/octocat/deployments/2") - _deploymentTwo.SetUser("octocat") _deploymentTwo.SetCommit("48afb5bdc41ad69bf22588491333f7cf71135164") _deploymentTwo.SetRef("refs/heads/master") _deploymentTwo.SetTask("vela-deploy") _deploymentTwo.SetTarget("production") _deploymentTwo.SetDescription("Deployment request from Vela") _deploymentTwo.SetPayload(map[string]string{"foo": "test1"}) + _deploymentTwo.SetCreatedAt(1) + _deploymentTwo.SetCreatedBy("octocat") _deploymentTwo.SetBuilds(builds) _repo := testRepo() diff --git a/database/deployment/count_test.go b/database/deployment/count_test.go index b6c3510f7..0addde603 100644 --- a/database/deployment/count_test.go +++ b/database/deployment/count_test.go @@ -48,8 +48,8 @@ func TestDeployment_Engine_CountDeployments(t *testing.T) { buildOne.SetRuntime("docker") buildOne.SetDistribution("linux") - builds := new([]library.Build) - *builds = append(*builds, *buildOne) + builds := []*library.Build{} + builds = append(builds, buildOne) // setup types _deploymentOne := testDeployment() @@ -57,13 +57,14 @@ func TestDeployment_Engine_CountDeployments(t *testing.T) { _deploymentOne.SetRepoID(1) _deploymentOne.SetNumber(1) _deploymentOne.SetURL("https://github.com/github/octocat/deployments/1") - _deploymentOne.SetUser("octocat") _deploymentOne.SetCommit("48afb5bdc41ad69bf22588491333f7cf71135163") _deploymentOne.SetRef("refs/heads/master") _deploymentOne.SetTask("vela-deploy") _deploymentOne.SetTarget("production") _deploymentOne.SetDescription("Deployment request from Vela") _deploymentOne.SetPayload(map[string]string{"foo": "test1"}) + _deploymentOne.SetCreatedAt(1) + _deploymentOne.SetCreatedBy("octocat") _deploymentOne.SetBuilds(builds) _deploymentTwo := testDeployment() @@ -71,13 +72,14 @@ func TestDeployment_Engine_CountDeployments(t *testing.T) { _deploymentTwo.SetRepoID(2) _deploymentTwo.SetNumber(2) _deploymentTwo.SetURL("https://github.com/github/octocat/deployments/2") - _deploymentTwo.SetUser("octocat") _deploymentTwo.SetCommit("48afb5bdc41ad69bf22588491333f7cf71135164") _deploymentTwo.SetRef("refs/heads/master") _deploymentTwo.SetTask("vela-deploy") _deploymentTwo.SetTarget("production") _deploymentTwo.SetDescription("Deployment request from Vela") _deploymentTwo.SetPayload(map[string]string{"foo": "test1"}) + _deploymentTwo.SetCreatedAt(1) + _deploymentTwo.SetCreatedBy("octocat") _deploymentTwo.SetBuilds(builds) _postgres, _mock := testPostgres(t) diff --git a/database/deployment/create_test.go b/database/deployment/create_test.go index 4b0d44d92..a4ed1ad0e 100644 --- a/database/deployment/create_test.go +++ b/database/deployment/create_test.go @@ -13,7 +13,7 @@ import ( ) func TestDeployment_Engine_CreateDeployment(t *testing.T) { - builds := new([]library.Build) + builds := []*library.Build{} // setup types _deploymentOne := testDeployment() @@ -21,13 +21,14 @@ func TestDeployment_Engine_CreateDeployment(t *testing.T) { _deploymentOne.SetRepoID(1) _deploymentOne.SetNumber(1) _deploymentOne.SetURL("https://github.com/github/octocat/deployments/1") - _deploymentOne.SetUser("octocat") _deploymentOne.SetCommit("48afb5bdc41ad69bf22588491333f7cf71135163") _deploymentOne.SetRef("refs/heads/master") _deploymentOne.SetTask("vela-deploy") _deploymentOne.SetTarget("production") _deploymentOne.SetDescription("Deployment request from Vela") _deploymentOne.SetPayload(map[string]string{"foo": "test1"}) + _deploymentOne.SetCreatedAt(1) + _deploymentOne.SetCreatedBy("octocat") _deploymentOne.SetBuilds(builds) _postgres, _mock := testPostgres(t) @@ -38,9 +39,9 @@ func TestDeployment_Engine_CreateDeployment(t *testing.T) { // ensure the mock expects the query _mock.ExpectQuery(`INSERT INTO "deployments" -("number","repo_id","url","user","commit","ref","task","target","description","payload","builds","id") -VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12) RETURNING "id"`). - WithArgs(1, 1, "https://github.com/github/octocat/deployments/1", "octocat", "48afb5bdc41ad69bf22588491333f7cf71135163", "refs/heads/master", "vela-deploy", "production", "Deployment request from Vela", "{\"foo\":\"test1\"}", "{}", 1). +("number","repo_id","url","commit","ref","task","target","description","payload","created_at","created_by","builds","id") +VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13) RETURNING "id"`). + WithArgs(1, 1, "https://github.com/github/octocat/deployments/1", "48afb5bdc41ad69bf22588491333f7cf71135163", "refs/heads/master", "vela-deploy", "production", "Deployment request from Vela", "{\"foo\":\"test1\"}", 1, "octocat", "{}", 1). WillReturnRows(_rows) _sqlite := testSqlite(t) diff --git a/database/deployment/delete_test.go b/database/deployment/delete_test.go index 771c70bc8..c3037bebb 100644 --- a/database/deployment/delete_test.go +++ b/database/deployment/delete_test.go @@ -13,7 +13,7 @@ import ( ) func TestDeployment_Engine_DeleteDeployment(t *testing.T) { - builds := new([]library.Build) + builds := []*library.Build{} // setup types _deploymentOne := testDeployment() @@ -21,13 +21,14 @@ func TestDeployment_Engine_DeleteDeployment(t *testing.T) { _deploymentOne.SetRepoID(1) _deploymentOne.SetNumber(1) _deploymentOne.SetURL("https://github.com/github/octocat/deployments/1") - _deploymentOne.SetUser("octocat") _deploymentOne.SetCommit("48afb5bdc41ad69bf22588491333f7cf71135163") _deploymentOne.SetRef("refs/heads/master") _deploymentOne.SetTask("vela-deploy") _deploymentOne.SetTarget("production") _deploymentOne.SetDescription("Deployment request from Vela") _deploymentOne.SetPayload(map[string]string{"foo": "test1"}) + _deploymentOne.SetCreatedAt(1) + _deploymentOne.SetCreatedBy("octocat") _deploymentOne.SetBuilds(builds) _postgres, _mock := testPostgres(t) diff --git a/database/deployment/deployment_test.go b/database/deployment/deployment_test.go index b1ec84646..a4e16c945 100644 --- a/database/deployment/deployment_test.go +++ b/database/deployment/deployment_test.go @@ -170,19 +170,21 @@ func testSqlite(t *testing.T) *engine { // testDeployment is a test helper function to create a library // Deployment type with all fields set to their zero values. func testDeployment() *library.Deployment { + builds := []*library.Build{} return &library.Deployment{ ID: new(int64), RepoID: new(int64), Number: new(int64), URL: new(string), - User: new(string), Commit: new(string), Ref: new(string), Task: new(string), Target: new(string), Description: new(string), Payload: new(raw.StringSliceMap), - Builds: new([]library.Build), + CreatedAt: new(int64), + CreatedBy: new(string), + Builds: builds, } } diff --git a/database/deployment/get.go b/database/deployment/get.go index 9cbff9172..d689dd674 100644 --- a/database/deployment/get.go +++ b/database/deployment/get.go @@ -30,7 +30,7 @@ func (e *engine) GetDeployment(ctx context.Context, id int64) (*library.Deployme return nil, err } - builds := new([]library.Build) + builds := []*library.Build{} for _, a := range d.Builds { bID, err := strconv.ParseInt(a, 10, 64) @@ -50,7 +50,7 @@ func (e *engine) GetDeployment(ctx context.Context, id int64) (*library.Deployme return nil, err } - *builds = append(*builds, *b.ToLibrary()) + builds = append(builds, b.ToLibrary()) } // return the deployment diff --git a/database/deployment/get_repo.go b/database/deployment/get_repo.go index 42bad248c..1975642be 100644 --- a/database/deployment/get_repo.go +++ b/database/deployment/get_repo.go @@ -36,7 +36,7 @@ func (e *engine) GetDeploymentForRepo(ctx context.Context, r *library.Repo, numb return nil, err } - builds := new([]library.Build) + builds := []*library.Build{} for _, a := range d.Builds { bID, err := strconv.ParseInt(a, 10, 64) @@ -56,7 +56,7 @@ func (e *engine) GetDeploymentForRepo(ctx context.Context, r *library.Repo, numb return nil, err } - *builds = append(*builds, *b.ToLibrary()) + builds = append(builds, b.ToLibrary()) } return d.ToLibrary(builds), nil diff --git a/database/deployment/get_repo_test.go b/database/deployment/get_repo_test.go index 1393f3cb8..54f01b192 100644 --- a/database/deployment/get_repo_test.go +++ b/database/deployment/get_repo_test.go @@ -14,7 +14,7 @@ import ( ) func TestDeployment_Engine_GetDeploymentForRepo(t *testing.T) { - builds := new([]library.Build) + builds := []*library.Build{} // setup types _deploymentOne := testDeployment() @@ -22,13 +22,14 @@ func TestDeployment_Engine_GetDeploymentForRepo(t *testing.T) { _deploymentOne.SetRepoID(1) _deploymentOne.SetNumber(1) _deploymentOne.SetURL("https://github.com/github/octocat/deployments/1") - _deploymentOne.SetUser("octocat") _deploymentOne.SetCommit("48afb5bdc41ad69bf22588491333f7cf71135163") _deploymentOne.SetRef("refs/heads/master") _deploymentOne.SetTask("vela-deploy") _deploymentOne.SetTarget("production") _deploymentOne.SetDescription("Deployment request from Vela") _deploymentOne.SetPayload(map[string]string{"foo": "test1"}) + _deploymentOne.SetCreatedAt(1) + _deploymentOne.SetCreatedBy("octocat") _deploymentOne.SetBuilds(builds) _repo := testRepo() @@ -43,8 +44,8 @@ func TestDeployment_Engine_GetDeploymentForRepo(t *testing.T) { // create expected result in mock _rows := sqlmock.NewRows( - []string{"id", "repo_id", "number", "url", "user", "commit", "ref", "task", "target", "description", "payload", "builds"}). - AddRow(1, 1, 1, "https://github.com/github/octocat/deployments/1", "octocat", "48afb5bdc41ad69bf22588491333f7cf71135163", "refs/heads/master", "vela-deploy", "production", "Deployment request from Vela", "{\"foo\":\"test1\"}", "{}") + []string{"id", "repo_id", "number", "url", "commit", "ref", "task", "target", "description", "payload", "created_at", "created_by", "builds"}). + AddRow(1, 1, 1, "https://github.com/github/octocat/deployments/1", "48afb5bdc41ad69bf22588491333f7cf71135163", "refs/heads/master", "vela-deploy", "production", "Deployment request from Vela", "{\"foo\":\"test1\"}", 1, "octocat", "{}") // ensure the mock expects the query _mock.ExpectQuery(`SELECT * FROM "deployments" WHERE repo_id = $1 AND number = $2 LIMIT 1`).WithArgs(1, 1).WillReturnRows(_rows) diff --git a/database/deployment/get_test.go b/database/deployment/get_test.go index d969ab08f..e23c8c207 100644 --- a/database/deployment/get_test.go +++ b/database/deployment/get_test.go @@ -14,7 +14,7 @@ import ( ) func TestDeployment_Engine_GetDeployment(t *testing.T) { - builds := new([]library.Build) + builds := []*library.Build{} // setup types _deploymentOne := testDeployment() @@ -22,13 +22,14 @@ func TestDeployment_Engine_GetDeployment(t *testing.T) { _deploymentOne.SetRepoID(1) _deploymentOne.SetNumber(1) _deploymentOne.SetURL("https://github.com/github/octocat/deployments/1") - _deploymentOne.SetUser("octocat") _deploymentOne.SetCommit("48afb5bdc41ad69bf22588491333f7cf71135163") _deploymentOne.SetRef("refs/heads/master") _deploymentOne.SetTask("vela-deploy") _deploymentOne.SetTarget("production") _deploymentOne.SetDescription("Deployment request from Vela") _deploymentOne.SetPayload(map[string]string{"foo": "test1"}) + _deploymentOne.SetCreatedAt(1) + _deploymentOne.SetCreatedBy("octocat") _deploymentOne.SetBuilds(builds) _postgres, _mock := testPostgres(t) @@ -36,8 +37,8 @@ func TestDeployment_Engine_GetDeployment(t *testing.T) { // create expected result in mock _rows := sqlmock.NewRows( - []string{"id", "repo_id", "number", "url", "user", "commit", "ref", "task", "target", "description", "payload", "builds"}). - AddRow(1, 1, 1, "https://github.com/github/octocat/deployments/1", "octocat", "48afb5bdc41ad69bf22588491333f7cf71135163", "refs/heads/master", "vela-deploy", "production", "Deployment request from Vela", "{\"foo\":\"test1\"}", "{}") + []string{"id", "repo_id", "number", "url", "commit", "ref", "task", "target", "description", "payload", "created_at", "created_by", "builds"}). + AddRow(1, 1, 1, "https://github.com/github/octocat/deployments/1", "48afb5bdc41ad69bf22588491333f7cf71135163", "refs/heads/master", "vela-deploy", "production", "Deployment request from Vela", "{\"foo\":\"test1\"}", 1, "octocat", "{}") // ensure the mock expects the query _mock.ExpectQuery(`SELECT * FROM "deployments" WHERE id = $1 LIMIT 1`).WithArgs(1).WillReturnRows(_rows) diff --git a/database/deployment/list.go b/database/deployment/list.go index 3b9e0ad6a..d8a3433f7 100644 --- a/database/deployment/list.go +++ b/database/deployment/list.go @@ -41,7 +41,7 @@ func (e *engine) ListDeployments(ctx context.Context) ([]*library.Deployment, er // https://golang.org/doc/faq#closures_and_goroutines tmp := deployment - builds := new([]library.Build) + builds := []*library.Build{} for _, a := range tmp.Builds { bID, err := strconv.ParseInt(a, 10, 64) @@ -60,7 +60,7 @@ func (e *engine) ListDeployments(ctx context.Context) ([]*library.Deployment, er if err2 != nil { return nil, err } - *builds = append(*builds, *b.ToLibrary()) + builds = append(builds, b.ToLibrary()) } // convert query result to library type diff --git a/database/deployment/list_repo.go b/database/deployment/list_repo.go index ec6de39ba..e07788f18 100644 --- a/database/deployment/list_repo.go +++ b/database/deployment/list_repo.go @@ -46,7 +46,7 @@ func (e *engine) ListDeploymentsForRepo(ctx context.Context, r *library.Repo, pa // https://golang.org/doc/faq#closures_and_goroutines tmp := deployment - builds := new([]library.Build) + builds := []*library.Build{} for _, a := range tmp.Builds { bID, err := strconv.ParseInt(a, 10, 64) @@ -65,7 +65,7 @@ func (e *engine) ListDeploymentsForRepo(ctx context.Context, r *library.Repo, pa if err2 != nil { return nil, err } - *builds = append(*builds, *b.ToLibrary()) + builds = append(builds, b.ToLibrary()) } // convert query result to library type diff --git a/database/deployment/list_repo_test.go b/database/deployment/list_repo_test.go index d88057f76..8913954a8 100644 --- a/database/deployment/list_repo_test.go +++ b/database/deployment/list_repo_test.go @@ -20,7 +20,7 @@ func TestDeployment_Engine_ListDeploymentsForRepo(t *testing.T) { _repo.SetName("bar") _repo.SetFullName("foo/bar") - builds := new([]library.Build) + builds := []*library.Build{} // setup types _deploymentOne := testDeployment() @@ -28,13 +28,14 @@ func TestDeployment_Engine_ListDeploymentsForRepo(t *testing.T) { _deploymentOne.SetRepoID(1) _deploymentOne.SetNumber(1) _deploymentOne.SetURL("https://github.com/github/octocat/deployments/1") - _deploymentOne.SetUser("octocat") _deploymentOne.SetCommit("48afb5bdc41ad69bf22588491333f7cf71135163") _deploymentOne.SetRef("refs/heads/master") _deploymentOne.SetTask("vela-deploy") _deploymentOne.SetTarget("production") _deploymentOne.SetDescription("Deployment request from Vela") _deploymentOne.SetPayload(map[string]string{"foo": "test1"}) + _deploymentOne.SetCreatedAt(1) + _deploymentOne.SetCreatedBy("octocat") _deploymentOne.SetBuilds(builds) _deploymentTwo := testDeployment() @@ -42,13 +43,14 @@ func TestDeployment_Engine_ListDeploymentsForRepo(t *testing.T) { _deploymentTwo.SetRepoID(2) _deploymentTwo.SetNumber(2) _deploymentTwo.SetURL("https://github.com/github/octocat/deployments/2") - _deploymentTwo.SetUser("octocat") _deploymentTwo.SetCommit("48afb5bdc41ad69bf22588491333f7cf71135164") _deploymentTwo.SetRef("refs/heads/master") _deploymentTwo.SetTask("vela-deploy") _deploymentTwo.SetTarget("production") _deploymentTwo.SetDescription("Deployment request from Vela") _deploymentTwo.SetPayload(map[string]string{"foo": "test1"}) + _deploymentTwo.SetCreatedAt(1) + _deploymentTwo.SetCreatedBy("octocat") _deploymentTwo.SetBuilds(builds) _postgres, _mock := testPostgres(t) @@ -56,8 +58,8 @@ func TestDeployment_Engine_ListDeploymentsForRepo(t *testing.T) { // create expected result in mock _rows := sqlmock.NewRows( - []string{"id", "repo_id", "number", "url", "user", "commit", "ref", "task", "target", "description", "payload", "builds"}). - AddRow(1, 1, 1, "https://github.com/github/octocat/deployments/1", "octocat", "48afb5bdc41ad69bf22588491333f7cf71135163", "refs/heads/master", "vela-deploy", "production", "Deployment request from Vela", "{\"foo\":\"test1\"}", "{}") + []string{"id", "repo_id", "number", "url", "commit", "ref", "task", "target", "description", "payload", "created_at", "created_by", "builds"}). + AddRow(1, 1, 1, "https://github.com/github/octocat/deployments/1", "48afb5bdc41ad69bf22588491333f7cf71135163", "refs/heads/master", "vela-deploy", "production", "Deployment request from Vela", "{\"foo\":\"test1\"}", 1, "octocat", "{}") // ensure the mock expects the query _mock.ExpectQuery(`SELECT * FROM "deployments" WHERE repo_id = $1 ORDER BY id DESC LIMIT 10`).WithArgs(1).WillReturnRows(_rows) diff --git a/database/deployment/list_test.go b/database/deployment/list_test.go index 7021cb3b2..db69737fb 100644 --- a/database/deployment/list_test.go +++ b/database/deployment/list_test.go @@ -14,7 +14,7 @@ import ( ) func TestDeployment_Engine_ListDeployments(t *testing.T) { - builds := new([]library.Build) + builds := []*library.Build{} // setup types _deploymentOne := testDeployment() @@ -22,13 +22,14 @@ func TestDeployment_Engine_ListDeployments(t *testing.T) { _deploymentOne.SetRepoID(1) _deploymentOne.SetNumber(1) _deploymentOne.SetURL("https://github.com/github/octocat/deployments/1") - _deploymentOne.SetUser("octocat") _deploymentOne.SetCommit("48afb5bdc41ad69bf22588491333f7cf71135163") _deploymentOne.SetRef("refs/heads/master") _deploymentOne.SetTask("vela-deploy") _deploymentOne.SetTarget("production") _deploymentOne.SetDescription("Deployment request from Vela") _deploymentOne.SetPayload(map[string]string{"foo": "test1"}) + _deploymentOne.SetCreatedAt(1) + _deploymentOne.SetCreatedBy("octocat") _deploymentOne.SetBuilds(builds) _deploymentTwo := testDeployment() @@ -36,13 +37,14 @@ func TestDeployment_Engine_ListDeployments(t *testing.T) { _deploymentTwo.SetRepoID(2) _deploymentTwo.SetNumber(2) _deploymentTwo.SetURL("https://github.com/github/octocat/deployments/2") - _deploymentTwo.SetUser("octocat") _deploymentTwo.SetCommit("48afb5bdc41ad69bf22588491333f7cf71135164") _deploymentTwo.SetRef("refs/heads/master") _deploymentTwo.SetTask("vela-deploy") _deploymentTwo.SetTarget("production") _deploymentTwo.SetDescription("Deployment request from Vela") _deploymentTwo.SetPayload(map[string]string{"foo": "test1"}) + _deploymentTwo.SetCreatedAt(1) + _deploymentTwo.SetCreatedBy("octocat") _deploymentTwo.SetBuilds(builds) _postgres, _mock := testPostgres(t) @@ -50,9 +52,9 @@ func TestDeployment_Engine_ListDeployments(t *testing.T) { // create expected result in mock _rows := sqlmock.NewRows( - []string{"id", "repo_id", "number", "url", "user", "commit", "ref", "task", "target", "description", "payload", "builds"}). - AddRow(1, 1, 1, "https://github.com/github/octocat/deployments/1", "octocat", "48afb5bdc41ad69bf22588491333f7cf71135163", "refs/heads/master", "vela-deploy", "production", "Deployment request from Vela", "{\"foo\":\"test1\"}", "{}"). - AddRow(2, 2, 2, "https://github.com/github/octocat/deployments/2", "octocat", "48afb5bdc41ad69bf22588491333f7cf71135164", "refs/heads/master", "vela-deploy", "production", "Deployment request from Vela", "{\"foo\":\"test1\"}", "{}") + []string{"id", "repo_id", "number", "url", "commit", "ref", "task", "target", "description", "payload", "created_at", "created_by", "builds"}). + AddRow(1, 1, 1, "https://github.com/github/octocat/deployments/1", "48afb5bdc41ad69bf22588491333f7cf71135163", "refs/heads/master", "vela-deploy", "production", "Deployment request from Vela", "{\"foo\":\"test1\"}", 1, "octocat", "{}"). + AddRow(2, 2, 2, "https://github.com/github/octocat/deployments/2", "48afb5bdc41ad69bf22588491333f7cf71135164", "refs/heads/master", "vela-deploy", "production", "Deployment request from Vela", "{\"foo\":\"test1\"}", 1, "octocat", "{}") // ensure the mock expects the query _mock.ExpectQuery(`SELECT * FROM "deployments"`).WillReturnRows(_rows) diff --git a/database/deployment/table.go b/database/deployment/table.go index 68c277b1d..9f2a6381b 100644 --- a/database/deployment/table.go +++ b/database/deployment/table.go @@ -20,13 +20,14 @@ deployments ( repo_id INTEGER, number INTEGER, url VARCHAR(500), - "user" VARCHAR(250), commit VARCHAR(500), ref VARCHAR(500), task VARCHAR(500), target VARCHAR(500), description VARCHAR(2500), payload VARCHAR(2500), + created_at INTEGER, + created_by VARCHAR(250), builds VARCHAR(50), UNIQUE(repo_id, number) ); @@ -41,13 +42,14 @@ deployments ( repo_id INTEGER, number INTEGER, url VARCHAR(1000), - "user" VARCHAR(250), "commit" VARCHAR(500), ref VARCHAR(500), task VARCHAR(500), target VARCHAR(500), description VARCHAR(2500), payload VARCHAR(2500), + created_at INTEGER, + created_by VARCHAR(250), builds VARCHAR(50), UNIQUE(repo_id, number) ); diff --git a/database/deployment/update_test.go b/database/deployment/update_test.go index 6e0ad350b..392863649 100644 --- a/database/deployment/update_test.go +++ b/database/deployment/update_test.go @@ -13,7 +13,7 @@ import ( ) func TestDeployment_Engine_UpdateDeployment(t *testing.T) { - builds := new([]library.Build) + builds := []*library.Build{} // setup types _deploymentOne := testDeployment() @@ -21,13 +21,14 @@ func TestDeployment_Engine_UpdateDeployment(t *testing.T) { _deploymentOne.SetRepoID(1) _deploymentOne.SetNumber(1) _deploymentOne.SetURL("https://github.com/github/octocat/deployments/1") - _deploymentOne.SetUser("octocat") _deploymentOne.SetCommit("48afb5bdc41ad69bf22588491333f7cf71135163") _deploymentOne.SetRef("refs/heads/master") _deploymentOne.SetTask("vela-deploy") _deploymentOne.SetTarget("production") _deploymentOne.SetDescription("Deployment request from Vela") _deploymentOne.SetPayload(map[string]string{"foo": "test1"}) + _deploymentOne.SetCreatedAt(1) + _deploymentOne.SetCreatedBy("octocat") _deploymentOne.SetBuilds(builds) _postgres, _mock := testPostgres(t) @@ -35,9 +36,9 @@ func TestDeployment_Engine_UpdateDeployment(t *testing.T) { // ensure the mock expects the query _mock.ExpectExec(`UPDATE "deployments" -SET "number"=$1,"repo_id"=$2,"url"=$3,"user"=$4,"commit"=$5,"ref"=$6,"task"=$7,"target"=$8,"description"=$9,"payload"=$10,"builds"=$11 -WHERE "id" = $12`). - WithArgs(1, 1, "https://github.com/github/octocat/deployments/1", "octocat", "48afb5bdc41ad69bf22588491333f7cf71135163", "refs/heads/master", "vela-deploy", "production", "Deployment request from Vela", "{\"foo\":\"test1\"}", "{}", 1). +SET "number"=$1,"repo_id"=$2,"url"=$3,"commit"=$4,"ref"=$5,"task"=$6,"target"=$7,"description"=$8,"payload"=$9,"created_at"=$10,"created_by"=$11,"builds"=$12 +WHERE "id" = $13`). + WithArgs(1, 1, "https://github.com/github/octocat/deployments/1", "48afb5bdc41ad69bf22588491333f7cf71135163", "refs/heads/master", "vela-deploy", "production", "Deployment request from Vela", "{\"foo\":\"test1\"}", 1, "octocat", "{}", 1). WillReturnResult(sqlmock.NewResult(1, 1)) _sqlite := testSqlite(t) diff --git a/scm/github/deployment.go b/scm/github/deployment.go index 7120e5e7a..91e2e4d25 100644 --- a/scm/github/deployment.go +++ b/scm/github/deployment.go @@ -4,149 +4,13 @@ package github import ( "context" - "encoding/json" "github.com/sirupsen/logrus" "github.com/go-vela/types/library" - "github.com/go-vela/types/raw" "github.com/google/go-github/v56/github" ) -// GetDeployment gets a deployment from the GitHub repo. -func (c *client) GetDeployment(ctx context.Context, u *library.User, r *library.Repo, id int64) (*library.Deployment, error) { - c.Logger.WithFields(logrus.Fields{ - "org": r.GetOrg(), - "repo": r.GetName(), - "user": u.GetName(), - }).Tracef("capturing deployment %d for repo %s", id, r.GetFullName()) - - // create GitHub OAuth client with user's token - client := c.newClientToken(*u.Token) - - // send API call to capture the deployment - deployment, _, err := client.Repositories.GetDeployment(ctx, r.GetOrg(), r.GetName(), id) - if err != nil { - return nil, err - } - - var payload *raw.StringSliceMap - - err = json.Unmarshal(deployment.Payload, &payload) - if err != nil { - c.Logger.Tracef("Unable to unmarshal payload for deployment id %v", deployment.ID) - } - - return &library.Deployment{ - ID: deployment.ID, - RepoID: r.ID, - URL: deployment.URL, - User: deployment.Creator.Login, - Commit: deployment.SHA, - Ref: deployment.Ref, - Task: deployment.Task, - Target: deployment.Environment, - Description: deployment.Description, - Payload: payload, - }, nil -} - -// GetDeploymentCount counts a list of deployments from the GitHub repo. -func (c *client) GetDeploymentCount(ctx context.Context, u *library.User, r *library.Repo) (int64, error) { - c.Logger.WithFields(logrus.Fields{ - "org": r.GetOrg(), - "repo": r.GetName(), - "user": u.GetName(), - }).Tracef("counting deployments for repo %s", r.GetFullName()) - - // create GitHub OAuth client with user's token - client := c.newClientToken(*u.Token) - // create variable to track the deployments - deployments := []*github.Deployment{} - - // set pagination options for listing deployments - opts := &github.DeploymentsListOptions{ - // set the max per page for the options - // to capture the list of deployments - ListOptions: github.ListOptions{ - PerPage: 100, // 100 is max - }, - } - - for { - // send API call to capture the list of deployments - d, resp, err := client.Repositories.ListDeployments(ctx, r.GetOrg(), r.GetName(), opts) - if err != nil { - return 0, err - } - - deployments = append(deployments, d...) - - // break the loop if there is no more results to page through - if resp.NextPage == 0 { - break - } - - opts.Page = resp.NextPage - } - - return int64(len(deployments)), nil -} - -// GetDeploymentList gets a list of deployments from the GitHub repo. -func (c *client) GetDeploymentList(ctx context.Context, u *library.User, r *library.Repo, page, perPage int) ([]*library.Deployment, error) { - c.Logger.WithFields(logrus.Fields{ - "org": r.GetOrg(), - "repo": r.GetName(), - "user": u.GetName(), - }).Tracef("listing deployments for repo %s", r.GetFullName()) - - // create GitHub OAuth client with user's token - client := c.newClientToken(*u.Token) - - // set pagination options for listing deployments - opts := &github.DeploymentsListOptions{ - ListOptions: github.ListOptions{ - Page: page, - PerPage: perPage, - }, - } - - // send API call to capture the list of deployments - d, _, err := client.Repositories.ListDeployments(ctx, r.GetOrg(), r.GetName(), opts) - if err != nil { - return nil, err - } - - // variable we want to return - deployments := []*library.Deployment{} - - // iterate through all API results - for _, deployment := range d { - var payload *raw.StringSliceMap - - err := json.Unmarshal(deployment.Payload, &payload) - if err != nil { - c.Logger.Tracef("Unable to unmarshal payload for deployment id %v", deployment.ID) - } - // convert query result to library type - deployments = append(deployments, &library.Deployment{ - ID: deployment.ID, - RepoID: r.ID, - URL: deployment.URL, - User: deployment.Creator.Login, - Commit: deployment.SHA, - Ref: deployment.Ref, - Task: deployment.Task, - Target: deployment.Environment, - Description: deployment.Description, - Payload: payload, - }) - } - - return deployments, nil -} - // CreateDeployment creates a new deployment for the GitHub repo. func (c *client) CreateDeployment(ctx context.Context, u *library.User, r *library.Repo, d *library.Deployment) error { c.Logger.WithFields(logrus.Fields{ @@ -185,7 +49,6 @@ func (c *client) CreateDeployment(ctx context.Context, u *library.User, r *libra d.SetNumber(deploy.GetID()) d.SetRepoID(r.GetID()) d.SetURL(deploy.GetURL()) - d.SetUser(deploy.GetCreator().GetLogin()) d.SetCommit(deploy.GetSHA()) d.SetRef(deploy.GetRef()) d.SetTask(deploy.GetTask()) diff --git a/scm/github/deployment_test.go b/scm/github/deployment_test.go index 4558bb783..378a2417a 100644 --- a/scm/github/deployment_test.go +++ b/scm/github/deployment_test.go @@ -6,11 +6,8 @@ import ( "context" "net/http" "net/http/httptest" - "reflect" "testing" - "github.com/go-vela/types/raw" - "github.com/gin-gonic/gin" "github.com/go-vela/types/library" @@ -48,7 +45,6 @@ func TestGithub_CreateDeployment(t *testing.T) { d.SetID(1) d.SetRepoID(1) d.SetURL("https://api.github.com/repos/foo/bar/deployments/1") - d.SetUser("octocat") d.SetCommit("a84d88e7554fc1fa21bcbc4efae3c782a70d2b9d") d.SetRef("topic-branch") d.SetTask("deploy") @@ -68,181 +64,3 @@ func TestGithub_CreateDeployment(t *testing.T) { t.Errorf("CreateDeployment returned err: %v", err) } } - -func TestGithub_GetDeployment(t *testing.T) { - // setup context - gin.SetMode(gin.TestMode) - - resp := httptest.NewRecorder() - _, engine := gin.CreateTestContext(resp) - - // setup mock server - engine.GET("/api/v3/repos/:org/:repo/deployments/:deployment", func(c *gin.Context) { - c.Header("Content-Type", "application/json") - c.Status(http.StatusOK) - c.File("testdata/deployment.json") - }) - - s := httptest.NewServer(engine) - defer s.Close() - - // setup types - u := new(library.User) - u.SetName("foo") - u.SetToken("bar") - - r := new(library.Repo) - r.SetID(1) - r.SetOrg("foo") - r.SetName("bar") - r.SetFullName("foo/bar") - - want := new(library.Deployment) - want.SetID(1) - want.SetRepoID(1) - want.SetURL("https://api.github.com/repos/foo/bar/deployments/1") - want.SetUser("octocat") - want.SetCommit("a84d88e7554fc1fa21bcbc4efae3c782a70d2b9d") - want.SetRef("topic-branch") - want.SetTask("deploy") - want.SetTarget("production") - want.SetDescription("Deploy request from Vela") - want.SetPayload(raw.StringSliceMap{"deploy": "migrate"}) - - client, _ := NewTest(s.URL, "https://foo.bar.com") - - // run test - got, err := client.GetDeployment(context.TODO(), u, r, 1) - - if resp.Code != http.StatusOK { - t.Errorf("GetDeployment returned %v, want %v", resp.Code, http.StatusOK) - } - - if err != nil { - t.Errorf("GetDeployment returned err: %v", err) - } - - if !reflect.DeepEqual(got, want) { - t.Errorf("GetDeployment is %v, want %v", got, want) - } -} - -func TestGithub_GetDeploymentCount(t *testing.T) { - // setup context - gin.SetMode(gin.TestMode) - - resp := httptest.NewRecorder() - _, engine := gin.CreateTestContext(resp) - - // setup mock server - engine.GET("/api/v3/repos/:org/:repo/deployments", func(c *gin.Context) { - c.Header("Content-Type", "application/json") - c.Status(http.StatusOK) - c.File("testdata/deployments.json") - }) - - s := httptest.NewServer(engine) - defer s.Close() - - // setup types - u := new(library.User) - u.SetName("foo") - u.SetToken("bar") - - r := new(library.Repo) - r.SetID(1) - r.SetOrg("foo") - r.SetName("bar") - r.SetFullName("foo/bar") - - want := int64(2) - - client, _ := NewTest(s.URL, "https://foo.bar.com") - - // run test - got, err := client.GetDeploymentCount(context.TODO(), u, r) - - if resp.Code != http.StatusOK { - t.Errorf("GetDeployment returned %v, want %v", resp.Code, http.StatusOK) - } - - if err != nil { - t.Errorf("GetDeployment returned err: %v", err) - } - - if !reflect.DeepEqual(got, want) { - t.Errorf("GetDeployment is %v, want %v", got, want) - } -} - -func TestGithub_GetDeploymentList(t *testing.T) { - // setup context - gin.SetMode(gin.TestMode) - - resp := httptest.NewRecorder() - _, engine := gin.CreateTestContext(resp) - - // setup mock server - engine.GET("/api/v3/repos/:org/:repo/deployments", func(c *gin.Context) { - c.Header("Content-Type", "application/json") - c.Status(http.StatusOK) - c.File("testdata/deployments.json") - }) - - s := httptest.NewServer(engine) - defer s.Close() - - // setup types - u := new(library.User) - u.SetName("foo") - u.SetToken("bar") - - r := new(library.Repo) - r.SetID(1) - r.SetOrg("foo") - r.SetName("bar") - r.SetFullName("foo/bar") - - d1 := new(library.Deployment) - d1.SetID(1) - d1.SetRepoID(1) - d1.SetURL("https://api.github.com/repos/foo/bar/deployments/1") - d1.SetUser("octocat") - d1.SetCommit("a84d88e7554fc1fa21bcbc4efae3c782a70d2b9d") - d1.SetRef("topic-branch") - d1.SetTask("deploy") - d1.SetTarget("production") - d1.SetDescription("Deploy request from Vela") - d1.SetPayload(nil) - - d2 := new(library.Deployment) - d2.SetID(2) - d2.SetRepoID(1) - d2.SetURL("https://api.github.com/repos/foo/bar/deployments/2") - d2.SetUser("octocat") - d2.SetCommit("a84d88e7554fc1fa21bcbc4efae3c782a70d2b9d") - d2.SetRef("topic-branch") - d2.SetTask("deploy") - d2.SetTarget("production") - d2.SetDescription("Deploy request from Vela") - d2.SetPayload(raw.StringSliceMap{"deploy": "migrate"}) - - want := []*library.Deployment{d2, d1} - - client, _ := NewTest(s.URL, "https://foo.bar.com") - - // run test - got, err := client.GetDeploymentList(context.TODO(), u, r, 1, 100) - - if resp.Code != http.StatusOK { - t.Errorf("GetDeployment returned %v, want %v", resp.Code, http.StatusOK) - } - - if err != nil { - t.Errorf("GetDeployment returned err: %v", err) - } - - if !reflect.DeepEqual(got, want) { - t.Errorf("GetDeployment is %v, want %v", got, want) - } -} diff --git a/scm/github/repo.go b/scm/github/repo.go index b89900f90..d268d1dd4 100644 --- a/scm/github/repo.go +++ b/scm/github/repo.go @@ -72,7 +72,7 @@ func (c *client) Config(ctx context.Context, u *library.User, r *library.Repo, r // send API call to capture the .vela.yml pipeline configuration data, _, resp, err := client.Repositories.GetContents(ctx, r.GetOrg(), r.GetName(), file, opts) if err != nil { - if resp.StatusCode != http.StatusNotFound { + if resp.StatusCode != http.Status { return nil, err } } diff --git a/scm/github/webhook.go b/scm/github/webhook.go index b3807d823..3b06e16d5 100644 --- a/scm/github/webhook.go +++ b/scm/github/webhook.go @@ -15,6 +15,7 @@ import ( "github.com/sirupsen/logrus" + "github.com/go-vela/server/database" "github.com/go-vela/types" "github.com/go-vela/types/constants" "github.com/go-vela/types/library" @@ -32,23 +33,17 @@ func (c *client) ProcessWebhook(ctx context.Context, request *http.Request) (*ty h.SetNumber(1) h.SetSourceID(request.Header.Get("X-GitHub-Delivery")) - logrus.Debugf("CUCUMBER") - hookID, err := strconv.Atoi(request.Header.Get("X-GitHub-Hook-ID")) if err != nil { return nil, fmt.Errorf("unable to convert hook id to int64: %w", err) } - logrus.Debugf("PUMPKIN") - h.SetWebhookID(int64(hookID)) h.SetCreated(time.Now().UTC().Unix()) h.SetHost("github.com") h.SetEvent(request.Header.Get("X-GitHub-Event")) h.SetStatus(constants.StatusSuccess) - logrus.Debugf("CARRORT") - if len(request.Header.Get("X-GitHub-Enterprise-Host")) > 0 { h.SetHost(request.Header.Get("X-GitHub-Enterprise-Host")) } @@ -78,7 +73,7 @@ func (c *client) ProcessWebhook(ctx context.Context, request *http.Request) (*ty case *github.PullRequestEvent: return c.processPREvent(h, event) case *github.DeploymentEvent: - return c.processDeploymentEvent(h, event) + return c.processDeploymentEvent(ctx, h, event, db) case *github.IssueCommentEvent: return c.processIssueCommentEvent(h, event) case *github.RepositoryEvent: @@ -299,14 +294,12 @@ func (c *client) processPREvent(h *library.Hook, payload *github.PullRequestEven } // processDeploymentEvent is a helper function to process the deployment event. -func (c *client) processDeploymentEvent(h *library.Hook, payload *github.DeploymentEvent) (*types.Webhook, error) { +func (c *client) processDeploymentEvent(ctx context.Context, h *library.Hook, payload *github.DeploymentEvent, db database.Interface) (*types.Webhook, error) { c.Logger.WithFields(logrus.Fields{ "org": payload.GetRepo().GetOwner().GetLogin(), "repo": payload.GetRepo().GetName(), }).Tracef("processing deployment GitHub webhook for %s", payload.GetRepo().GetFullName()) - logrus.Debugf("PINEAPPLE") - // capture the repo from the payload repo := payload.GetRepo() @@ -337,6 +330,18 @@ func (c *client) processDeploymentEvent(h *library.Hook, payload *github.Deploym b.SetBranch(payload.GetDeployment().GetRef()) b.SetRef(payload.GetDeployment().GetRef()) + d := new(library.Deployment) + + d.SetNumber(payload.GetDeployment().GetID()) + d.SetURL(payload.GetDeployment().GetURL()) + d.SetCommit(payload.GetDeployment().GetSHA()) + d.SetRef(payload.GetDeployment().GetRef()) + d.SetTask(payload.GetDeployment().GetTask()) + d.SetTarget(payload.GetDeployment().GetEnvironment()) + d.SetDescription(payload.GetDeployment().GetDescription()) + d.SetCreatedAt(time.Now().Unix()) + d.SetCreatedBy(payload.GetDeployment().GetCreator().GetLogin()) + // check if payload is provided within request // // use a length of 2 because the payload will @@ -381,10 +386,10 @@ func (c *client) processDeploymentEvent(h *library.Hook, payload *github.Deploym ) return &types.Webhook{ - Hook: h, - Repo: r, - Build: b, - DeploymentID: payload.GetDeployment().ID, + Hook: h, + Repo: r, + Build: b, + Deployment: d, }, nil }