forked from vmware-archive/atc
/
exec_engine_build_delegate.go
128 lines (101 loc) · 3.35 KB
/
exec_engine_build_delegate.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
122
123
124
125
126
127
128
package engine
import (
"sync"
"code.cloudfoundry.org/lager"
"github.com/concourse/atc"
"github.com/concourse/atc/db"
"github.com/concourse/atc/event"
"github.com/concourse/atc/exec"
)
//go:generate counterfeiter . BuildDelegate
type BuildDelegate interface {
DBActionsBuildEventsDelegate(atc.PlanID) exec.ActionsBuildEventsDelegate
DBTaskBuildEventsDelegate(atc.PlanID) exec.TaskBuildEventsDelegate
ImageFetchingDelegate(atc.PlanID) exec.ImageFetchingDelegate
Finish(lager.Logger, error, exec.Success, bool)
}
//go:generate counterfeiter . BuildDelegateFactory
type BuildDelegateFactory interface {
Delegate(db.Build) BuildDelegate
}
type buildDelegateFactory struct{}
func NewBuildDelegateFactory() BuildDelegateFactory {
return buildDelegateFactory{}
}
func (factory buildDelegateFactory) Delegate(build db.Build) BuildDelegate {
return newBuildDelegate(build)
}
type delegate struct {
build db.Build
implicitOutputsRepo *implicitOutputsRepo
}
func newBuildDelegate(build db.Build) BuildDelegate {
return &delegate{
build: build,
implicitOutputsRepo: &implicitOutputsRepo{
outputs: make(map[string]implicitOutput),
lock: &sync.Mutex{},
},
}
}
func (delegate *delegate) DBActionsBuildEventsDelegate(
planID atc.PlanID,
) exec.ActionsBuildEventsDelegate {
return NewDBActionsBuildEventsDelegate(delegate.build, event.Origin{ID: event.OriginID(planID)}, delegate.implicitOutputsRepo)
}
func (delegate *delegate) DBTaskBuildEventsDelegate(
planID atc.PlanID,
) exec.TaskBuildEventsDelegate {
return NewDBTaskBuildEventsDelegate(delegate.build, event.Origin{ID: event.OriginID(planID)})
}
func (delegate *delegate) ImageFetchingDelegate(planID atc.PlanID) exec.ImageFetchingDelegate {
return &imageFetchingDelegate{
build: delegate.build,
planID: planID,
}
}
func (delegate *delegate) Finish(logger lager.Logger, err error, succeeded exec.Success, aborted bool) {
if aborted {
delegate.saveStatus(logger, atc.StatusAborted)
logger.Info("aborted")
} else if err != nil {
delegate.saveStatus(logger, atc.StatusErrored)
logger.Info("errored", lager.Data{"error": err.Error()})
} else if bool(succeeded) {
delegate.saveStatus(logger, atc.StatusSucceeded)
implicits := logger.Session("implicit-outputs")
for resourceName, o := range delegate.implicitOutputsRepo.outputs {
delegate.saveImplicitOutput(implicits.Session(resourceName), resourceName, o.resourceType, o.info)
}
logger.Info("succeeded")
} else {
delegate.saveStatus(logger, atc.StatusFailed)
logger.Info("failed")
}
}
func (delegate *delegate) saveStatus(logger lager.Logger, status atc.BuildStatus) {
err := delegate.build.Finish(db.BuildStatus(status))
if err != nil {
logger.Error("failed-to-finish-build", err)
}
}
func (delegate *delegate) saveImplicitOutput(logger lager.Logger, resourceName string, resourceType string, info exec.VersionInfo) {
metadata := make([]db.ResourceMetadataField, len(info.Metadata))
for i, md := range info.Metadata {
metadata[i] = db.ResourceMetadataField{
Name: md.Name,
Value: md.Value,
}
}
err := delegate.build.SaveOutput(db.VersionedResource{
Resource: resourceName,
Type: resourceType,
Version: db.ResourceVersion(info.Version),
Metadata: metadata,
}, false)
if err != nil {
logger.Error("failed-to-save", err)
return
}
logger.Info("saved", lager.Data{"resource": resourceName})
}