Skip to content

Commit 5b3d191

Browse files
committed
Added support for imageindex and minor changes
Signed-off-by: ashpect <ashishndiitr@gmail.com>
1 parent d0d653f commit 5b3d191

File tree

4 files changed

+142
-43
lines changed

4 files changed

+142
-43
lines changed

pkg/imgpkg/cmd/copy_repo_src.go

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -95,33 +95,36 @@ func (c CopyRepoSrc) CopyToRepo(repo string) (*ctlimgset.ProcessedImages, error)
9595
return nil, err
9696
}
9797

98-
var parentBundle *ctlbundle.Bundle
99-
foundRootBundle := false
100-
for _, processedImage := range processedImages.All() {
101-
if processedImage.ImageIndex != nil {
102-
continue
103-
}
98+
// This is added to not read the lockfile and change the ref for oci-flag. Will be removed once we add an inflate option to copy the refs.
99+
if !c.OciFlags.IsOci() {
100+
var parentBundle *ctlbundle.Bundle
101+
foundRootBundle := false
102+
for _, processedImage := range processedImages.All() {
103+
if processedImage.ImageIndex != nil {
104+
continue
105+
}
104106

105-
if _, ok := processedImage.Labels[rootBundleLabelKey]; ok {
106-
if foundRootBundle {
107-
panic("Internal inconsistency: expected only 1 root bundle")
107+
if _, ok := processedImage.Labels[rootBundleLabelKey]; ok {
108+
if foundRootBundle {
109+
panic("Internal inconsistency: expected only 1 root bundle")
110+
}
111+
foundRootBundle = true
112+
pImage := plainimage.NewFetchedPlainImageWithTag(processedImage.DigestRef, processedImage.Tag, processedImage.Image)
113+
lockReader := ctlbundle.NewImagesLockReader()
114+
parentBundle = ctlbundle.NewBundle(pImage, c.registry, lockReader, ctlbundle.NewFetcherFromProcessedImages(processedImages.All(), c.registry, lockReader))
108115
}
109-
foundRootBundle = true
110-
pImage := plainimage.NewFetchedPlainImageWithTag(processedImage.DigestRef, processedImage.Tag, processedImage.Image)
111-
lockReader := ctlbundle.NewImagesLockReader()
112-
parentBundle = ctlbundle.NewBundle(pImage, c.registry, lockReader, ctlbundle.NewFetcherFromProcessedImages(processedImages.All(), c.registry, lockReader))
113116
}
114-
}
115117

116-
if foundRootBundle {
117-
bundles, _, err := parentBundle.AllImagesLockRefs(c.Concurrency, c.logger)
118-
if err != nil {
119-
return nil, err
120-
}
118+
if foundRootBundle {
119+
bundles, _, err := parentBundle.AllImagesLockRefs(c.Concurrency, c.logger)
120+
if err != nil {
121+
return nil, err
122+
}
121123

122-
for _, bundle := range bundles {
123-
if err := bundle.NoteCopy(processedImages, c.registry, c.logger); err != nil {
124-
return nil, fmt.Errorf("Creating copy information for bundle %s: %s", bundle.DigestRef(), err)
124+
for _, bundle := range bundles {
125+
if err := bundle.NoteCopy(processedImages, c.registry, c.logger); err != nil {
126+
return nil, fmt.Errorf("Creating copy information for bundle %s: %s", bundle.DigestRef(), err)
127+
}
125128
}
126129
}
127130
}

pkg/imgpkg/imagedesc/image_intermediate.go

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,72 @@ type ImageIndexIntermediate struct {
1414
tag string
1515
}
1616

17+
type ImageIntermediate struct {
18+
Image regv1.Image
19+
ref string
20+
tag string
21+
}
22+
23+
func (mi ImageIntermediate) Ref() string {
24+
return mi.ref
25+
}
26+
27+
func (mi *ImageIntermediate) SetRef(ref string) {
28+
mi.ref = ref
29+
}
30+
31+
func (mi ImageIntermediate) Tag() string {
32+
return mi.tag
33+
}
34+
35+
func (mi *ImageIntermediate) SetTag(tag string) {
36+
mi.tag = tag
37+
}
38+
39+
func (mi ImageIntermediate) Layers() ([]regv1.Layer, error) {
40+
return mi.Image.Layers()
41+
}
42+
43+
func (mi ImageIntermediate) MediaType() (types.MediaType, error) {
44+
return mi.Image.MediaType()
45+
}
46+
47+
func (mi ImageIntermediate) Size() (int64, error) {
48+
return mi.Image.Size()
49+
}
50+
51+
func (mi ImageIntermediate) ConfigName() (regv1.Hash, error) {
52+
return mi.Image.ConfigName()
53+
}
54+
55+
func (mi ImageIntermediate) ConfigFile() (*regv1.ConfigFile, error) {
56+
return mi.Image.ConfigFile()
57+
}
58+
59+
func (mi ImageIntermediate) RawConfigFile() ([]byte, error) {
60+
return mi.Image.RawConfigFile()
61+
}
62+
63+
func (mi ImageIntermediate) Digest() (regv1.Hash, error) {
64+
return mi.Image.Digest()
65+
}
66+
67+
func (mi ImageIntermediate) Manifest() (*regv1.Manifest, error) {
68+
return mi.Image.Manifest()
69+
}
70+
71+
func (mi ImageIntermediate) RawManifest() ([]byte, error) {
72+
return mi.Image.RawManifest()
73+
}
74+
75+
func (mi ImageIntermediate) LayerByDigest(h regv1.Hash) (regv1.Layer, error) {
76+
return mi.Image.LayerByDigest(h)
77+
}
78+
79+
func (mi ImageIntermediate) LayerByDiffID(h regv1.Hash) (regv1.Layer, error) {
80+
return mi.Image.LayerByDiffID(h)
81+
}
82+
1783
func (mi ImageIndexIntermediate) Ref() string {
1884
return mi.ref
1985
}
@@ -59,3 +125,4 @@ func (mi ImageIndexIntermediate) ImageIndex(h regv1.Hash) (regv1.ImageIndex, err
59125
}
60126

61127
var _ regv1.ImageIndex = ImageIndexIntermediate{}
128+
var _ regv1.Image = ImageIntermediate{}

pkg/imgpkg/imageset/tar_image_set.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ func (i *TarImageSet) Import(path string, importRepo regname.Repository, registr
129129
var err error
130130

131131
if tarisoci {
132-
imgOrIndexes, err = imagetar.NewTarReader(path).ReadOci(importRepo.Name())
132+
imgOrIndexes, err = imagetar.NewTarReader(path).ReadOci(importRepo)
133133
} else {
134134
imgOrIndexes, err = imagetar.NewTarReader(path).Read()
135135
}

pkg/imgpkg/imagetar/tar_reader.go

Lines changed: 49 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"fmt"
88
"io"
99
"os"
10+
"path/filepath"
1011

1112
"github.com/google/go-containerregistry/pkg/name"
1213
v1 "github.com/google/go-containerregistry/pkg/v1"
@@ -151,9 +152,8 @@ func (r TarReader) getIdsFromManifest(file tarFile) (*imagedesc.ImageRefDescript
151152
return ids, nil
152153
}
153154

154-
func (r TarReader) ReadOci(reponame string) ([]imagedesc.ImageOrIndex, error) {
155+
func (r TarReader) ReadOci(importRepo name.Repository) ([]imagedesc.ImageOrIndex, error) {
155156

156-
//Check if the path is a OCI layout directory
157157
stat, err := os.Stat(r.path)
158158
if err != nil {
159159
return nil, err
@@ -163,39 +163,68 @@ func (r TarReader) ReadOci(reponame string) ([]imagedesc.ImageOrIndex, error) {
163163
return nil, fmt.Errorf("path %s is not a directory", r.path)
164164
}
165165

166-
//TODO : FromPath checks for index.json but does not check for oci-layout, so add a check for oci-layout here.
166+
_, err = os.Stat(filepath.Join(r.path, "oci-layout"))
167+
if err != nil {
168+
return nil, err
169+
}
167170

168171
l, err := layout.FromPath(r.path)
169172
if err != nil {
170173
return nil, err
171174
}
172175

173-
ImageIndex, err := l.ImageIndex()
176+
ii, err := l.ImageIndex()
177+
m, err := ii.IndexManifest()
178+
desc := m.Manifests[0]
174179

175-
ImageIndexIntermediate := imagedesc.ImageIndexIntermediate{
176-
Index: ImageIndex,
177-
}
180+
var ImageIntermediate imagedesc.ImageIntermediate
181+
var ImageIndexIntermediate imagedesc.ImageIndexIntermediate
182+
var ref string
183+
184+
if desc.MediaType.IsImage() {
185+
img, err := ii.Image(desc.Digest)
186+
if err != nil {
187+
return nil, err
188+
}
189+
190+
ImageIntermediate = imagedesc.ImageIntermediate{
191+
Image: img,
192+
}
178193

179-
// Update ref
180-
digest, err := ImageIndex.Digest()
181-
digestStr := digest.String()
182-
ref := reponame + "@" + digestStr
183-
ImageIndexIntermediate.SetRef(ref)
194+
digest, err := img.Digest()
195+
digestStr := digest.String()
196+
ref = importRepo.Name() + "@" + digestStr
184197

185-
// Create and populate imageOrIndex
186-
var i imagedesc.ImageIndexWithRef = ImageIndexIntermediate
198+
ImageIntermediate.SetRef(ref)
199+
200+
} else if desc.MediaType.IsIndex() {
201+
idx, err := ii.ImageIndex(desc.Digest)
202+
if err != nil {
203+
return nil, err
204+
}
205+
ImageIndexIntermediate = imagedesc.ImageIndexIntermediate{
206+
Index: idx,
207+
}
208+
209+
digest, err := idx.Digest()
210+
digestStr := digest.String()
211+
ref = importRepo.Name() + "@" + digestStr
212+
ImageIndexIntermediate.SetRef(ref)
213+
214+
} else {
215+
return nil, fmt.Errorf("Unexpected media type: %s", desc.MediaType)
216+
}
187217

218+
var b imagedesc.ImageWithRef = ImageIntermediate
188219
imageOrIndex := imagedesc.ImageOrIndex{
189-
Image: nil,
190-
Index: &i,
220+
Image: &b,
221+
Index: nil,
191222
Labels: map[string]string{
192-
"label1": "value1",
193-
"label2": "value2",
223+
"dev.carvel.imgpkg.copy.root-bundle": "",
194224
},
195-
OrigRef: "original-reference",
225+
OrigRef: "",
196226
}
197227

198-
//Add imageOrIndex to the slice of imageOrIndex
199228
var imageOrIndexSlice []imagedesc.ImageOrIndex
200229
imageOrIndexSlice = append(imageOrIndexSlice, imageOrIndex)
201230

0 commit comments

Comments
 (0)