feat: allow to store policy assets on oci registry · updatecli/updatecli@699769b · GitHub
Skip to content

Commit 699769b

Browse files
committed
feat: allow to store policy assets on oci registry
Signed-off-by: Olblak <me@olblak.com>
1 parent 0792f93 commit 699769b

6 files changed

Lines changed: 104 additions & 66 deletions

File tree

‎cmd/manifest_push.go‎

Lines changed: 1 addition & 0 deletions

‎cmd/root.go‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ var (
3333
valuesFiles []string
3434
valuesInline []string
3535
secretsFiles []string
36+
assetsFiles []string
3637
policyReferences []string
3738
e engine.Engine
3839
verbose bool
@@ -223,6 +224,7 @@ func run(command string) error {
223224
manifestFiles,
224225
valuesFiles,
225226
secretsFiles,
227+
assetsFiles,
226228
manifestPushPolicyReference,
227229
disableTLS,
228230
manifestPushPolicyFile,

‎pkg/core/engine/registry.go‎

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ func (e *Engine) PullFromRegistry(policyReference string, disableTLS bool) (err
2222
}
2323

2424
// PushToRegistry pushes an Updatecli policy to an OCI registry.
25-
func (e *Engine) PushToRegistry(manifests, valuesFiles, secretsFiles, policyReference []string, disableTLS bool, policyMetadataFile, fileStore string, overwrite bool) error {
25+
func (e *Engine) PushToRegistry(manifests, valuesFiles, secretsFiles, assetsFiles, policyReference []string, disableTLS bool, policyMetadataFile, fileStore string, overwrite bool) error {
2626

2727
PrintTitle("Registry")
2828

@@ -61,7 +61,17 @@ func (e *Engine) PushToRegistry(manifests, valuesFiles, secretsFiles, policyRefe
6161

6262
relativeFromFileStore(manifests)
6363

64-
err := registry.Push(policyMetadataFile, manifests, valuesFiles, secretsFiles, policyReference, disableTLS, fileStore, overwrite)
64+
err := registry.Push(registry.PushData{
65+
PolicyMetadataFile: policyMetadataFile,
66+
ManifestsFiles: manifests,
67+
ValuesFiles: valuesFiles,
68+
SecretsFiles: secretsFiles,
69+
AssetsFiles: assetsFiles,
70+
PolicyReferenceNames: policyReference,
71+
DisableTLS: disableTLS,
72+
FileStore: fileStore,
73+
Overwrite: overwrite,
74+
})
6575
if err != nil {
6676
return err
6777
}

‎pkg/core/registry/pullpush_test.go‎

Lines changed: 52 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -49,91 +49,96 @@ func TestPushPullPolicy(t *testing.T) {
4949

5050
testData := []struct {
5151
name string
52-
toPushPolicyName []string
5352
toPushPolicyFile string
54-
toPushManifestFiles []string
55-
toPushValueFiles []string
56-
toPushSecretFiles []string
57-
toPushFileStore string
5853
expectedPullManifestFiles []string
5954
expectedPullValuesFiles []string
6055
expectedPullSecretsFiles []string
61-
disableTLS bool
62-
overwrite bool
56+
expectedPullAssetsFiles []string
57+
toPushFileStore string
58+
pushData PushData
6359
}{
6460
{
6561
name: "Validate that we can push and pull a policy using the latest tag, even thought the tag is ignored",
66-
toPushPolicyName: []string{fmt.Sprintf("localhost:%d/myrepo:latest", port.Int())},
67-
disableTLS: true,
68-
toPushPolicyFile: "testdata/Policy.yaml",
69-
toPushManifestFiles: []string{"testdata/venom.yaml"},
70-
toPushValueFiles: []string{"testdata/values.yaml"},
71-
toPushSecretFiles: []string{"testdata/secrets.yaml"},
7262
expectedPullManifestFiles: []string{"testdata/venom.yaml"},
7363
expectedPullValuesFiles: []string{"testdata/values.yaml"},
7464
expectedPullSecretsFiles: []string{"testdata/secrets.yaml"},
65+
pushData: PushData{
66+
PolicyReferenceNames: []string{fmt.Sprintf("localhost:%d/myrepo:latest", port.Int())},
67+
PolicyMetadataFile: "testdata/Policy.yaml",
68+
DisableTLS: true,
69+
ManifestsFiles: []string{"testdata/venom.yaml"},
70+
ValuesFiles: []string{"testdata/values.yaml"},
71+
SecretsFiles: []string{"testdata/secrets.yaml"},
72+
},
73+
toPushFileStore: ".",
7574
},
7675
{
7776
name: "Validate that we can push and pull a policy without tag",
78-
toPushPolicyName: []string{fmt.Sprintf("localhost:%d/myrepo", port.Int())},
79-
disableTLS: true,
80-
toPushPolicyFile: "testdata/Policy.yaml",
81-
toPushManifestFiles: []string{"testdata/venom.yaml"},
82-
toPushValueFiles: []string{"testdata/values.yaml"},
83-
toPushSecretFiles: []string{"testdata/secrets.yaml"},
8477
expectedPullManifestFiles: []string{"testdata/venom.yaml"},
8578
expectedPullValuesFiles: []string{"testdata/values.yaml"},
8679
expectedPullSecretsFiles: []string{"testdata/secrets.yaml"},
80+
pushData: PushData{
81+
PolicyReferenceNames: []string{fmt.Sprintf("localhost:%d/myrepo", port.Int())},
82+
PolicyMetadataFile: "testdata/Policy.yaml",
83+
DisableTLS: true,
84+
ManifestsFiles: []string{"testdata/venom.yaml"},
85+
ValuesFiles: []string{"testdata/values.yaml"},
86+
SecretsFiles: []string{"testdata/secrets.yaml"},
87+
},
88+
toPushFileStore: ".",
8789
},
8890
{
8991
name: "Validate that we can push and pull a policy without tag from a different file store",
90-
toPushPolicyName: []string{fmt.Sprintf("localhost:%d/myrepo", port.Int())},
91-
disableTLS: true,
92-
toPushPolicyFile: "testdata/Policy.yaml",
93-
toPushManifestFiles: []string{"testdata/venom.yaml"},
94-
toPushValueFiles: []string{"testdata/values.yaml"},
95-
toPushSecretFiles: []string{"testdata/secrets.yaml"},
9692
expectedPullManifestFiles: []string{"testdata/venom.yaml"},
9793
expectedPullValuesFiles: []string{"testdata/values.yaml"},
9894
expectedPullSecretsFiles: []string{"testdata/secrets.yaml"},
9995
toPushFileStore: ".",
96+
pushData: PushData{
97+
PolicyReferenceNames: []string{fmt.Sprintf("localhost:%d/myrepo", port.Int())},
98+
PolicyMetadataFile: "testdata/Policy.yaml",
99+
DisableTLS: true,
100+
ManifestsFiles: []string{"testdata/venom.yaml"},
101+
ValuesFiles: []string{"testdata/values.yaml"},
102+
SecretsFiles: []string{"testdata/secrets.yaml"},
103+
},
104+
},
105+
{
106+
name: "Validate that we can push and pull a policy with assets",
107+
expectedPullManifestFiles: []string{"testdata/venom.yaml"},
108+
expectedPullValuesFiles: []string{"testdata/values.yaml"},
109+
expectedPullSecretsFiles: []string{"testdata/secrets.yaml"},
110+
expectedPullAssetsFiles: []string{"testdata/asset.sh"},
111+
toPushFileStore: ".",
112+
pushData: PushData{
113+
PolicyReferenceNames: []string{fmt.Sprintf("localhost:%d/myrepo", port.Int())},
114+
DisableTLS: true,
115+
PolicyMetadataFile: "testdata/Policy.yaml",
116+
AssetsFiles: []string{"testdata/asset.sh"},
117+
ManifestsFiles: []string{"testdata/venom.yaml"},
118+
ValuesFiles: []string{"testdata/values.yaml"},
119+
SecretsFiles: []string{"testdata/secrets.yaml"},
120+
},
100121
},
101122
}
102123

103124
for _, data := range testData {
104125

105126
t.Run(data.name, func(t *testing.T) {
106-
err = Push(
107-
data.toPushPolicyFile,
108-
data.toPushManifestFiles,
109-
data.toPushValueFiles,
110-
data.toPushSecretFiles,
111-
data.toPushPolicyName,
112-
data.disableTLS,
113-
data.toPushFileStore,
114-
data.overwrite)
127+
err = Push(data.pushData)
115128
require.NoError(t, err)
116129

117-
err = Push(
118-
data.toPushPolicyFile,
119-
data.toPushManifestFiles,
120-
data.toPushValueFiles,
121-
data.toPushSecretFiles,
122-
data.toPushPolicyName,
123-
data.disableTLS,
124-
data.toPushFileStore,
125-
data.overwrite)
130+
err = Push(data.pushData)
126131
require.NoError(t, err)
127132

128133
gotManifests, gotValues, gotSecrets, err := Pull(
129-
data.toPushPolicyName[0],
130-
data.disableTLS,
134+
data.pushData.PolicyReferenceNames[0],
135+
data.pushData.DisableTLS,
131136
)
132137
require.NoError(t, err)
133138

134139
expectedManifest, expectedValues, expectedSecrets, err := sanitizeDirPath(
135-
data.toPushPolicyName[0],
136-
data.disableTLS,
140+
data.pushData.PolicyReferenceNames[0],
141+
data.pushData.DisableTLS,
137142
data.expectedPullManifestFiles,
138143
data.expectedPullValuesFiles,
139144
data.expectedPullSecretsFiles,

‎pkg/core/registry/push.go‎

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,26 +19,40 @@ import (
1919
"oras.land/oras-go/v2/registry/remote/auth"
2020
)
2121

22+
// PushData is the data structure for the Push function.
23+
type PushData struct {
24+
PolicyMetadataFile string
25+
ManifestsFiles []string
26+
ValuesFiles []string
27+
SecretsFiles []string
28+
AssetsFiles []string
29+
PolicyReferenceNames []string
30+
DisableTLS bool
31+
FileStore string
32+
Overwrite bool
33+
}
34+
2235
// Push pushes updatecli manifest(s) as an OCI image to an OCI registry.
23-
func Push(policyMetadataFile string, manifests []string, values []string, secrets []string, policyReferenceNames []string, disableTLS bool, fileStore string, overwrite bool) error {
36+
// func Push(policyMetadataFile string, manifests []string, values []string, secrets []string, assets []string, policyReferenceNames []string, disableTLS bool, fileStore string, overwrite bool) error {
37+
func Push(p PushData) error {
2438
var err error
2539

26-
policySpec, err := LoadPolicyFile(policyMetadataFile)
40+
policySpec, err := LoadPolicyFile(p.PolicyMetadataFile)
2741
if err != nil {
2842
return fmt.Errorf("load policy file: %w", err)
2943
}
3044

31-
logrus.Infof("Pushing Updatecli policy:\n\t=> %s\n\n", strings.Join(policyReferenceNames, "\n\t=> "))
45+
logrus.Infof("Pushing Updatecli policy:\n\t=> %s\n\n", strings.Join(p.PolicyReferenceNames, "\n\t=> "))
3246

33-
if fileStore == "" {
34-
fileStore, err = os.Getwd()
47+
if p.FileStore == "" {
48+
p.FileStore, err = os.Getwd()
3549
if err != nil {
3650
logrus.Errorln(err)
3751
}
3852
}
3953

4054
// Create a file store
41-
fs, err := file.New(fileStore)
55+
fs, err := file.New(p.FileStore)
4256
if err != nil {
4357
return fmt.Errorf("create file store: %w", err)
4458
}
@@ -47,7 +61,7 @@ func Push(policyMetadataFile string, manifests []string, values []string, secret
4761
ctx := context.Background()
4862

4963
// Add files to the file store
50-
fileDescriptors := make([]v1.Descriptor, 0, len(manifests))
64+
fileDescriptors := make([]v1.Descriptor, 0, len(p.ManifestsFiles))
5165

5266
addfiles := func(files []string, mediaType string) error {
5367
for i := range files {
@@ -61,18 +75,22 @@ func Push(policyMetadataFile string, manifests []string, values []string, secret
6175
return nil
6276
}
6377

64-
if err = addfiles(manifests, updatecliManifestMediaType); err != nil {
78+
if err = addfiles(p.ManifestsFiles, updatecliManifestMediaType); err != nil {
6579
return fmt.Errorf("add manifests: %w", err)
6680
}
6781

68-
if err = addfiles(values, updatecliValueMediaType); err != nil {
82+
if err = addfiles(p.ValuesFiles, updatecliValueMediaType); err != nil {
6983
return fmt.Errorf("add values: %w", err)
7084
}
7185

72-
if err = addfiles(secrets, updatecliSecretMediaType); err != nil {
86+
if err = addfiles(p.SecretsFiles, updatecliSecretMediaType); err != nil {
7387
return fmt.Errorf("add secrets: %w", err)
7488
}
7589

90+
if err = addfiles(p.AssetsFiles, updatecliAssetMediaType); err != nil {
91+
return fmt.Errorf("add assets: %w", err)
92+
}
93+
7694
// 2. Pack the files and tag the packed manifest
7795
opts := oras.PackManifestOptions{
7896
Layers: fileDescriptors,
@@ -101,9 +119,9 @@ func Push(policyMetadataFile string, manifests []string, values []string, secret
101119
return fmt.Errorf("pack manifest: %w", err)
102120
}
103121

104-
for i := range policyReferenceNames {
122+
for i := range p.PolicyReferenceNames {
105123

106-
refName, err := name.ParseReference(policyReferenceNames[i])
124+
refName, err := name.ParseReference(p.PolicyReferenceNames[i])
107125
if err != nil {
108126
logrus.Errorf("parse reference: %s", err)
109127
continue
@@ -122,7 +140,7 @@ func Push(policyMetadataFile string, manifests []string, values []string, secret
122140
}
123141
ctx = auth.AppendRepositoryScope(ctx, repo.Reference, auth.ActionPush, auth.ActionPull)
124142

125-
if disableTLS {
143+
if p.DisableTLS {
126144
repo.PlainHTTP = true
127145
}
128146

@@ -132,16 +150,16 @@ func Push(policyMetadataFile string, manifests []string, values []string, secret
132150
}
133151

134152
_, _, err = repo.FetchReference(ctx, tag)
135-
if err == nil && !overwrite {
136-
logrus.Infof("tag %q already published for policy %s", tag, policyReferenceNames[i])
153+
if err == nil && !p.Overwrite {
154+
logrus.Infof("tag %q already published for policy %s", tag, p.PolicyReferenceNames[i])
137155
return nil
138156
} else if err == nil {
139-
logrus.Infof("overwriting, already published, tag %q for policy %s", tag, policyReferenceNames[i])
157+
logrus.Infof("overwriting, already published, tag %q for policy %s", tag, p.PolicyReferenceNames[i])
140158

141159
} else if errors.Is(err, errdef.ErrNotFound) {
142160
logrus.Infof("publishing policy %s", tag)
143161
} else {
144-
return fmt.Errorf("check if %s is already published: %s", policyReferenceNames[i], err)
162+
return fmt.Errorf("check if %s is already published: %s", p.PolicyReferenceNames[i], err)
145163
}
146164

147165
// 3. Copy from the file store to the remote repository

‎pkg/core/registry/var.go‎

Lines changed: 2 additions & 0 deletions

0 commit comments

Comments
 (0)