-
Notifications
You must be signed in to change notification settings - Fork 9
/
pullrequest.go
114 lines (104 loc) · 3.51 KB
/
pullrequest.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package event
import (
"context"
"fmt"
utils "github.com/padok-team/burrito/internal/utils/url"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
configv1alpha1 "github.com/padok-team/burrito/api/v1alpha1"
"github.com/padok-team/burrito/internal/annotations"
log "github.com/sirupsen/logrus"
"sigs.k8s.io/controller-runtime/pkg/client"
"github.com/hashicorp/go-multierror"
)
type PullRequestEvent struct {
Provider string
URL string
Revision string
Base string
Action string
ID string
Commit string
}
func (e *PullRequestEvent) Handle(c client.Client) error {
repositories := &configv1alpha1.TerraformRepositoryList{}
err := c.List(context.Background(), repositories)
if err != nil {
log.Errorf("could not list terraform repositories: %s", err)
return err
}
affectedRepositories := e.getAffectedRepositories(repositories.Items)
if len(affectedRepositories) == 0 {
log.Infof("no affected repositories found for pull request event")
return nil
}
prs := e.generateTerraformPullRequests(affectedRepositories)
switch e.Action {
case PullRequestOpened:
return batchCreatePullRequests(context.TODO(), c, prs)
case PullRequestClosed:
return batchDeletePullRequests(context.TODO(), c, prs)
default:
log.Infof("action %s not supported", e.Action)
}
return nil
}
func batchCreatePullRequests(ctx context.Context, c client.Client, prs []configv1alpha1.TerraformPullRequest) error {
var errResult error
for _, pr := range prs {
log.Infof("creating terraform pull request %s/%s", pr.Namespace, pr.Name)
err := c.Create(ctx, &pr)
if err != nil {
errResult = multierror.Append(errResult, err)
}
}
return errResult
}
func batchDeletePullRequests(ctx context.Context, c client.Client, prs []configv1alpha1.TerraformPullRequest) error {
var errResult error
for _, pr := range prs {
log.Infof("deleting terraform pull request %s/%s", pr.Namespace, pr.Name)
err := c.Delete(ctx, &pr)
if err != nil {
errResult = multierror.Append(errResult, err)
}
}
return errResult
}
func (e *PullRequestEvent) generateTerraformPullRequests(repositories []configv1alpha1.TerraformRepository) []configv1alpha1.TerraformPullRequest {
prs := []configv1alpha1.TerraformPullRequest{}
for _, repository := range repositories {
pr := configv1alpha1.TerraformPullRequest{
ObjectMeta: metav1.ObjectMeta{
Name: fmt.Sprintf("%s-%s", repository.Name, e.ID),
Namespace: repository.Namespace,
Annotations: map[string]string{
annotations.LastBranchCommit: e.Commit,
},
},
Spec: configv1alpha1.TerraformPullRequestSpec{
Provider: e.Provider,
Branch: e.Revision,
ID: e.ID,
Base: e.Base,
Repository: configv1alpha1.TerraformLayerRepository{
Name: repository.Name,
Namespace: repository.Namespace,
},
},
}
prs = append(prs, pr)
}
return prs
}
// Function that checks if any TerraformRepository is linked to a PullRequestEvent
func (e *PullRequestEvent) getAffectedRepositories(repositories []configv1alpha1.TerraformRepository) []configv1alpha1.TerraformRepository {
affectedRepositories := []configv1alpha1.TerraformRepository{}
for _, repo := range repositories {
log.Infof("evaluating terraform repository %s for url %s", repo.Name, repo.Spec.Repository.Url)
log.Infof("comparing normalized url %s with received URL from payload %s", utils.NormalizeUrl(repo.Spec.Repository.Url), e.URL)
if e.URL == utils.NormalizeUrl(repo.Spec.Repository.Url) {
affectedRepositories = append(affectedRepositories, repo)
}
}
return affectedRepositories
}