Skip to content

Commit a4a4636

Browse files
committedAug 1, 2019
feat(appregistry): have appregistry transform configmap bundles
into directories taken from github.com/kevinrizza/offline-cataloger
1 parent 6c3060c commit a4a4636

10 files changed

+191
-149
lines changed
 

‎pkg/appregistry/appregistry.go

+8-15
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ package appregistry
33
import (
44
"fmt"
55

6-
"github.com/operator-framework/operator-registry/pkg/registry"
76
"github.com/sirupsen/logrus"
87
"k8s.io/client-go/kubernetes"
98
"k8s.io/client-go/rest"
109
"k8s.io/client-go/tools/clientcmd"
10+
11+
"github.com/operator-framework/operator-registry/pkg/registry"
1112
)
1213

1314
// NewLoader returns a new instance of AppregistryLoader.
@@ -28,7 +29,7 @@ func NewLoader(kubeconfig string, dbName string, downloadPath string, logger *lo
2829
}
2930

3031
specifier := &registrySpecifier{}
31-
decoder, err := NewManifestDecoder(logger, downloadPath)
32+
decoder, err := NewManifestDecoder(logger)
3233
if err != nil {
3334
return nil, err
3435
}
@@ -42,6 +43,7 @@ func NewLoader(kubeconfig string, dbName string, downloadPath string, logger *lo
4243
logger: logger,
4344
kubeClient: *kubeClient,
4445
},
46+
downloadPath: downloadPath,
4547
decoder: decoder,
4648
loader: loader,
4749
}, nil
@@ -51,6 +53,7 @@ type AppregistryLoader struct {
5153
logger *logrus.Entry
5254
input *inputParser
5355
downloader *downloader
56+
downloadPath string
5457
decoder *manifestDecoder
5558
loader *dbLoader
5659
}
@@ -87,7 +90,7 @@ func (a *AppregistryLoader) Load(csvSources []string, csvPackages string) (store
8790

8891
// The set of operator manifest(s) downloaded is a collection of both
8992
// flattened single file yaml and nested operator bundle(s).
90-
result, err := a.decoder.Decode(rawManifests)
93+
result, err := a.decoder.Decode(rawManifests, a.downloadPath)
9194
if err != nil {
9295
a.logger.Errorf("The following error occurred while decoding manifest - %v", err)
9396

@@ -99,18 +102,8 @@ func (a *AppregistryLoader) Load(csvSources []string, csvPackages string) (store
99102

100103
a.logger.Infof("decoded %d flattened and %d nested operator manifest(s)", result.FlattenedCount, result.NestedCount)
101104

102-
if result.Flattened != nil {
103-
a.logger.Info("loading flattened operator manifest(s) into sqlite")
104-
if err = a.loader.LoadFlattenedToSQLite(result.Flattened); err != nil {
105-
return
106-
}
107-
}
108-
109-
if result.NestedCount > 0 {
110-
a.logger.Infof("loading nested operator bundle(s) from %s into sqlite", result.NestedDirectory)
111-
if err = a.loader.LoadBundleDirectoryToSQLite(result.NestedDirectory); err != nil {
112-
return
113-
}
105+
if err = a.loader.LoadBundleDirectoryToSQLite(a.downloadPath); err != nil {
106+
return
114107
}
115108

116109
store, err = a.loader.GetStore()

‎pkg/appregistry/bundle_processor.go

+10-35
Original file line numberDiff line numberDiff line change
@@ -2,55 +2,30 @@ package appregistry
22

33
import (
44
"archive/tar"
5-
"errors"
65
"io"
76
"os"
87
"path/filepath"
9-
10-
"github.com/sirupsen/logrus"
118
)
129

13-
func NewBundleProcessor(logger *logrus.Entry, downloadPath string) (*bundleProcessor, error) {
14-
if downloadPath == "" {
15-
return nil, errors.New("folder to store downloaded operator bundle has not been specified")
16-
}
10+
const (
11+
directoryPerm = 0755
12+
fileFlag = os.O_CREATE | os.O_RDWR
13+
)
1714

18-
return &bundleProcessor{
19-
logger: logger,
20-
base: downloadPath,
21-
}, nil
15+
// NewBundleProcessor is a bundleProcessor constructor
16+
func NewBundleProcessor() (*bundleProcessor, error) {
17+
return &bundleProcessor{}, nil
2218
}
2319

2420
type bundleProcessor struct {
25-
logger *logrus.Entry
26-
base string
27-
}
28-
29-
func (w *bundleProcessor) GetManifestDownloadDirectory() string {
30-
return w.base
3121
}
3222

3323
// Process takes an item of the tar ball and writes it to the underlying file
3424
// system.
35-
func (w *bundleProcessor) Process(header *tar.Header, reader io.Reader) (done bool, err error) {
36-
const (
37-
directoryPerm = 0755
38-
fileFlag = os.O_CREATE | os.O_RDWR
39-
)
40-
41-
getType := func(header *tar.Header) string {
42-
switch header.Typeflag {
43-
case tar.TypeReg:
44-
return "file"
45-
case tar.TypeDir:
46-
return "directory"
47-
}
48-
49-
return "unknown"
50-
}
25+
func (w *bundleProcessor) Process(header *tar.Header, manifestName, workingDirectory string, reader io.Reader) (done bool, err error) {
5126

52-
target := filepath.Join(w.base, header.Name)
53-
w.logger.Infof("%s - type=%s", target, getType(header))
27+
namedManifestDirectory := filepath.Join(workingDirectory, manifestName)
28+
target := filepath.Join(namedManifestDirectory, header.Name)
5429

5530
if header.Typeflag == tar.TypeDir {
5631
if _, err = os.Stat(target); err == nil {

‎pkg/appregistry/checker.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func (b *formatChecker) IsNestedBundleFormat() bool {
4646
// This function maintains state associated with a tar file, so it can be used
4747
// for a single tar file only. The caller is responsible for creating a new
4848
// instance for each tar ball it handles.
49-
func (b *formatChecker) Process(header *tar.Header, reader io.Reader) (done bool, err error) {
49+
func (b *formatChecker) Process(header *tar.Header, manifestName, workingDirectory string, reader io.Reader) (done bool, err error) {
5050
// We expect tar ball using flattened format to contain exactly one file.
5151
// So if we run into more than one file then we deem the tar to be
5252
// a manifest using operator bundle format.

‎pkg/appregistry/checker_test.go

+18-3
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@ package appregistry
22

33
import (
44
"archive/tar"
5+
"io/ioutil"
6+
"os"
57
"testing"
68

79
"github.com/stretchr/testify/assert"
10+
"github.com/stretchr/testify/require"
811
)
912

1013
func TestProcessWithFlattenedFormat(t *testing.T) {
@@ -20,11 +23,17 @@ func TestProcessWithFlattenedFormat(t *testing.T) {
2023
Name: "bundle.yaml",
2124
}
2225

23-
doneGot, errGot := checker.Process(root, nil)
26+
workingDirectory, err := ioutil.TempDir(".", "manifests-")
27+
require.NoError(t, err)
28+
defer func(){
29+
require.NoError(t, os.RemoveAll(workingDirectory))
30+
}()
31+
32+
doneGot, errGot := checker.Process(root, "test", workingDirectory, nil)
2433
assert.NoError(t, errGot)
2534
assert.False(t, doneGot)
2635

27-
doneGot, errGot = checker.Process(bundleAML, nil)
36+
doneGot, errGot = checker.Process(bundleAML, "test", workingDirectory, nil)
2837
assert.NoError(t, errGot)
2938
assert.False(t, doneGot)
3039

@@ -44,8 +53,14 @@ func TestProcessWithNestedBundleFormat(t *testing.T) {
4453
&tar.Header{Name: "manifests/etcd/etcd.package.yaml", Typeflag: tar.TypeReg},
4554
}
4655

56+
workingDirectory, err := ioutil.TempDir(".", "manifests-")
57+
require.NoError(t, err)
58+
defer func(){
59+
require.NoError(t, os.RemoveAll(workingDirectory))
60+
}()
61+
4762
for _, header := range headers {
48-
doneGot, errGot := checker.Process(header, nil)
63+
doneGot, errGot := checker.Process(header,"test", workingDirectory, nil)
4964
assert.NoError(t, errGot)
5065

5166
if checker.IsNestedBundleFormat() {

‎pkg/appregistry/flattened_processor.go

+69-30
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,20 @@ package appregistry
33
import (
44
"archive/tar"
55
"bytes"
6+
"fmt"
67
"io"
7-
8-
"github.com/sirupsen/logrus"
8+
"os"
9+
"path/filepath"
910
)
1011

11-
func NewFlattenedProcessor(logger *logrus.Entry) *flattenedProcessor {
12+
func NewFlattenedProcessor() (*flattenedProcessor, error) {
1213
return &flattenedProcessor{
13-
logger: logger,
1414
parser: &manifestYAMLParser{},
15-
merged: StructuredOperatorManifestData{},
16-
}
15+
}, nil
1716
}
1817

1918
type flattenedProcessor struct {
20-
logger *logrus.Entry
2119
parser ManifestYAMLParser
22-
23-
merged StructuredOperatorManifestData
2420
count int
2521
}
2622

@@ -31,8 +27,9 @@ func (w *flattenedProcessor) GetProcessedCount() int {
3127
// Process handles a flattened single file operator manifest.
3228
//
3329
// It expects a single file, as soon as the function encounters a file it parses
34-
// the raw yaml and merges it into the uber manifest.
35-
func (w *flattenedProcessor) Process(header *tar.Header, reader io.Reader) (done bool, err error) {
30+
// the raw yaml, separates it, converts it into a nested directory format,
31+
// and writes those nested manifests to files.
32+
func (w *flattenedProcessor) Process(header *tar.Header, manifestName, workingDirectory string, reader io.Reader) (done bool, err error) {
3633
if header.Typeflag != tar.TypeReg {
3734
return
3835
}
@@ -54,30 +51,72 @@ func (w *flattenedProcessor) Process(header *tar.Header, reader io.Reader) (done
5451
return
5552
}
5653

57-
w.merged.Packages = append(w.merged.Packages, manifest.Packages...)
58-
w.merged.CustomResourceDefinitions = append(w.merged.CustomResourceDefinitions, manifest.CustomResourceDefinitions...)
59-
w.merged.ClusterServiceVersions = append(w.merged.ClusterServiceVersions, manifest.ClusterServiceVersions...)
54+
// now let's write each file to a directory
55+
packageName := manifest.Packages[0].PackageName
56+
57+
manifestFolder := filepath.Join(workingDirectory, packageName)
58+
59+
err = os.MkdirAll(manifestFolder, directoryPerm)
60+
if err != nil {
61+
return
62+
}
6063

61-
w.count += 1
64+
// write csvs and crds for each csv version
65+
for _, csv := range manifest.ClusterServiceVersions {
66+
csvFileName := filepath.Join(manifestFolder, fmt.Sprintf("%s.clusterserviceversion.yaml", csv.Name))
67+
csvFile, err := w.parser.MarshalCSV(&csv)
68+
if err != nil {
69+
return done, err
70+
}
71+
72+
err = writeYamlToFile(csvFileName, csvFile)
73+
if err != nil {
74+
return done, err
75+
}
76+
}
77+
78+
// write crds
79+
for _, crd := range manifest.CustomResourceDefinitions {
80+
crdFileName := filepath.Join(manifestFolder, fmt.Sprintf("%s-%s.crd.yaml", crd.Spec.Names.Kind, crd.Spec.Version))
81+
crdFile, err := w.parser.MarshalCRD(&crd)
82+
if err != nil {
83+
return done, err
84+
}
85+
86+
err = writeYamlToFile(crdFileName, crdFile)
87+
if err != nil {
88+
return done, err
89+
}
90+
}
91+
92+
// write package file
93+
packageFileName := filepath.Join(manifestFolder, fmt.Sprintf("%s.package.yaml", packageName))
94+
packageFile, err := w.parser.MarshalPackage(&manifest.Packages[0])
95+
if err != nil {
96+
return
97+
}
98+
99+
err = writeYamlToFile(packageFileName, packageFile)
100+
if err != nil {
101+
return
102+
}
103+
104+
w.count++
62105
return
63106
}
64107

65-
// Merge merges a set of operator manifest(s) into one.
66-
//
67-
// For a given operator source we have N ( N >= 1 ) repositories within the
68-
// given registry namespace. It is required for each repository to contain
69-
// manifest for a single operator.
70-
//
71-
// Once downloaded we can use this function to merge manifest(s) from all
72-
// relevant repositories into an uber manifest.
73-
//
74-
// We assume that all CRD(s), CSV(s) and package(s) are globally unique.
75-
// Otherwise we will fail to load the uber manifest into sqlite.
76-
func (w *flattenedProcessor) MergeIntoDataSection() (*RawOperatorManifestData, error) {
77-
manifests, err := w.parser.Marshal(&w.merged)
108+
func writeYamlToFile(filepath, content string) error {
109+
fo, err := os.Create(filepath)
110+
if err != nil {
111+
panic(err)
112+
}
113+
114+
defer fo.Close()
115+
116+
_, err = fo.WriteString(content)
78117
if err != nil {
79-
return nil, err
118+
return err
80119
}
81120

82-
return manifests, nil
121+
return nil
83122
}

‎pkg/appregistry/manifest_decoder.go

+21-34
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,34 @@
11
package appregistry
22

33
import (
4+
"fmt"
5+
46
"github.com/operator-framework/operator-registry/pkg/apprclient"
5-
"github.com/sirupsen/logrus"
7+
8+
log "github.com/sirupsen/logrus"
69
utilerrors "k8s.io/apimachinery/pkg/util/errors"
710
)
811

9-
func NewManifestDecoder(logger *logrus.Entry, directory string) (*manifestDecoder, error) {
10-
bundle, err := NewBundleProcessor(logger, directory)
12+
func NewManifestDecoder(logger *log.Entry) (*manifestDecoder, error) {
13+
bundle, err := NewBundleProcessor()
14+
if err != nil {
15+
return nil, err
16+
}
17+
18+
flattened, err := NewFlattenedProcessor()
1119
if err != nil {
1220
return nil, err
1321
}
1422

1523
return &manifestDecoder{
1624
logger: logger,
17-
flattened: NewFlattenedProcessor(logger),
25+
flattened: flattened,
1826
nested: bundle,
1927
walker: &tarWalker{},
2028
}, nil
2129
}
2230

2331
type result struct {
24-
// Flattened contains all flattened single file operator manifest(s).
25-
Flattened *RawOperatorManifestData
26-
27-
// NestedDirectory points to the directory where all specified nested
28-
// operator bundle(s) have been written to.
29-
NestedDirectory string
30-
3132
// FlattenedCount is the total number of flattened single-file operator
3233
// manifest(s) processed so far.
3334
FlattenedCount int
@@ -43,7 +44,7 @@ func (r *result) IsEmpty() bool {
4344
}
4445

4546
type manifestDecoder struct {
46-
logger *logrus.Entry
47+
logger *log.Entry
4748
flattened *flattenedProcessor
4849
nested *bundleProcessor
4950
walker *tarWalker
@@ -64,9 +65,7 @@ type manifestDecoder struct {
6465
// This function takes a best-effort approach. On return, err is set to an
6566
// aggregated list of error(s) encountered. The caller should inspect the
6667
// result object to determine the next steps.
67-
func (d *manifestDecoder) Decode(manifests []*apprclient.OperatorMetadata) (result result, err error) {
68-
d.logger.Info("decoding the downloaded operator manifest(s)")
69-
68+
func (d *manifestDecoder) Decode(manifests []*apprclient.OperatorMetadata, workingDirectory string) (result result, err error) {
7069
getProcessor := func(isNested bool) (Processor, string) {
7170
if isNested {
7271
return d.nested, "nested"
@@ -77,13 +76,13 @@ func (d *manifestDecoder) Decode(manifests []*apprclient.OperatorMetadata) (resu
7776

7877
allErrors := []error{}
7978
for _, om := range manifests {
80-
loggerWithBlobID := d.logger.WithField("repository", om.RegistryMetadata.String())
79+
log.Debug(fmt.Sprintf("repository: %s", om.RegistryMetadata.String()))
8180

8281
// Determine the format type of the manifest blob and select the right processor.
8382
checker := NewFormatChecker()
84-
walkError := d.walker.Walk(om.Blob, checker)
83+
walkError := d.walker.Walk(om.Blob, om.RegistryMetadata.Name, workingDirectory, checker)
8584
if walkError != nil {
86-
loggerWithBlobID.Errorf("skipping, can't determine the format of the manifest - %v", walkError)
85+
log.Debug(fmt.Sprintf("skipping, can't determine the format of the manifest - %v", walkError))
8786
allErrors = append(allErrors, err)
8887
continue
8988
}
@@ -93,32 +92,20 @@ func (d *manifestDecoder) Decode(manifests []*apprclient.OperatorMetadata) (resu
9392
}
9493

9594
processor, format := getProcessor(checker.IsNestedBundleFormat())
96-
loggerWithBlobID.Infof("manifest format is - %s", format)
95+
log.Debug(fmt.Sprintf("manifest format is - %s", format))
9796

98-
walkError = d.walker.Walk(om.Blob, processor)
97+
walkError = d.walker.Walk(om.Blob, om.RegistryMetadata.Name, workingDirectory, processor)
9998
if walkError != nil {
100-
loggerWithBlobID.Errorf("skipping due to error - %v", walkError)
99+
log.Debug(fmt.Sprintf("skipping due to error - %v", walkError))
101100
allErrors = append(allErrors, err)
102101
continue
103102
}
104103

105-
loggerWithBlobID.Infof("decoded successfully")
104+
log.Debug(fmt.Sprintf("decoded successfully"))
106105
}
107106

108-
result.NestedDirectory = d.nested.GetManifestDownloadDirectory()
109107
result.FlattenedCount = d.flattened.GetProcessedCount()
110108

111-
// Merge all flattened operator manifest(s) into one.
112-
if d.flattened.GetProcessedCount() > 0 {
113-
d.logger.Info("merging all flattened manifests into a single configmap 'data' section")
114-
115-
result.Flattened, err = d.flattened.MergeIntoDataSection()
116-
if err != nil {
117-
d.logger.Errorf("error merging flattened manifest(s) - %v", err)
118-
allErrors = append(allErrors, err)
119-
}
120-
}
121-
122109
err = utilerrors.NewAggregate(allErrors)
123110
return
124111
}

‎pkg/appregistry/manifest_decoder_test.go

+21-26
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,18 @@ package appregistry
33
import (
44
"archive/tar"
55
"bytes"
6-
"fmt"
76
"io"
7+
"io/ioutil"
88
"os"
99
"path/filepath"
1010
"strings"
1111
"testing"
1212

13-
"github.com/operator-framework/operator-registry/pkg/apprclient"
1413
"github.com/sirupsen/logrus"
1514
"github.com/stretchr/testify/assert"
1615
"github.com/stretchr/testify/require"
17-
"k8s.io/apimachinery/pkg/util/rand"
16+
17+
"github.com/operator-framework/operator-registry/pkg/apprclient"
1818
)
1919

2020
const (
@@ -56,12 +56,12 @@ func setupDownloadFolder(t *testing.T) (downloadpath string, remove func()) {
5656
nestedOutputDirectoryBase = "testdata/download"
5757
)
5858

59-
path := fmt.Sprintf("%s/%s", nestedOutputDirectoryBase, rand.String(8))
59+
// Create temporary working directory for manifests
60+
path, err := ioutil.TempDir(nestedOutputDirectoryBase, "manifests-")
61+
require.NoError(t, err)
6062

6163
return path, func() {
62-
if err := os.RemoveAll(path); err != nil {
63-
t.Logf("failed to cleanup download folder [%s]", path)
64-
}
64+
require.NoError(t, os.RemoveAll(path))
6565
}
6666
}
6767

@@ -70,48 +70,45 @@ func TestDecodeWithNestedBundleManifest(t *testing.T) {
7070
defer remove()
7171

7272
manifests := []*apprclient.OperatorMetadata{
73-
&apprclient.OperatorMetadata{
73+
{
7474
RegistryMetadata: etcd,
7575
Blob: tarball(t, etcdManifestLocation, tarFilePrefixTrim),
7676
},
77-
&apprclient.OperatorMetadata{
77+
{
7878
RegistryMetadata: prometheus,
7979
Blob: tarball(t, prometheusManifestLocation, tarFilePrefixTrim),
8080
},
8181
}
8282

8383
logger := logrus.WithField("test", "nested")
8484

85-
decoder, err := NewManifestDecoder(logger, nestedDirectoryWant)
85+
decoder, err := NewManifestDecoder(logger)
8686
require.NoError(t, err)
8787

88-
resultGot, errGot := decoder.Decode(manifests)
88+
resultGot, errGot := decoder.Decode(manifests, nestedDirectoryWant)
8989
assert.NoError(t, errGot)
90-
assert.Nil(t, resultGot.Flattened)
91-
assert.Equal(t, nestedDirectoryWant, resultGot.NestedDirectory)
9290
assert.Equal(t, 0, resultGot.FlattenedCount)
9391
assert.Equal(t, 2, resultGot.NestedCount)
9492
}
9593

9694
func TestDecodeWithFlattenedManifest(t *testing.T) {
97-
nestedDirectoryWant, _ := setupDownloadFolder(t)
95+
nestedDirectoryWant, remove := setupDownloadFolder(t)
96+
defer remove()
9897

9998
manifests := []*apprclient.OperatorMetadata{
100-
&apprclient.OperatorMetadata{
99+
{
101100
RegistryMetadata: descheduler,
102101
Blob: tarball(t, deschedulerManifestLocation, tarFilePrefixTrim),
103102
},
104103
}
105104

106105
logger := logrus.WithField("test", "flattened")
107106

108-
decoder, err := NewManifestDecoder(logger, nestedDirectoryWant)
107+
decoder, err := NewManifestDecoder(logger)
109108
require.NoError(t, err)
110109

111-
resultGot, errGot := decoder.Decode(manifests)
110+
resultGot, errGot := decoder.Decode(manifests, nestedDirectoryWant)
112111
assert.NoError(t, errGot)
113-
assert.NotNil(t, resultGot.Flattened)
114-
assert.Equal(t, nestedDirectoryWant, resultGot.NestedDirectory)
115112
assert.Equal(t, 1, resultGot.FlattenedCount)
116113
assert.Equal(t, 0, resultGot.NestedCount)
117114
}
@@ -121,29 +118,27 @@ func TestDecodeWithBothFlattenedAndNestedManifest(t *testing.T) {
121118
defer remove()
122119

123120
manifests := []*apprclient.OperatorMetadata{
124-
&apprclient.OperatorMetadata{
121+
{
125122
RegistryMetadata: etcd,
126123
Blob: tarball(t, etcdManifestLocation, tarFilePrefixTrim),
127124
},
128-
&apprclient.OperatorMetadata{
125+
{
129126
RegistryMetadata: prometheus,
130127
Blob: tarball(t, prometheusManifestLocation, tarFilePrefixTrim),
131128
},
132-
&apprclient.OperatorMetadata{
129+
{
133130
RegistryMetadata: descheduler,
134131
Blob: tarball(t, deschedulerManifestLocation, tarFilePrefixTrim),
135132
},
136133
}
137134

138135
logger := logrus.WithField("test", "flattened+nested")
139136

140-
decoder, err := NewManifestDecoder(logger, nestedDirectoryWant)
137+
decoder, err := NewManifestDecoder(logger)
141138
require.NoError(t, err)
142139

143-
resultGot, errGot := decoder.Decode(manifests)
140+
resultGot, errGot := decoder.Decode(manifests, nestedDirectoryWant)
144141
assert.NoError(t, errGot)
145-
assert.NotNil(t, resultGot.Flattened)
146-
assert.Equal(t, nestedDirectoryWant, resultGot.NestedDirectory)
147142
assert.Equal(t, 1, resultGot.FlattenedCount)
148143
assert.Equal(t, 2, resultGot.NestedCount)
149144
}

‎pkg/appregistry/parser.go

+34
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ type ManifestYAMLParser interface {
2424
// The function accepts a structured representation of operator manifest(s)
2525
// specified in marshaled and returns a raw yaml representation of it.
2626
Marshal(bundle *StructuredOperatorManifestData) (*RawOperatorManifestData, error)
27+
28+
MarshalCSV(csv *ClusterServiceVersion) (string, error)
29+
30+
MarshalCRD(crd *CustomResourceDefinition) (string, error)
31+
32+
MarshalPackage(pkg *PackageManifest) (string, error)
2733
}
2834

2935
// RawOperatorManifestData encapsulates the list of CRD(s), CSV(s) and
@@ -179,3 +185,31 @@ func (*manifestYAMLParser) Marshal(bundle *StructuredOperatorManifestData) (*Raw
179185

180186
return data, nil
181187
}
188+
189+
190+
func (*manifestYAMLParser) MarshalCSV(csv *ClusterServiceVersion) (string, error) {
191+
csvRaw, err := yaml.Marshal(csv)
192+
if err != nil {
193+
return "", fmt.Errorf("error marshaling CSV list into YAML : %s", err)
194+
}
195+
196+
return string(csvRaw), nil
197+
}
198+
199+
func (*manifestYAMLParser) MarshalCRD(crd *CustomResourceDefinition) (string, error) {
200+
crdRaw, err := yaml.Marshal(crd)
201+
if err != nil {
202+
return "", fmt.Errorf("error marshaling CSV list into YAML : %s", err)
203+
}
204+
205+
return string(crdRaw), nil
206+
}
207+
208+
func (*manifestYAMLParser) MarshalPackage(pkg *PackageManifest) (string, error) {
209+
packageRaw, err := yaml.Marshal(pkg)
210+
if err != nil {
211+
return "", fmt.Errorf("error marshaling CSV list into YAML : %s", err)
212+
}
213+
214+
return string(packageRaw), nil
215+
}

‎pkg/appregistry/tar_walker.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ import (
1515
// if done is set to true then tar walker will exit from the walk loop.
1616
// Otherwise, it will continue
1717
type Processor interface {
18-
Process(header *tar.Header, reader io.Reader) (done bool, err error)
18+
Process(header *tar.Header, manifestName, workingDirectory string, reader io.Reader) (done bool, err error)
1919
}
2020

2121
type tarWalker struct {
2222
}
2323

24-
func (*tarWalker) Walk(raw []byte, processor Processor) error {
24+
func (*tarWalker) Walk(raw []byte, manifestName, workingDirectory string, processor Processor) error {
2525
if raw == nil || processor == nil {
2626
return errors.New("invalid argument specified to Walk")
2727
}
@@ -47,7 +47,7 @@ func (*tarWalker) Walk(raw []byte, processor Processor) error {
4747
switch header.Typeflag {
4848
case tar.TypeReg:
4949
// It's a regular file
50-
done, err := processor.Process(header, reader)
50+
done, err := processor.Process(header, manifestName, workingDirectory, reader)
5151
if err != nil {
5252
return fmt.Errorf("error happened while processing tar file - %s", err.Error())
5353
}
@@ -57,7 +57,7 @@ func (*tarWalker) Walk(raw []byte, processor Processor) error {
5757
}
5858

5959
case tar.TypeDir:
60-
done, err := processor.Process(header, reader)
60+
done, err := processor.Process(header, manifestName, workingDirectory, reader)
6161
if err != nil {
6262
return fmt.Errorf("error happened while processing directory - %s", err.Error())
6363
}

‎pkg/client/client.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,13 @@ func NewClient(address string) (*Client, error) {
9595
if err != nil {
9696
return nil, err
9797
}
98+
return NewClientFromConn(conn), nil
99+
}
100+
101+
func NewClientFromConn(conn *grpc.ClientConn) *Client {
98102
return &Client{
99103
Registry: api.NewRegistryClient(conn),
100104
Health: grpc_health_v1.NewHealthClient(conn),
101105
Conn: conn,
102-
}, nil
106+
}
103107
}

0 commit comments

Comments
 (0)
Please sign in to comment.