...

Source file src/edge-infra.dev/pkg/f8n/warehouse/oci/artifact_test.go

Documentation: edge-infra.dev/pkg/f8n/warehouse/oci

     1  package oci_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	v1 "github.com/google/go-containerregistry/pkg/v1"
     7  	"github.com/stretchr/testify/assert"
     8  	"github.com/stretchr/testify/require"
     9  
    10  	"edge-infra.dev/pkg/f8n/warehouse/cluster"
    11  	"edge-infra.dev/pkg/f8n/warehouse/oci"
    12  	"edge-infra.dev/pkg/f8n/warehouse/oci/layer"
    13  	"edge-infra.dev/pkg/f8n/warehouse/pallet"
    14  )
    15  
    16  var providers = cluster.BuiltInProviders()
    17  
    18  func TestIsPackage(t *testing.T) {
    19  	meta := makeMeta()
    20  	imgContent := make([]byte, 3)
    21  	img, idx, err := makeArtifacts(meta, imgContent)
    22  	require.NoError(t, err)
    23  
    24  	t.Run("image is not a package", func(t *testing.T) {
    25  		yes, err := oci.IsPackage(img, idx)
    26  		assert.NoError(t, err)
    27  		assert.False(t, yes)
    28  	})
    29  
    30  	t.Run("image is a package", func(t *testing.T) {
    31  		shootMeta := meta
    32  		meta.Name = "not-shoot"
    33  
    34  		l, err := layer.New(layer.Runtime, imgContent)
    35  		assert.NoError(t, err)
    36  
    37  		img2, err := pallet.Image(pallet.Options{
    38  			ClusterProviders: providers,
    39  			Metadata:         meta,
    40  		}, l)
    41  		assert.NoError(t, err)
    42  
    43  		idx, err := pallet.ImageIndex(pallet.Options{
    44  			ClusterProviders: providers,
    45  			Metadata:         shootMeta,
    46  		}, img2)
    47  		assert.NoError(t, err)
    48  
    49  		yes, err := oci.IsPackage(img2.Unwrap().(v1.Image), idx)
    50  		assert.NoError(t, err)
    51  		assert.True(t, yes)
    52  	})
    53  
    54  	t.Run("handles nil parents", func(t *testing.T) {
    55  		yes, err := oci.IsPackage(img, nil)
    56  		assert.NoError(t, err)
    57  		assert.True(t, yes)
    58  	})
    59  }
    60  
    61  func TestContains(t *testing.T) {
    62  	meta := makeMeta()
    63  	img, idx, err := makeArtifacts(meta, make([]byte, 3))
    64  	require.NoError(t, err)
    65  
    66  	t.Run("index contains image", func(t *testing.T) {
    67  		yes, err := oci.Contains(idx, img)
    68  		assert.NoError(t, err)
    69  		assert.True(t, yes)
    70  	})
    71  
    72  	t.Run("index contains image with wrong digest", func(t *testing.T) {
    73  		img2, _, err := makeArtifacts(meta, make([]byte, 10))
    74  		assert.NoError(t, err)
    75  
    76  		yes, err := oci.Contains(idx, img2)
    77  		assert.NoError(t, err)
    78  		assert.False(t, yes)
    79  	})
    80  
    81  	t.Run("index doesnt contain image", func(t *testing.T) {
    82  		meta.Name = "not-shoot"
    83  
    84  		img2, _, err := makeArtifacts(meta, make([]byte, 10))
    85  		assert.NoError(t, err)
    86  
    87  		yes, err := oci.Contains(idx, img2)
    88  		assert.NoError(t, err)
    89  		assert.False(t, yes)
    90  	})
    91  }
    92  
    93  func TestIsComposite(t *testing.T) {
    94  	meta := makeMeta()
    95  
    96  	t.Run("is not composite", func(t *testing.T) {
    97  		_, idx, err := makeArtifacts(meta, make([]byte, 3))
    98  		require.NoError(t, err)
    99  
   100  		isComposite, err := oci.IsComposite(idx)
   101  		assert.NoError(t, err)
   102  		assert.False(t, isComposite)
   103  	})
   104  
   105  	t.Run("is composite", func(t *testing.T) {
   106  		_, idx1, err := makeArtifacts(meta, make([]byte, 3))
   107  		require.NoError(t, err)
   108  
   109  		meta.Name = "prometheus-operator"
   110  		_, idx2, err := makeArtifacts(meta, make([]byte, 10))
   111  		require.NoError(t, err)
   112  
   113  		meta.Name = "composite-guy"
   114  		idx3, err := pallet.ImageIndex(pallet.Options{
   115  			ClusterProviders: providers,
   116  			Metadata:         meta,
   117  		}, idx1, idx2)
   118  		require.NoError(t, err)
   119  
   120  		isComposite, err := oci.IsComposite(idx3)
   121  		assert.NoError(t, err)
   122  		assert.True(t, isComposite)
   123  	})
   124  }
   125  
   126  func makeArtifacts(meta pallet.Metadata, imgContent []byte) (v1.Image, v1.ImageIndex, error) {
   127  	l, err := layer.New(layer.Runtime, imgContent)
   128  	if err != nil {
   129  		return nil, nil, err
   130  	}
   131  
   132  	img, err := pallet.Image(pallet.Options{
   133  		ClusterProviders: providers,
   134  		Metadata:         meta,
   135  	}, l)
   136  	if err != nil {
   137  		return nil, nil, err
   138  	}
   139  
   140  	idx, err := pallet.ImageIndex(pallet.Options{
   141  		ClusterProviders: providers,
   142  		Metadata:         meta,
   143  	}, img)
   144  	if err != nil {
   145  		return nil, nil, err
   146  	}
   147  	return img.Unwrap().(v1.Image), idx.Unwrap().(v1.ImageIndex), nil
   148  }
   149  
   150  // TODO: add some test utils for generating metadata
   151  func makeMeta() pallet.Metadata {
   152  	return pallet.Metadata{
   153  		Name:   "shoot",
   154  		Vendor: "NCR",
   155  		Team:   "@ncrvoyix-swt-retail/edge-waterboys",
   156  		BuildInfo: pallet.BuildInfo{
   157  			Created:  "yesterday",
   158  			Source:   "https://gothub.com/ncrvoyix-swt-retail/edge-infra",
   159  			Revision: "d34db33f",
   160  			Version:  "0.2.5",
   161  		},
   162  	}
   163  }
   164  

View as plain text