OCITarReader return an io.ReadCloser to read the image as a v1 tarball
(overrideName string)
| 118 | |
| 119 | // OCITarReader return an io.ReadCloser to read the image as a v1 tarball |
| 120 | func (c ImageSource) OCITarReader(overrideName string) (io.ReadCloser, error) { |
| 121 | imageName := c.ref.String() |
| 122 | saveName := imageName |
| 123 | if overrideName != "" { |
| 124 | saveName = overrideName |
| 125 | } |
| 126 | refName, err := name.ParseReference(saveName) |
| 127 | if err != nil { |
| 128 | return nil, fmt.Errorf("error parsing image name: %v", err) |
| 129 | } |
| 130 | // get a reference to the image |
| 131 | image, err := c.provider.findImage(imageName, *c.platform) |
| 132 | if err != nil { |
| 133 | return nil, err |
| 134 | } |
| 135 | // convert the writer to a reader |
| 136 | r, w := io.Pipe() |
| 137 | go func() { |
| 138 | defer func() { _ = w.Close() }() |
| 139 | tw := tar.NewWriter(w) |
| 140 | defer func() { _ = tw.Close() }() |
| 141 | if err := writeLayoutHeader(tw); err != nil { |
| 142 | _ = w.CloseWithError(err) |
| 143 | return |
| 144 | } |
| 145 | |
| 146 | if err := writeLayoutImage(tw, image); err != nil { |
| 147 | _ = w.CloseWithError(err) |
| 148 | return |
| 149 | } |
| 150 | |
| 151 | imageDigest, err := image.Digest() |
| 152 | if err != nil { |
| 153 | _ = w.CloseWithError(err) |
| 154 | return |
| 155 | } |
| 156 | imageSize, err := image.Size() |
| 157 | if err != nil { |
| 158 | _ = w.CloseWithError(err) |
| 159 | return |
| 160 | } |
| 161 | |
| 162 | // write the index file |
| 163 | desc := v1.Descriptor{ |
| 164 | MediaType: types.OCIImageIndex, |
| 165 | Size: imageSize, |
| 166 | Digest: imageDigest, |
| 167 | Annotations: map[string]string{ |
| 168 | imagespec.AnnotationRefName: refName.String(), |
| 169 | }, |
| 170 | } |
| 171 | if err := writeLayoutIndex(tw, desc); err != nil { |
| 172 | _ = w.CloseWithError(err) |
| 173 | return |
| 174 | } |
| 175 | }() |
| 176 | return r, nil |
| 177 | } |
nothing calls this directly
no test coverage detected