@@ -11,6 +11,7 @@ import (
11
11
"net/http"
12
12
"os"
13
13
"path/filepath"
14
+ "strings"
14
15
15
16
kconfig "github.com/GoogleContainerTools/kaniko/pkg/config"
16
17
"github.com/coder/envbuilder"
@@ -245,6 +246,42 @@ func (r *CachedImageResource) Read(ctx context.Context, req resource.ReadRequest
245
246
return
246
247
}
247
248
249
+ data .Image = data .BuilderImage
250
+ if data .Image .IsUnknown () {
251
+ return
252
+ }
253
+
254
+ img , err := getRemoteImage (data .Image .ValueString ())
255
+ if err != nil {
256
+ if ! strings .Contains (err .Error (), "NAME_UNKNOWN" ) {
257
+ resp .Diagnostics .AddError ("Error checking remote image" , err .Error ())
258
+ return
259
+ }
260
+ // Image does not exist
261
+ return
262
+ }
263
+
264
+ // Found image!
265
+ digest , err := img .Digest ()
266
+ if err != nil {
267
+ resp .Diagnostics .AddError ("Error fetching image digest" , err .Error ())
268
+ return
269
+ }
270
+
271
+ data .ID = types .StringValue (digest .String ())
272
+ data .Image = types .StringValue (fmt .Sprintf ("%s@%s" , data .CacheRepo .ValueString (), digest ))
273
+ data .Exists = types .BoolValue (true )
274
+
275
+ for key , elem := range data .ExtraEnv .Elements () {
276
+ data .Env = appendKnownEnvToList (data .Env , key , elem )
277
+ }
278
+
279
+ data .Env = appendKnownEnvToList (data .Env , "ENVBUILDER_CACHE_REPO" , data .CacheRepo )
280
+ data .Env = appendKnownEnvToList (data .Env , "ENVBUILDER_CACHE_TTL_DAYS" , data .CacheTTLDays )
281
+ data .Env = appendKnownEnvToList (data .Env , "ENVBUILDER_GIT_URL" , data .GitURL )
282
+ data .Env = appendKnownEnvToList (data .Env , "ENVBUILDER_GIT_USERNAME" , data .GitUsername )
283
+ data .Env = appendKnownEnvToList (data .Env , "ENVBUILDER_GIT_PASSWORD" , data .GitPassword )
284
+
248
285
resp .Diagnostics .Append (resp .State .Set (ctx , & data )... )
249
286
}
250
287
@@ -283,19 +320,45 @@ func (r *CachedImageResource) Create(ctx context.Context, req resource.CreateReq
283
320
}
284
321
285
322
data .Env = appendKnownEnvToList (data .Env , "ENVBUILDER_CACHE_REPO" , data .CacheRepo )
286
- data .Env = appendKnownEnvToList (data .Env , "ENVBUILDER_CACHE_TTL_DAYS" , data .CacheTTLDays )
287
323
data .Env = appendKnownEnvToList (data .Env , "ENVBUILDER_GIT_URL" , data .GitURL )
288
- data .Env = appendKnownEnvToList (data .Env , "ENVBUILDER_GIT_USERNAME" , data .GitUsername )
289
- data .Env = appendKnownEnvToList (data .Env , "ENVBUILDER_GIT_PASSWORD" , data .GitPassword )
324
+ if ! data .CacheTTLDays .IsNull () {
325
+ data .Env = appendKnownEnvToList (data .Env , "ENVBUILDER_CACHE_TTL_DAYS" , data .CacheTTLDays )
326
+ }
327
+ if ! data .GitUsername .IsNull () {
328
+ data .Env = appendKnownEnvToList (data .Env , "ENVBUILDER_GIT_USERNAME" , data .GitUsername )
329
+ }
330
+ if ! data .GitPassword .IsNull () {
331
+ data .Env = appendKnownEnvToList (data .Env , "ENVBUILDER_GIT_PASSWORD" , data .GitPassword )
332
+ }
290
333
291
334
// Save data into Terraform state
292
335
resp .Diagnostics .Append (resp .State .Set (ctx , & data )... )
293
336
}
294
337
295
338
func (r * CachedImageResource ) Update (ctx context.Context , req resource.UpdateRequest , resp * resource.UpdateResponse ) {
339
+ // Updates are a no-op.
340
+ var data CachedImageResourceModel
341
+
342
+ resp .Diagnostics .Append (req .Plan .Get (ctx , & data )... )
343
+
344
+ if resp .Diagnostics .HasError () {
345
+ return
346
+ }
347
+
348
+ resp .Diagnostics .Append (resp .State .Set (ctx , & data )... )
296
349
}
297
350
298
351
func (r * CachedImageResource ) Delete (ctx context.Context , req resource.DeleteRequest , resp * resource.DeleteResponse ) {
352
+ // Deletes are a no-op.
353
+ var data CachedImageResourceModel
354
+
355
+ resp .Diagnostics .Append (req .State .Get (ctx , & data )... )
356
+
357
+ if resp .Diagnostics .HasError () {
358
+ return
359
+ }
360
+
361
+ resp .Diagnostics .Append (resp .State .Set (ctx , & data )... )
299
362
}
300
363
301
364
// runCacheProbe performs a 'fake build' of the requested image and ensures that
@@ -395,16 +458,26 @@ func (r *CachedImageResource) runCacheProbe(ctx context.Context, data CachedImag
395
458
return envbuilder .RunCacheProbe (ctx , opts )
396
459
}
397
460
398
- // extractEnvbuilderFromImage reads the image located at imgRef and extracts
399
- // MagicBinaryLocation to destPath.
400
- func extractEnvbuilderFromImage (ctx context.Context , imgRef , destPath string ) error {
401
- needle := filepath .Clean (constants .MagicBinaryLocation )[1 :] // skip leading '/'
461
+ // getRemoteImage fetches the image manifest of the image.
462
+ func getRemoteImage (imgRef string ) (v1.Image , error ) {
402
463
ref , err := name .ParseReference (imgRef )
403
464
if err != nil {
404
- return fmt .Errorf ("parse reference: %w" , err )
465
+ return nil , fmt .Errorf ("parse reference: %w" , err )
405
466
}
406
467
407
468
img , err := remote .Image (ref , remote .WithAuthFromKeychain (authn .DefaultKeychain ))
469
+ if err != nil {
470
+ return nil , fmt .Errorf ("check remote image: %w" , err )
471
+ }
472
+
473
+ return img , nil
474
+ }
475
+
476
+ // extractEnvbuilderFromImage reads the image located at imgRef and extracts
477
+ // MagicBinaryLocation to destPath.
478
+ func extractEnvbuilderFromImage (ctx context.Context , imgRef , destPath string ) error {
479
+ needle := filepath .Clean (constants .MagicBinaryLocation )[1 :] // skip leading '/'
480
+ img , err := getRemoteImage (imgRef )
408
481
if err != nil {
409
482
return fmt .Errorf ("check remote image: %w" , err )
410
483
}
0 commit comments