forked from vmware-archive/atc
/
resource_instance.go
130 lines (111 loc) · 3.34 KB
/
resource_instance.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
129
130
package resource
import (
"crypto/sha256"
"encoding/json"
"fmt"
"code.cloudfoundry.org/lager"
"github.com/concourse/atc"
"github.com/concourse/atc/creds"
"github.com/concourse/atc/db"
"github.com/concourse/atc/worker"
)
//go:generate counterfeiter . ResourceInstance
type ResourceInstance interface {
Source() atc.Source
Params() atc.Params
Version() atc.Version
ResourceType() ResourceType
ResourceUser() db.ResourceUser
ContainerOwner() db.ContainerOwner
LockName(string) (string, error)
FindOn(lager.Logger, worker.Worker) (worker.Volume, bool, error)
}
type resourceInstance struct {
resourceTypeName ResourceType
version atc.Version
source atc.Source
params atc.Params
resourceUser db.ResourceUser
containerOwner db.ContainerOwner
resourceTypes creds.VersionedResourceTypes
dbResourceCacheFactory db.ResourceCacheFactory
}
func NewResourceInstance(
resourceTypeName ResourceType,
version atc.Version,
source atc.Source,
params atc.Params,
resourceUser db.ResourceUser,
containerOwner db.ContainerOwner,
resourceTypes creds.VersionedResourceTypes,
dbResourceCacheFactory db.ResourceCacheFactory,
) ResourceInstance {
return &resourceInstance{
resourceTypeName: resourceTypeName,
version: version,
source: source,
params: params,
resourceUser: resourceUser,
containerOwner: containerOwner,
resourceTypes: resourceTypes,
dbResourceCacheFactory: dbResourceCacheFactory,
}
}
func (instance resourceInstance) ResourceUser() db.ResourceUser {
return instance.resourceUser
}
func (instance resourceInstance) ContainerOwner() db.ContainerOwner {
return instance.containerOwner
}
func (instance resourceInstance) Source() atc.Source {
return instance.source
}
func (instance resourceInstance) Params() atc.Params {
return instance.params
}
func (instance resourceInstance) Version() atc.Version {
return instance.version
}
func (instance resourceInstance) ResourceType() ResourceType {
return instance.resourceTypeName
}
func (instance resourceInstance) LockName(workerName string) (string, error) {
id := &resourceInstanceLockID{
Type: instance.resourceTypeName,
Version: instance.version,
Source: instance.source,
Params: instance.params,
WorkerName: workerName,
}
taskNameJSON, err := json.Marshal(id)
if err != nil {
return "", err
}
return fmt.Sprintf("%x", sha256.Sum256(taskNameJSON)), nil
}
func (instance resourceInstance) FindOn(logger lager.Logger, workerClient worker.Worker) (worker.Volume, bool, error) {
resourceCache, err := instance.dbResourceCacheFactory.FindOrCreateResourceCache(
logger,
instance.resourceUser,
string(instance.resourceTypeName),
instance.version,
instance.source,
instance.params,
instance.resourceTypes,
)
if err != nil {
logger.Error("failed-to-find-or-volume-resource-cache-for-build", err)
return nil, false, err
}
return workerClient.FindVolumeForResourceCache(
logger,
resourceCache,
)
}
type resourceInstanceLockID struct {
Type ResourceType `json:"type,omitempty"`
Version atc.Version `json:"version,omitempty"`
Source atc.Source `json:"source,omitempty"`
Params atc.Params `json:"params,omitempty"`
WorkerName string `json:"worker_name,omitempty"`
}