Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -62,14 +62,17 @@ tidy:
$(GO) mod tidy
make -C v1 tidy

sanity: tidy format vet
sanity: tidy format vet generate
make -C v1 sanity
git diff --exit-code
.PHONY: sanity

format: verify-gofmt
make -C v1 verify-gofmt

generate:
$(GO) generate $(GO_MOD_FLAGS) $(GO_BUILD_FLAGS) ./internal/pkg/...

cover:
$(GO) tool cover -html=tests/results/cover.out -o tests/results/cover.html

Expand Down
8 changes: 7 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ require (

require (
github.com/docker/cli v28.3.3+incompatible
go.uber.org/mock v0.6.0
k8s.io/klog v1.0.0
)

Expand Down Expand Up @@ -202,11 +203,13 @@ require (
go.opentelemetry.io/proto/otlp v1.7.0 // indirect
go.yaml.in/yaml/v2 v2.4.2 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
golang.org/x/mod v0.27.0 // indirect
golang.org/x/net v0.43.0 // indirect
golang.org/x/oauth2 v0.30.0 // indirect
golang.org/x/sys v0.35.0 // indirect
golang.org/x/text v0.28.0 // indirect
golang.org/x/time v0.12.0 // indirect
golang.org/x/tools v0.36.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect
google.golang.org/grpc v1.73.0 // indirect
Expand All @@ -230,4 +233,7 @@ require (
sigs.k8s.io/structured-merge-diff/v4 v4.7.0 // indirect
)

tool github.com/openshift/build-machinery-go
tool (
github.com/openshift/build-machinery-go
go.uber.org/mock/mockgen
)
6 changes: 4 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -475,6 +475,8 @@ go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y=
go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU=
go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
Expand All @@ -500,8 +502,8 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg=
golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ=
golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ=
golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
Expand Down
2 changes: 2 additions & 0 deletions internal/pkg/additional/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import (
"github.com/openshift/oc-mirror/v2/internal/pkg/api/v2alpha1"
)

//go:generate go tool mockgen -source=./interface.go -destination=./mock/interface_generated.go -package=mock

type CollectorInterface interface {
AdditionalImagesCollector(ctx context.Context) ([]v2alpha1.CopyImageSchema, error)
}
124 changes: 10 additions & 114 deletions internal/pkg/additional/local_stored_collector_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,13 @@ import (
"context"
"testing"

"github.com/opencontainers/go-digest"
"github.com/stretchr/testify/assert"
"go.podman.io/image/v5/types"

"github.com/openshift/oc-mirror/v2/internal/pkg/api/v2alpha1"
clog "github.com/openshift/oc-mirror/v2/internal/pkg/log"
"github.com/openshift/oc-mirror/v2/internal/pkg/mirror"
)

// setup mocks
// we need to mock Manifest, Mirror

type MockMirror struct{}
type MockManifest struct {
Log clog.PluggableLoggerInterface
}

func TestAdditionalImageCollector(t *testing.T) {
log := clog.New("trace")

Expand Down Expand Up @@ -60,10 +50,7 @@ func TestAdditionalImageCollector(t *testing.T) {
},
}

mockmirror := MockMirror{}
manifest := MockManifest{Log: log}

ex := New(log, cfg, opts, mockmirror, manifest)
ex := New(log, cfg, opts, nil, nil)
ctx := context.Background()

// this test covers mirrorToDisk
Expand Down Expand Up @@ -95,18 +82,15 @@ func TestAdditionalImageCollector(t *testing.T) {
},
}
res, err := ex.AdditionalImagesCollector(ctx)
if err != nil {
log.Error(" %v ", err)
t.Fatalf("should not fail")
}
assert.NoError(t, err)
assert.ElementsMatch(t, expected, res)
})

// update opts
// this test covers diskToMirror
opts.Mode = mirror.DiskToMirror
opts.Destination = "docker://mirror.acme.com"
ex = New(log, cfg, opts, mockmirror, manifest)
ex = New(log, cfg, opts, nil, nil)

t.Run("Testing AdditionalImagesCollector : diskToMirror should pass", func(t *testing.T) {
expected := []v2alpha1.CopyImageSchema{
Expand Down Expand Up @@ -136,17 +120,14 @@ func TestAdditionalImageCollector(t *testing.T) {
},
}
res, err := ex.AdditionalImagesCollector(ctx)
if err != nil {
log.Error(" %v ", err)
t.Fatalf("should not fail")
}
assert.NoError(t, err)
assert.ElementsMatch(t, expected, res)
})

