@@ -77,6 +77,10 @@ type ResourceBuilderT struct {
77
77
name string
78
78
logLevel string
79
79
pipelineName string
80
+
81
+ // cache
82
+ builtResources * Resources
83
+ buildErr error
80
84
}
81
85
82
86
func (r * ResourceBuilderT ) WithCluster (clusterId string ) ResourceBuilder {
@@ -123,66 +127,71 @@ func (r *ResourceBuilderT) WithLogger(logLevel string, pipelineName string) Reso
123
127
}
124
128
125
129
func (r * ResourceBuilderT ) Build () (* Resources , error ) {
126
- var awsClient aws.Client
127
- var cluster * cmv1.Cluster
128
- var clusterDeployment * hivev1.ClusterDeployment
129
- var notes * notewriter.NoteWriter
130
- var internalClusterId string
130
+ if r .buildErr != nil {
131
+ return nil , r .buildErr
132
+ }
133
+
134
+ if r .builtResources == nil {
135
+ r .builtResources = & Resources {
136
+ Name : r .name ,
137
+ OcmClient : r .ocmClient ,
138
+ PdClient : r .pdClient ,
139
+ }
140
+ }
141
+
131
142
var err error
132
143
133
144
if r .buildClusterDeployment && ! r .buildCluster {
134
- return nil , errors .New ("can not build ClusterDeployment without Cluster" )
145
+ r .buildErr = errors .New ("cannot build ClusterDeployment without Cluster" )
146
+ return nil , r .buildErr
147
+ }
148
+ if r .buildAwsClient && ! r .buildCluster {
149
+ r .buildErr = errors .New ("cannot build AwsClient without Cluster" )
150
+ return nil , r .buildErr
135
151
}
136
152
137
- if r .buildAwsClient {
138
- awsClient , err = managedcloud . CreateCustomerAWSClient ( cluster , r . ocmClient )
153
+ if r .buildCluster && r . builtResources . Cluster == nil {
154
+ r . builtResources . Cluster , err = r . ocmClient . GetClusterInfo ( r . clusterId )
139
155
if err != nil {
156
+ // Let the caller handle how to respond to this error.
157
+ err = fmt .Errorf ("could not retrieve cluster info for %s: %w" , r .clusterId , err )
158
+ r .buildErr = err
140
159
return nil , err
141
160
}
142
161
}
143
162
144
- if r .buildCluster {
145
- cluster , err = r .ocmClient .GetClusterInfo (r .clusterId )
146
- if err != nil {
147
- if strings .Contains (err .Error (), "no cluster found" ) {
148
- logging .Warnf ("No cluster found with ID '%s'. Exiting." , r .clusterId )
149
- err = r .pdClient .EscalateIncidentWithNote ("CAD was unable to find the incident cluster in OCM. An alert for a non-existing cluster is unexpected. Please investigate manually." )
150
- logging .Errorf ("Could not escalate via PagerDuty: " , err )
151
- return nil , errors .New ("unable to find incident cluster in OCM" )
163
+ // Dependent resources can only be built if a cluster object exists.
164
+ if r .builtResources .Cluster != nil {
165
+ internalClusterId := r .builtResources .Cluster .ID ()
166
+
167
+ if r .buildAwsClient && r .builtResources .AwsClient == nil {
168
+ r .builtResources .AwsClient , err = managedcloud .CreateCustomerAWSClient (r .builtResources .Cluster , r .ocmClient )
169
+ if err != nil {
170
+ r .buildErr = err
171
+ return nil , err
152
172
}
153
- return nil , fmt .Errorf ("could not retrieve cluster info for %s: %w" , r .clusterId , err )
154
173
}
155
174
156
- // From this point on, we normalize to internal ID, as this ID always exists.
157
- // For installing clusters, externalID can be empty.
158
- internalClusterId = cluster .ID ()
159
- }
160
-
161
- if r .buildClusterDeployment {
162
- clusterDeployment , err = r .ocmClient .GetClusterDeployment (internalClusterId )
163
- if err != nil {
164
- return nil , fmt .Errorf ("could not retrieve Cluster Deployment for %s: %w" , internalClusterId , err )
175
+ if r .buildClusterDeployment && r .builtResources .ClusterDeployment == nil {
176
+ r .builtResources .ClusterDeployment , err = r .ocmClient .GetClusterDeployment (internalClusterId )
177
+ if err != nil {
178
+ err = fmt .Errorf ("could not retrieve Cluster Deployment for %s: %w" , internalClusterId , err )
179
+ r .buildErr = err
180
+ return nil , err
181
+ }
165
182
}
166
- }
167
183
168
- if r .buildLogger {
169
- logging .RawLogger = logging .InitLogger (r .logLevel , "" , internalClusterId )
184
+ if r .buildLogger {
185
+ // Re-initialize the logger with the cluster ID.
186
+ logging .RawLogger = logging .InitLogger (r .logLevel , "" , internalClusterId )
187
+ }
170
188
}
171
189
172
- if r .buildNotes {
173
- // Initialize NoteWriter with sane defaults
174
- notes = notewriter .New (r .name , logging .RawLogger )
190
+ if r .buildNotes && r .builtResources .Notes == nil {
191
+ r .builtResources .Notes = notewriter .New (r .name , logging .RawLogger )
175
192
}
176
193
177
- return & Resources {
178
- Name : r .name ,
179
- Cluster : cluster ,
180
- ClusterDeployment : clusterDeployment ,
181
- AwsClient : awsClient ,
182
- OcmClient : r .ocmClient ,
183
- PdClient : r .pdClient ,
184
- Notes : notes ,
185
- }, nil
194
+ return r .builtResources , nil
186
195
}
187
196
188
197
// This is an implementation to be used in tests, but putting it into a _test.go file will make it not resolvable.
0 commit comments