...

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

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

     1  package layout
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"testing"
     7  
     8  	"github.com/google/go-containerregistry/pkg/name"
     9  	"github.com/stretchr/testify/assert"
    10  
    11  	"edge-infra.dev/pkg/f8n/warehouse/cluster"
    12  	"edge-infra.dev/pkg/f8n/warehouse/lift"
    13  	"edge-infra.dev/pkg/f8n/warehouse/oci"
    14  	"edge-infra.dev/pkg/f8n/warehouse/oci/layer"
    15  	"edge-infra.dev/pkg/f8n/warehouse/pallet"
    16  	"edge-infra.dev/pkg/lib/build/bazel"
    17  	"edge-infra.dev/pkg/lib/uuid"
    18  	"edge-infra.dev/test/snapshot"
    19  )
    20  
    21  var (
    22  	tempDir string
    23  )
    24  
    25  func TestMain(m *testing.M) {
    26  	path, err := os.MkdirTemp("", "LayoutTest")
    27  	if err != nil {
    28  		os.Exit(1)
    29  	}
    30  	tempDir = path
    31  	defer os.RemoveAll(path)
    32  	os.Exit(m.Run())
    33  }
    34  
    35  func TestNew(t *testing.T) {
    36  	layout, err := New(tempDir)
    37  	assert.NoError(t, err)
    38  	assert.NotNil(t, layout)
    39  }
    40  
    41  func TestSort(t *testing.T) {
    42  	layout, err := New(tempDir)
    43  	assert.NoError(t, err)
    44  	assert.NotNil(t, layout)
    45  
    46  	// Add 3 static pallets with different digests to the layout
    47  	lmperLyer, err := createLayer(layer.Infra, []byte("hi"))
    48  	assert.NoError(t, err)
    49  	lmperPllet, err := tempPallet("clusterctl", lmperLyer)
    50  	assert.NoError(t, err)
    51  	tagRef, err := name.NewTag(fmt.Sprintf("%s/%s:%s", lift.LocalRegistryAlias, "clusterctl", "test"))
    52  	assert.NoError(t, err)
    53  	assert.NoError(t, layout.Append(tagRef, lmperPllet))
    54  
    55  	lmperPllet, err = tempPallet("bannerctl", lmperLyer)
    56  	assert.NoError(t, err)
    57  	tagRef, err = name.NewTag(fmt.Sprintf("%s/%s:%s", lift.LocalRegistryAlias, "bannerctl", "test"))
    58  	assert.NoError(t, err)
    59  	assert.NoError(t, layout.Append(tagRef, lmperPllet))
    60  
    61  	lmperPllet, err = tempPallet("lumperctl", lmperLyer)
    62  	assert.NoError(t, err)
    63  	tagRef, err = name.NewTag(fmt.Sprintf("%s/%s:%s", lift.LocalRegistryAlias, "lumperctl", "test"))
    64  	assert.NoError(t, err)
    65  	assert.NoError(t, layout.Append(tagRef, lmperPllet))
    66  
    67  	// Sort the layout & snap the sorted index
    68  	assert.NoError(t, layout.Sort())
    69  	layoutIndex, err := layout.ImageIndex()
    70  	assert.NoError(t, err)
    71  	idx, err := layoutIndex.IndexManifest()
    72  	assert.NoError(t, err)
    73  	snapshot.Snap(t, idx)
    74  }
    75  
    76  func TestAppendTag(t *testing.T) {
    77  	layout, err := New(tempDir)
    78  	assert.NoError(t, err)
    79  	assert.NotNil(t, layout)
    80  	tag := uuid.New().Hash()
    81  	lmperLyer, err := createLayer(layer.Infra, []byte("hi"))
    82  	assert.NoError(t, err)
    83  	lmperPllet, err := tempPallet("clusterctl", lmperLyer)
    84  	assert.NoError(t, err)
    85  	tagRef, err := name.NewTag(fmt.Sprintf("%s/%s:%s", lift.LocalRegistryAlias, "lumper", tag))
    86  	assert.NoError(t, err)
    87  	assert.NoError(t, layout.Append(tagRef, lmperPllet))
    88  }
    89  
    90  func TestAppendDigest(t *testing.T) {
    91  	layout, err := New(tempDir)
    92  	assert.NoError(t, err)
    93  	assert.NotNil(t, layout)
    94  	lmperLyer, err := createLayer(layer.Infra, []byte("hi"))
    95  	assert.NoError(t, err)
    96  	lmperPllet, err := tempPallet("bannerctl", lmperLyer)
    97  	assert.NoError(t, err)
    98  	digest, err := name.NewDigest(fmt.Sprintf("%s/%s@sha256:%s", lift.LocalRegistryAlias, "lumper", "3a97b8b8a414dc3e030550ffcb05d54a93a06bbed23925914ba59b8e6fc05545"))
    99  	assert.NoError(t, err)
   100  	assert.NoError(t, layout.Append(digest, lmperPllet))
   101  }
   102  
   103  func TestGetTag(t *testing.T) {
   104  	layout, err := New(tempDir)
   105  	assert.NoError(t, err)
   106  	assert.NotNil(t, layout)
   107  	lmperLyer, err := createLayer(layer.Infra, []byte("hi"))
   108  	assert.NoError(t, err)
   109  	lmperPllet, err := tempPallet("lumper", lmperLyer)
   110  	assert.NoError(t, err)
   111  	tag := uuid.New().Hash()
   112  	tagRef, err := name.NewTag(fmt.Sprintf("%s/%s:%s", lift.LocalRegistryAlias, "lumper", tag))
   113  	assert.NoError(t, err)
   114  	assert.NoError(t, layout.Append(tagRef, lmperPllet))
   115  	a, err := layout.Get(tagRef)
   116  	assert.NoError(t, err)
   117  	assert.NotEmpty(t, a)
   118  }
   119  
   120  func TestAppendTagMultipleTimes(t *testing.T) {
   121  	layout, err := New(tempDir)
   122  	assert.NoError(t, err)
   123  	assert.NotNil(t, layout)
   124  	lmperLyer, err := createLayer(layer.Infra, []byte("hi"))
   125  	assert.NoError(t, err)
   126  	lmperPllet, err := tempPallet("lumper", lmperLyer)
   127  	assert.NoError(t, err)
   128  	tag := uuid.New().Hash()
   129  	tagRef, err := name.NewTag(fmt.Sprintf("%s/%s:%s", lift.LocalRegistryAlias, "lumper", tag))
   130  	assert.NoError(t, err)
   131  	for i := 0; i <= 8; i++ {
   132  		assert.NoError(t, err)
   133  		assert.NoError(t, layout.Append(tagRef, lmperPllet))
   134  	}
   135  }
   136  
   137  func TestAppendDigestMultipleTimes(t *testing.T) {
   138  	layout, err := New(tempDir)
   139  	assert.NoError(t, err)
   140  	assert.NotNil(t, layout)
   141  	lmperLyer, err := createLayer(layer.Infra, []byte("hi"))
   142  	assert.NoError(t, err)
   143  	lmperPllet, err := tempPallet("lumper", lmperLyer)
   144  	assert.NoError(t, err)
   145  	for i := 0; i <= 8; i++ {
   146  		digest, err := name.NewDigest(fmt.Sprintf("%s/%s@sha256:%s", lift.LocalRegistryAlias, "lumper", "3a97b8b8a414dc3e030550ffcb05d54a93a06bbed23925914ba59b8e6fc05545"))
   147  		assert.NoError(t, err)
   148  		assert.NoError(t, layout.Append(digest, lmperPllet))
   149  	}
   150  }
   151  
   152  func TestGetTagMultipleTimes(t *testing.T) {
   153  	layout, err := New(tempDir)
   154  	assert.NoError(t, err)
   155  	assert.NotNil(t, layout)
   156  	lmperLyer, err := createLayer(layer.Infra, []byte("hi"))
   157  	assert.NoError(t, err)
   158  	lmperPllet, err := tempPallet("lumper", lmperLyer)
   159  	assert.NoError(t, err)
   160  	tag := uuid.New().Hash()
   161  	tagRef, err := name.NewTag(fmt.Sprintf("%s/%s:%s", lift.LocalRegistryAlias, "lumper", tag))
   162  	assert.NoError(t, err)
   163  	for i := 0; i <= 8; i++ {
   164  		assert.NoError(t, layout.Append(tagRef, lmperPllet))
   165  	}
   166  	a, err := layout.Get(tagRef)
   167  	assert.NoError(t, err)
   168  	assert.NotEmpty(t, a)
   169  }
   170  
   171  func TestClear(t *testing.T) {
   172  	layout, err := New(tempDir)
   173  	assert.NoError(t, err)
   174  	assert.NotNil(t, layout)
   175  	idx, err := layout.ImageIndex()
   176  	assert.NoError(t, err)
   177  	manifest, err := idx.IndexManifest()
   178  	assert.NoError(t, err)
   179  	assert.NotEmpty(t, manifest.Manifests)
   180  	l, err := Clear(tempDir)
   181  	assert.NoError(t, err)
   182  	assert.NotNil(t, l)
   183  	i, err := l.ImageIndex()
   184  	assert.NoError(t, err)
   185  	m, err := i.IndexManifest()
   186  	assert.NoError(t, err)
   187  	assert.Empty(t, m.Manifests)
   188  }
   189  func TestPruneNone(t *testing.T) {
   190  	path, err := bazel.NewTestTmpDir("LayoutTest")
   191  	if err != nil {
   192  		t.Fatal()
   193  	}
   194  	defer os.RemoveAll(path)
   195  	l, err := New(path)
   196  	assert.NoError(t, err)
   197  	assert.NotNil(t, l)
   198  
   199  	lmperLyer, err := createLayer(layer.Infra, []byte("hi"))
   200  	assert.NoError(t, err)
   201  	lmperPllet, err := tempPallet("clusterctl", lmperLyer)
   202  	assert.NoError(t, err)
   203  	tagRef, err := name.NewTag(fmt.Sprintf("%s/%s:%s", lift.LocalRegistryAlias, "clusterctl", "test"))
   204  	assert.NoError(t, err)
   205  	assert.NoError(t, l.Append(tagRef, lmperPllet))
   206  	hashes, err := l.Prune()
   207  	assert.NoError(t, err)
   208  	assert.Empty(t, hashes)
   209  }
   210  
   211  func TestPrune(t *testing.T) {
   212  	path, err := bazel.NewTestTmpDir("LayoutTest")
   213  	if err != nil {
   214  		t.Fatal()
   215  	}
   216  	defer os.RemoveAll(path)
   217  	l, err := New(path)
   218  	assert.NoError(t, err)
   219  	assert.NotNil(t, l)
   220  	lmperLyer, err := createLayer(layer.Infra, []byte("hi"))
   221  	assert.NoError(t, err)
   222  	lmperPllet, err := tempPallet("clusterctl", lmperLyer)
   223  	assert.NoError(t, err)
   224  	tagRef, err := name.NewTag(fmt.Sprintf("%s/%s:%s", lift.LocalRegistryAlias, "clusterctl", "test"))
   225  	assert.NoError(t, err)
   226  	assert.NoError(t, l.Append(tagRef, lmperPllet))
   227  	grbLayer, err := createLayer(layer.Infra, []byte("test"))
   228  	assert.NoError(t, err)
   229  	digest, err := grbLayer.Digest()
   230  	assert.NoError(t, err)
   231  	uncmp, err := grbLayer.Uncompressed()
   232  	assert.NoError(t, err)
   233  	err = l.WriteBlob(digest, uncmp)
   234  	assert.NoError(t, err)
   235  	hashes, err := l.Prune()
   236  	assert.NoError(t, err)
   237  	assert.Equal(t, digest.Hex, hashes[0])
   238  }
   239  
   240  func tempPallet(name string, layers ...layer.Layer) (oci.Artifact, error) {
   241  	a, err := pallet.Image(pallet.Options{
   242  		Metadata: pallet.Metadata{
   243  			Name: name,
   244  			Team: "@ncrvoyix-swt-retail/wg-manifest-destiny",
   245  			BuildInfo: pallet.BuildInfo{
   246  				Created:  "yesterday",
   247  				Source:   "https://gothub.com/ncrvoyix-swt-retail/edge-infra",
   248  				Revision: "d34db33f",
   249  				Version:  "0.2.5",
   250  			},
   251  		},
   252  		ClusterProviders: cluster.BuiltInProviders(),
   253  	}, layers...)
   254  	if err != nil {
   255  		return nil, err
   256  	}
   257  	return a, nil
   258  }
   259  
   260  func createLayer(lt layer.Type, yaml []byte) (layer.Layer, error) { //nolint:unparam
   261  	l, err := layer.New(lt, yaml)
   262  	if err != nil {
   263  		return nil, err
   264  	}
   265  	return l, nil
   266  }
   267  

View as plain text