t.Run("Testing AdditionalImagesCollector : diskToMirror with generateV1Tags should use latest for images by digest", func(t *testing.T) {
// should error diskToMirror
opts.Mode = mirror.DiskToMirror
ex = New(log, cfg, opts, mockmirror, manifest)
ex = New(log, cfg, opts, nil, nil)
ex = WithV1Tags(ex)
expected := []v2alpha1.CopyImageSchema{
{
Expand Down Expand Up @@ -175,17 +156,14 @@ func TestAdditionalImageCollector(t *testing.T) {
},
}
res, err := ex.AdditionalImagesCollector(ctx)
if err != nil {
log.Error(" %v ", err)
t.Fatalf("should not fail")
}
assert.NoError(t, err)
assert.ElementsMatch(t, expected, res)
})

// should error mirrorToDisk
cfg.Mirror.AdditionalImages[1].Name = "sometest.registry.com/testns/test@shaf30638f60452062aba36a26ee6c036feead2f03b28f2c47f2b0a991e41baebea"
opts.Mode = mirror.MirrorToDisk
ex = New(log, cfg, opts, mockmirror, manifest)
ex = New(log, cfg, opts, nil, nil)

t.Run("Testing AdditionalImagesCollector : mirrorToDisk should not fail (skipped)", func(t *testing.T) {
expected := []v2alpha1.CopyImageSchema{
Expand All @@ -209,18 +187,15 @@ func TestAdditionalImageCollector(t *testing.T) {
},
}
res, err := ex.AdditionalImagesCollector(ctx)
if err != nil {
log.Error(" %v ", err)
t.Fatalf("should not fail")
}
assert.NoError(t, err)
assert.ElementsMatch(t, expected, res)
})

t.Run("Testing AdditionalImagesCollector : diskToMirror should skip failing image with warning", func(t *testing.T) {
// should error diskToMirror
cfg.Mirror.AdditionalImages[1].Name = "sometest.registry.com/testns/test@shaf30638f60452062aba36a26ee6c036feead2f03b28f2c47f2b0a991e41baebea"
opts.Mode = mirror.DiskToMirror
ex = New(log, cfg, opts, mockmirror, manifest)
ex = New(log, cfg, opts, nil, nil)
expected := []v2alpha1.CopyImageSchema{
{
Destination: "docker://mirror.acme.com/ubi8/ubi:latest",
Expand All @@ -242,86 +217,7 @@ func TestAdditionalImageCollector(t *testing.T) {
},
}
res, err := ex.AdditionalImagesCollector(ctx)
if err != nil {
log.Error(" %v ", err)
t.Fatalf("should not fail")
}
assert.NoError(t, err)
assert.ElementsMatch(t, expected, res)
})
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is really nice to reuse the mock from other packages instead of duplicating them.

+1


func (o MockMirror) Run(ctx context.Context, src, dest string, mode mirror.Mode, opts *mirror.CopyOptions) error {
return nil
}

func (o MockMirror) Check(ctx context.Context, image string, opts *mirror.CopyOptions, asCopySrc bool) (bool, error) {
return true, nil
}

func (o MockManifest) GetOperatorConfig(file string) (*v2alpha1.OperatorConfigSchema, error) {
opcl := v2alpha1.OperatorLabels{OperatorsOperatorframeworkIoIndexConfigsV1: "/configs"}
opc := v2alpha1.OperatorConfig{Labels: opcl}
ocs := &v2alpha1.OperatorConfigSchema{Config: opc}
return ocs, nil
}

func (o MockManifest) GetReleaseSchema(filePath string) ([]v2alpha1.RelatedImage, error) {
relatedImages := []v2alpha1.RelatedImage{
{Name: "testA", Image: "sometestimage-a@sha256:f30638f60452062aba36a26ee6c036feead2f03b28f2c47f2b0a991e41baebea"},
{Name: "testB", Image: "sometestimage-b@sha256:f30638f60452062aba36a26ee6c036feead2f03b28f2c47f2b0a991e41baebea"},
{Name: "testC", Image: "sometestimage-c@sha256:f30638f60452062aba36a26ee6c036feead2f03b28f2c47f2b0a991e41baebea"},
{Name: "testD", Image: "sometestimage-d@sha256:f30638f60452062aba36a26ee6c036feead2f03b28f2c47f2b0a991e41baebea"},
}
return relatedImages, nil
}

func (o MockManifest) GetOCIImageIndex(name string) (*v2alpha1.OCISchema, error) {
return &v2alpha1.OCISchema{
SchemaVersion: 2,
Manifests: []v2alpha1.OCIManifest{
{
MediaType: "application/vnd.oci.image.manifest.v1+json",
Digest: "sha256:3ef0b0141abd1548f60c4f3b23ecfc415142b0e842215f38e98610a3b2e52419",
Size: 567,
},
},
}, nil
}

func (o MockManifest) GetOCIImageManifest(name string) (*v2alpha1.OCISchema, error) {
return &v2alpha1.OCISchema{
SchemaVersion: 2,
Manifests: []v2alpha1.OCIManifest{
{
MediaType: "application/vnd.oci.image.manifest.v1+json",
Digest: "sha256:3ef0b0141abd1548f60c4f3b23ecfc415142b0e842215f38e98610a3b2e52419",
Size: 567,
},
},
Config: v2alpha1.OCIManifest{
MediaType: "application/vnd.oci.image.manifest.v1+json",
Digest: "sha256:3ef0b0141abd1548f60c4f3b23ecfc415142b0e842215f38e98610a3b2e52419",
Size: 567,
},
}, nil
}

func (o MockManifest) ExtractOCILayers(filePath, toPath, label string, oci *v2alpha1.OCISchema) error {
return nil
}

func (o MockManifest) ExtractLayers(filePath, name, label string) error {
return nil
}

func (o MockManifest) ConvertOCIIndexToSingleManifest(dir string, oci *v2alpha1.OCISchema) error {
return nil
}

func (o MockManifest) ImageDigest(ctx context.Context, sourceCtx *types.SystemContext, imgRef string) (string, error) {
return "123456", nil
}

func (o MockManifest) ImageManifest(ctx context.Context, sourceCtx *types.SystemContext, imgRef string, instanceDigest *digest.Digest) ([]byte, string, error) {
return nil, "", nil
}
57 changes: 57 additions & 0 deletions internal/pkg/additional/mock/interface_generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading