Skip to content

Commit eeeedda

Browse files
carabasdanieloanatmaria
and
oanatmaria
authored
Bump oras to v2 (#126)
* Bump oras-go to v2 * Update build to oras v2 Signed-off-by: carabasdaniel <[email protected]> * Fix push & tag * Allow rebuild Signed-off-by: carabasdaniel <[email protected]> * Fix build images * Oci Tag only on not resolved Signed-off-by: carabasdaniel <[email protected]> * PostCopy tag Signed-off-by: carabasdaniel <[email protected]> * Add copyskipped Signed-off-by: carabasdaniel <[email protected]> * Add media type check for copy options Signed-off-by: carabasdaniel <[email protected]> * Extract remote manager Signed-off-by: carabasdaniel <[email protected]> * Test with pre-release Signed-off-by: carabasdaniel <[email protected]> * Fix on rebase Signed-off-by: carabasdaniel <[email protected]> * Use oci package in repl Signed-off-by: carabasdaniel <[email protected]> * Hack to allow rm to work with oras v2 until oras-project/oras-go#454 Signed-off-by: carabasdaniel <[email protected]> * Use oras v2 in save command Signed-off-by: carabasdaniel <[email protected]> * Use oras v2 in inspect Signed-off-by: carabasdaniel <[email protected]> * Fix linting errors Signed-off-by: carabasdaniel <[email protected]> --------- Signed-off-by: carabasdaniel <[email protected]> Co-authored-by: oanatmaria <[email protected]>
1 parent dff729f commit eeeedda

11 files changed

+376
-233
lines changed

go.mod

+3-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ require (
1414
github.com/containerd/containerd v1.6.15
1515
github.com/dustin/go-humanize v1.0.0
1616
github.com/golang/mock v1.6.0
17-
github.com/google/uuid v1.3.0
1817
github.com/google/wire v0.5.0
1918
github.com/magefile/mage v1.14.0
2019
github.com/mitchellh/mapstructure v1.5.0
@@ -29,7 +28,7 @@ require (
2928
golang.org/x/term v0.4.0
3029
google.golang.org/grpc v1.51.0
3130
gopkg.in/yaml.v2 v2.4.0
32-
oras.land/oras-go v1.2.2
31+
oras.land/oras-go/v2 v2.0.0
3332
sigs.k8s.io/controller-runtime v0.14.1
3433
)
3534

@@ -66,6 +65,7 @@ require (
6665
github.com/google/go-github/v33 v33.0.0 // indirect
6766
github.com/google/go-querystring v1.1.0 // indirect
6867
github.com/google/subcommands v1.0.1 // indirect
68+
github.com/google/uuid v1.3.0 // indirect
6969
github.com/gorilla/mux v1.8.0 // indirect
7070
github.com/grpc-ecosystem/grpc-gateway/v2 v2.14.0 // indirect
7171
github.com/hashicorp/errwrap v1.1.0 // indirect
@@ -133,4 +133,5 @@ require (
133133
gopkg.in/ini.v1 v1.67.0 // indirect
134134
gopkg.in/yaml.v3 v3.0.1 // indirect
135135
k8s.io/utils v0.0.0-20221128185143-99ec85e7a448 // indirect
136+
oras.land/oras-go v1.2.2 // indirect
136137
)

go.sum

+2
Original file line numberDiff line numberDiff line change
@@ -859,6 +859,8 @@ k8s.io/utils v0.0.0-20221128185143-99ec85e7a448 h1:KTgPnR10d5zhztWptI952TNtt/4u5
859859
k8s.io/utils v0.0.0-20221128185143-99ec85e7a448/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
860860
oras.land/oras-go v1.2.2 h1:0E9tOHUfrNH7TCDk5KU0jVBEzCqbfdyuVfGmJ7ZeRPE=
861861
oras.land/oras-go v1.2.2/go.mod h1:Apa81sKoZPpP7CDciE006tSZ0x3Q3+dOoBcMZ/aNxvw=
862+
oras.land/oras-go/v2 v2.0.0 h1:+LRAz92WF7AvYQsQjPEAIw3Xb2zPPhuydjpi4pIHmc0=
863+
oras.land/oras-go/v2 v2.0.0/go.mod h1:iVExH1NxrccIxjsiq17L91WCZ4KIw6jVQyCLsZsu1gc=
862864
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
863865
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
864866
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=

go.work.sum

-1
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,6 @@ google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6F
393393
google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=
394394
google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=
395395
google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70=
396-
google.golang.org/api v0.102.0 h1:JxJl2qQ85fRMPNvlZY/enexbxpCjLwGhZUtgfGeQ51I=
397396
google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo=
398397
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
399398
google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=

pkg/app/build.go

+39-56
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
package app
22

33
import (
4-
"io"
4+
"bufio"
55
"os"
66
"path/filepath"
7+
"strings"
78
"time"
89

910
"github.com/aserto-dev/runtime"
10-
containerd_content "github.com/containerd/containerd/content"
1111
"github.com/containerd/containerd/errdefs"
1212
"github.com/containerd/containerd/reference/docker"
13-
"github.com/google/uuid"
13+
1414
"github.com/opcr-io/policy/pkg/oci"
1515
"github.com/opcr-io/policy/pkg/parser"
1616
"github.com/opencontainers/go-digest"
1717
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
1818
"github.com/pkg/errors"
19-
"oras.land/oras-go/pkg/content"
19+
orasoci "oras.land/oras-go/v2/content/oci"
2020
)
2121

2222
const (
@@ -84,11 +84,7 @@ func (c *PolicyApp) Build(ref string, path []string, annotations map[string]stri
8484
return errors.Wrap(err, "failed to build opa policy bundle")
8585
}
8686

87-
ociStore, err := content.NewOCI(c.Configuration.PoliciesRoot())
88-
if err != nil {
89-
return err
90-
}
91-
err = ociStore.LoadIndex()
87+
ociStore, err := orasoci.New(c.Configuration.PoliciesRoot())
9288
if err != nil {
9389
return err
9490
}
@@ -97,27 +93,31 @@ func (c *PolicyApp) Build(ref string, path []string, annotations map[string]stri
9793
annotations = map[string]string{}
9894
}
9995

100-
parsedRef, err := docker.ParseDockerRef(ref)
96+
familiarezedRef, err := parser.CalculatePolicyRef(ref, c.Configuration.DefaultDomain)
97+
if err != nil {
98+
return errors.Wrap(err, "failed to calculate policy reference")
99+
}
100+
101+
parsedRef, err := docker.ParseDockerRef(familiarezedRef)
101102
if err != nil {
102103
return err
103104
}
105+
104106
annotations[ocispec.AnnotationTitle] = docker.TrimNamed(parsedRef).String()
105107
annotations[AnnotationPolicyRegistryType] = PolicyTypePolicy
106108
annotations[ocispec.AnnotationCreated] = time.Now().UTC().Format(time.RFC3339)
107109

108-
descriptor, err := c.createImage(ociStore, outfile, annotations)
110+
desc, err := c.createImage(ociStore, outfile, annotations)
109111
if err != nil {
110112
return err
111113
}
112114

113-
parsed, err := parser.CalculatePolicyRef(ref, c.Configuration.DefaultDomain)
115+
err = ociStore.Tag(c.Context, desc, parsedRef.String())
114116
if err != nil {
115-
return errors.Wrap(err, "failed to calculate policy reference")
117+
return err
116118
}
117119

118-
ociStore.AddReference(parsed, descriptor)
119-
120-
c.UI.Normal().WithStringValue("reference", ref).Msg("Tagging image.")
120+
c.UI.Normal().WithStringValue("reference", parsedRef.String()).Msg("Tagging image.")
121121

122122
err = ociStore.SaveIndex()
123123
if err != nil {
@@ -127,27 +127,19 @@ func (c *PolicyApp) Build(ref string, path []string, annotations map[string]stri
127127
return nil
128128
}
129129

130-
func (c *PolicyApp) createImage(ociStore *content.OCI, tarball string, annotations map[string]string) (ocispec.Descriptor, error) {
130+
func (c *PolicyApp) createImage(ociStore *orasoci.Store, tarball string, annotations map[string]string) (ocispec.Descriptor, error) {
131131
descriptor := ocispec.Descriptor{}
132-
132+
ociStore.AutoSaveIndex = true
133133
fDigest, err := c.fileDigest(tarball)
134134
if err != nil {
135135
return descriptor, err
136136
}
137137

138-
_, err = ociStore.Info(c.Context, fDigest)
139-
if err != nil && !errors.Is(err, errdefs.ErrNotFound) {
138+
tarballFile, err := os.Open(tarball)
139+
if err != nil {
140140
return descriptor, err
141141
}
142-
143-
if err == nil {
144-
err = ociStore.Delete(c.Context, fDigest)
145-
if err != nil {
146-
return descriptor, errors.Wrap(err, "couldn't overwrite existing image")
147-
}
148-
}
149-
150-
tarballFile, err := os.Open(tarball)
142+
fileInfo, err := tarballFile.Stat()
151143
if err != nil {
152144
return descriptor, err
153145
}
@@ -158,44 +150,35 @@ func (c *PolicyApp) createImage(ociStore *content.OCI, tarball string, annotatio
158150
}
159151
}()
160152

161-
fileInfo, err := tarballFile.Stat()
162-
if err != nil {
163-
return descriptor, err
164-
}
165-
166-
descriptor = ocispec.Descriptor{
167-
MediaType: oci.MediaTypeImageLayer,
168-
Digest: fDigest,
169-
Size: fileInfo.Size(),
170-
Annotations: annotations,
171-
}
153+
descriptor.Digest = fDigest
154+
descriptor.Size = fileInfo.Size()
155+
descriptor.Annotations = annotations
156+
descriptor.MediaType = oci.MediaTypeImageLayer
172157

173-
ociWriter, err := ociStore.Writer(
174-
c.Context,
175-
containerd_content.WithDescriptor(descriptor),
176-
containerd_content.WithRef(uuid.NewString()))
177-
if err != nil {
158+
exists, err := ociStore.Exists(c.Context, descriptor)
159+
if err != nil && !errors.Is(err, errdefs.ErrNotFound) {
178160
return descriptor, err
179161
}
180-
defer func() {
181-
err := ociWriter.Close()
162+
163+
if exists {
164+
// Hack to remove the existing digest until ocistore deleter is implemented
165+
// https://github.com/oras-project/oras-go/issues/454
166+
digestPath := filepath.Join(strings.Split(descriptor.Digest.String(), ":")...)
167+
blob := filepath.Join(c.Configuration.PoliciesRoot(), "blobs", digestPath)
168+
err = os.Remove(blob)
182169
if err != nil {
183-
c.UI.Problem().WithErr(err).Msg("Failed to close local OCI store.")
170+
return descriptor, err
184171
}
185-
}()
186-
187-
_, err = io.Copy(ociWriter, tarballFile)
188-
if err != nil {
189-
return descriptor, err
190172
}
191173

192-
err = ociWriter.Commit(c.Context, fileInfo.Size(), fDigest)
174+
reader := bufio.NewReader(tarballFile)
175+
176+
err = ociStore.Push(c.Context, descriptor, reader)
193177
if err != nil {
194178
return descriptor, err
195179
}
196-
197180
c.UI.Normal().
198-
WithStringValue("digest", ociWriter.Digest().String()).
181+
WithStringValue("digest", descriptor.Digest.String()).
199182
Msg("Created new image.")
200183

201184
return descriptor, nil

pkg/app/images.go

+16-17
Original file line numberDiff line numberDiff line change
@@ -3,38 +3,39 @@ package app
33
import (
44
"sort"
55
"strings"
6-
"time"
76

87
"github.com/containerd/containerd/reference/docker"
98
"github.com/dustin/go-humanize"
10-
"oras.land/oras-go/pkg/content"
9+
"oras.land/oras-go/v2/content/oci"
1110
)
1211

1312
func (c *PolicyApp) Images() error {
1413
defer c.Cancel()
1514

1615
var data [][]string
1716

18-
ociStore, err := content.NewOCI(c.Configuration.PoliciesRoot())
17+
ociStore, err := oci.New(c.Configuration.PoliciesRoot())
1918
if err != nil {
2019
return err
2120
}
2221

23-
err = ociStore.LoadIndex()
24-
if err != nil {
22+
table := c.UI.Normal().WithTable("Repository", "Tag", "Image ID", "Size")
23+
var tgs []string
24+
err = ociStore.Tags(c.Context, "", func(tags []string) error {
25+
tgs = append(tgs, tags...)
2526
return nil
27+
})
28+
if err != nil {
29+
return err
2630
}
2731

28-
table := c.UI.Normal().WithTable("Repository", "Tag", "Image ID", "Created", "Size")
29-
refs := ociStore.ListReferences()
30-
31-
for k, v := range refs {
32-
info, err := ociStore.Info(c.Context, v.Digest)
32+
for _, tag := range tgs {
33+
descr, err := ociStore.Resolve(c.Context, tag)
3334
if err != nil {
3435
return err
3536
}
3637

37-
ref, err := docker.ParseDockerRef(k)
38+
ref, err := docker.ParseDockerRef(tag)
3839
if err != nil {
3940
return err
4041
}
@@ -55,22 +56,20 @@ func (c *PolicyApp) Images() error {
5556
arrData := []string{
5657
familiarName,
5758
tagOrNone,
58-
info.Digest.Encoded()[:12],
59-
humanize.Time(info.CreatedAt),
60-
strings.ReplaceAll(humanize.Bytes(uint64(v.Size)), " ", ""),
61-
info.CreatedAt.Format(time.RFC3339Nano)}
59+
descr.Digest.Encoded()[:12],
60+
strings.ReplaceAll(humanize.Bytes(uint64(descr.Size)), " ", "")}
6261

6362
data = append(data, arrData)
6463
}
6564

6665
// sort data by CreatedAt DESC.
6766
sort.SliceStable(data, func(i, j int) bool {
68-
return data[i][5] < data[j][5] || (data[i][5] == data[j][5] && data[i][1] < data[j][1])
67+
return data[i][3] < data[j][3] || (data[i][3] == data[j][3] && data[i][1] < data[j][1])
6968
})
7069

7170
for i := len(data) - 1; i >= 0; i-- {
7271
v := data[i]
73-
table.WithTableRow(v[0], v[1], v[2], v[3], v[4])
72+
table.WithTableRow(v[0], v[1], v[2], v[3])
7473
}
7574

7675
table.Do()

pkg/app/inspect.go

+6-29
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package app
22

33
import (
4+
"github.com/opcr-io/policy/pkg/oci"
45
"github.com/opcr-io/policy/pkg/parser"
56
"github.com/pkg/errors"
6-
"oras.land/oras-go/pkg/content"
77
)
88

99
func (c *PolicyApp) Inspect(userRef string) error {
@@ -14,53 +14,30 @@ func (c *PolicyApp) Inspect(userRef string) error {
1414
return err
1515
}
1616

17-
ociStore, err := content.NewOCI(c.Configuration.PoliciesRoot())
17+
ociClient, err := oci.NewOCI(c.Context, c.Logger, c.getHosts, c.Configuration.PoliciesRoot())
1818
if err != nil {
1919
return err
2020
}
21-
err = ociStore.LoadIndex()
22-
if err != nil {
23-
return err
24-
}
25-
26-
refs := ociStore.ListReferences()
2721

28-
refDescriptor, ok := refs[ref]
29-
if !ok {
30-
return errors.Errorf("policy [%s] not found in the local store", ref)
31-
}
32-
33-
contentInfo, err := ociStore.Info(c.Context, refDescriptor.Digest)
22+
contentInfo, err := ociClient.GetStore().Resolve(c.Context, ref)
3423
if err != nil {
3524
return errors.Wrapf(err, "failed to read content info for policy [%s]", ref)
3625
}
3726

3827
c.UI.Normal().
28+
WithStringValue("media type", contentInfo.MediaType).
3929
WithStringValue("digest", contentInfo.Digest.String()).
4030
WithIntValue("size", contentInfo.Size).
41-
WithStringValue("created_at", contentInfo.CreatedAt.String()).
42-
WithStringValue("updated_at", contentInfo.UpdatedAt.String()).
4331
Do()
4432

45-
if len(refDescriptor.Annotations) > 0 {
33+
if len(contentInfo.Annotations) > 0 {
4634
msg := c.UI.Normal().WithTable("Annotation", "Value")
4735

48-
for k, v := range refDescriptor.Annotations {
36+
for k, v := range contentInfo.Annotations {
4937
msg.WithTableRow(k, v)
5038
}
51-
5239
msg.Msg("Annotations")
5340
}
5441

55-
if len(contentInfo.Labels) > 0 {
56-
msg := c.UI.Normal().WithTable("Label", "Value")
57-
58-
for k, v := range contentInfo.Labels {
59-
msg.WithTableRow(k, v)
60-
}
61-
62-
msg.Msg("Labels")
63-
}
64-
6542
return nil
6643
}

0 commit comments

Comments
 (0)