-
Notifications
You must be signed in to change notification settings - Fork 9
/
push.go
121 lines (109 loc) · 4.02 KB
/
push.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
115
116
117
118
119
120
121
package event
import (
"context"
"time"
configv1alpha1 "github.com/padok-team/burrito/api/v1alpha1"
"github.com/padok-team/burrito/internal/annotations"
controller "github.com/padok-team/burrito/internal/controllers/terraformlayer"
utils "github.com/padok-team/burrito/internal/utils/url"
log "github.com/sirupsen/logrus"
"sigs.k8s.io/controller-runtime/pkg/client"
)
type PushEvent struct {
URL string
Revision string
ChangeInfo
Changes []string
}
func (e *PushEvent) Handle(c client.Client) error {
date := time.Now().Format(time.UnixDate)
repositories := &configv1alpha1.TerraformRepositoryList{}
err := c.List(context.Background(), repositories)
if err != nil {
log.Errorf("could not list terraform repositories: %s", err)
return err
}
layers := &configv1alpha1.TerraformLayerList{}
err = c.List(context.Background(), layers)
if err != nil {
log.Errorf("could not list terraform layers: %s", err)
return err
}
prs := &configv1alpha1.TerraformPullRequestList{}
err = c.List(context.Background(), prs)
if err != nil {
log.Errorf("could not list terraform prs: %s", err)
return err
}
affectedRepositories := e.getAffectedRepositories(repositories.Items)
for _, repo := range affectedRepositories {
ann := map[string]string{}
ann[annotations.LastBranchCommit] = e.ChangeInfo.ShaAfter
ann[annotations.LastBranchCommitDate] = date
err := annotations.Add(context.TODO(), c, &repo, ann)
if err != nil {
log.Errorf("could not add annotation to terraform repository %s", err)
return err
}
}
for _, layer := range e.getAffectedLayers(layers.Items, affectedRepositories) {
ann := map[string]string{}
log.Printf("evaluating terraform layer %s for revision %s", layer.Name, e.Revision)
if layer.Spec.Branch != e.Revision {
log.Infof("branch %s for terraform layer %s not matching revision %s", layer.Spec.Branch, layer.Name, e.Revision)
continue
}
ann[annotations.LastBranchCommit] = e.ChangeInfo.ShaAfter
ann[annotations.LastBranchCommitDate] = date
if controller.LayerFilesHaveChanged(layer, e.Changes) {
log.Infof("layer %s is affected by push event", layer.Name)
ann[annotations.LastRelevantCommit] = e.ChangeInfo.ShaAfter
ann[annotations.LastRelevantCommitDate] = date
}
err := annotations.Add(context.TODO(), c, &layer, ann)
if err != nil {
log.Errorf("could not add annotation to terraform layer %s", err)
return err
}
}
for _, pr := range e.getAffectedPullRequests(prs.Items, affectedRepositories) {
ann := map[string]string{}
ann[annotations.LastBranchCommit] = e.ChangeInfo.ShaAfter
ann[annotations.LastBranchCommitDate] = date
err := annotations.Add(context.TODO(), c, &pr, ann)
if err != nil {
log.Errorf("could not add annotation to terraform pr %s", err)
return err
}
}
return nil
}
func (e *PushEvent) getAffectedRepositories(repositories []configv1alpha1.TerraformRepository) []configv1alpha1.TerraformRepository {
affectedRepositories := []configv1alpha1.TerraformRepository{}
log.Infof("looking for affected repositories, event url: %s", e.URL)
for _, repo := range repositories {
if e.URL == utils.NormalizeUrl(repo.Spec.Repository.Url) {
affectedRepositories = append(affectedRepositories, repo)
continue
}
}
return affectedRepositories
}
func (e *PushEvent) getAffectedLayers(allLayers []configv1alpha1.TerraformLayer, affectedRepositories []configv1alpha1.TerraformRepository) []configv1alpha1.TerraformLayer {
layers := []configv1alpha1.TerraformLayer{}
for _, layer := range allLayers {
if isLayerLinkedToAnyRepositories(affectedRepositories, layer) {
layers = append(layers, layer)
}
}
return layers
}
func (e *PushEvent) getAffectedPullRequests(prs []configv1alpha1.TerraformPullRequest, affectedRepositories []configv1alpha1.TerraformRepository) []configv1alpha1.TerraformPullRequest {
affectedPRs := []configv1alpha1.TerraformPullRequest{}
for _, pr := range prs {
if isPRLinkedToAnyRepositories(pr, affectedRepositories) && pr.Spec.Branch == e.Revision {
affectedPRs = append(affectedPRs, pr)
}
}
return affectedPRs
}