github.com/mponton/terratest@v0.44.0/modules/gcp/gcr.go (about)

     1  package gcp
     2  
     3  import (
     4  	"fmt"
     5  
     6  	gcrname "github.com/google/go-containerregistry/pkg/name"
     7  	gcrgoogle "github.com/google/go-containerregistry/pkg/v1/google"
     8  	gcrremote "github.com/google/go-containerregistry/pkg/v1/remote"
     9  	"github.com/mponton/terratest/modules/logger"
    10  	"github.com/mponton/terratest/modules/testing"
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  // DeleteGCRRepo deletes a GCR repository including all tagged images
    15  func DeleteGCRRepo(t testing.TestingT, repo string) {
    16  	err := DeleteGCRRepoE(t, repo)
    17  	require.NoError(t, err)
    18  }
    19  
    20  // DeleteGCRRepoE deletes a GCR repository including all tagged images
    21  func DeleteGCRRepoE(t testing.TestingT, repo string) error {
    22  	// create a new auther for the API calls
    23  	auther, err := gcrgoogle.NewEnvAuthenticator()
    24  	if err != nil {
    25  		return fmt.Errorf("Failed to create auther. Got error: %v", err)
    26  	}
    27  
    28  	gcrrepo, err := gcrname.NewRepository(repo)
    29  	if err != nil {
    30  		return fmt.Errorf("Failed to get repo. Got error: %v", err)
    31  	}
    32  
    33  	logger.Logf(t, "Retriving Image Digests %s", gcrrepo)
    34  	tags, err := gcrgoogle.List(gcrrepo, gcrgoogle.WithAuth(auther))
    35  	if err != nil {
    36  		return fmt.Errorf("Failed to list tags for repo %s. Got error: %v", repo, err)
    37  	}
    38  
    39  	// attempt to delete the latest image tag
    40  	latestRef := repo + ":latest"
    41  	logger.Logf(t, "Deleting Image Ref %s", latestRef)
    42  	if err := DeleteGCRImageRefE(t, latestRef); err != nil {
    43  		return fmt.Errorf("Failed to delete GCR Image Reference %s. Got error: %v", latestRef, err)
    44  	}
    45  
    46  	// delete image references sequentially
    47  	for k := range tags.Manifests {
    48  		ref := repo + "@" + k
    49  		logger.Logf(t, "Deleting Image Ref %s", ref)
    50  
    51  		if err := DeleteGCRImageRefE(t, ref); err != nil {
    52  			return fmt.Errorf("Failed to delete GCR Image Reference %s. Got error: %v", ref, err)
    53  		}
    54  	}
    55  
    56  	return nil
    57  }
    58  
    59  // DeleteGCRImageRef deletes a single repo image ref/digest
    60  func DeleteGCRImageRef(t testing.TestingT, ref string) {
    61  	err := DeleteGCRImageRefE(t, ref)
    62  	require.NoError(t, err)
    63  }
    64  
    65  // DeleteGCRImageRefE deletes a single repo image ref/digest
    66  func DeleteGCRImageRefE(t testing.TestingT, ref string) error {
    67  	name, err := gcrname.ParseReference(ref)
    68  	if err != nil {
    69  		return fmt.Errorf("Failed to parse reference %s. Got error: %v", ref, err)
    70  	}
    71  
    72  	// create a new auther for the API calls
    73  	auther, err := gcrgoogle.NewEnvAuthenticator()
    74  	if err != nil {
    75  		return fmt.Errorf("Failed to create auther. Got error: %v", err)
    76  	}
    77  
    78  	opts := gcrremote.WithAuth(auther)
    79  
    80  	if err := gcrremote.Delete(name, opts); err != nil {
    81  		return fmt.Errorf("Failed to delete %s. Got error: %v", name, err)
    82  	}
    83  
    84  	return nil
    85  }