Skip to content

Commit 6a831e7

Browse files
Merge pull request #244 from djzager/indexadd
bug(opm): use db dir when modifying existing index
2 parents a20a696 + 319a67a commit 6a831e7

File tree

2 files changed

+76
-57
lines changed

2 files changed

+76
-57
lines changed

pkg/lib/indexer/indexer.go

Lines changed: 41 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ const (
2626
defaultImageTag = "operator-registry-index:latest"
2727
defaultDatabaseFolder = "database"
2828
defaultDatabaseFile = "index.db"
29+
tmpDirPrefix = "index_tmp"
2930
)
3031

3132
// ImageIndexer is a struct implementation of the Indexer interface
@@ -54,36 +55,18 @@ type AddToIndexRequest struct {
5455

5556
// AddToIndex is an aggregate API used to generate a registry index image with additional bundles
5657
func (i ImageIndexer) AddToIndex(request AddToIndexRequest) error {
57-
databaseFile := defaultDatabaseFile
58-
5958
// set a temp directory
60-
workingDir, err := ioutil.TempDir("./", "index_tmp")
59+
tmpDir, err := ioutil.TempDir("./", tmpDirPrefix)
6160
if err != nil {
6261
return err
6362
}
64-
defer os.RemoveAll(workingDir)
65-
66-
// Pull the fromIndex
67-
if request.FromIndex != "" {
68-
i.Logger.Infof("Pulling previous image %s to get metadata", request.FromIndex)
69-
70-
// Get the old index image's dbLocationLabel to find this path
71-
labels, err := i.LabelReader.GetLabelsFromImage(request.FromIndex)
72-
if err != nil {
73-
return err
74-
}
75-
if dbLocation, ok := labels[containertools.DbLocationLabel]; ok {
76-
// extract the database to the file
77-
err = i.ImageReader.GetImageData(request.FromIndex, workingDir)
78-
if err != nil {
79-
return err
80-
}
63+
defer os.RemoveAll(tmpDir)
8164

82-
databaseFile = path.Join(workingDir, dbLocation)
83-
}
84-
} else {
85-
databaseFile = path.Join(workingDir, databaseFile)
65+
databaseFile, err := i.getDatabaseFile(tmpDir, request.FromIndex)
66+
if err != nil {
67+
return err
8668
}
69+
workingDir := path.Dir(databaseFile)
8770

8871
// Run opm registry add on the database
8972
addToRegistryReq := registry.AddToRegistryRequest{
@@ -129,38 +112,18 @@ type DeleteFromIndexRequest struct {
129112
// DeleteFromIndex is an aggregate API used to generate a registry index image
130113
// without specific operators
131114
func (i ImageIndexer) DeleteFromIndex(request DeleteFromIndexRequest) error {
132-
databaseFile := defaultDatabaseFile
133-
134115
// set a temp directory
135-
workingDir, err := ioutil.TempDir("./", "index_tmp")
116+
tmpDir, err := ioutil.TempDir("./", tmpDirPrefix)
136117
if err != nil {
137118
return err
138119
}
139-
defer os.RemoveAll(workingDir)
120+
defer os.RemoveAll(tmpDir)
140121

141-
// Pull the fromIndex
142-
if request.FromIndex != "" {
143-
i.Logger.Infof("Pulling previous image %s to get metadata", request.FromIndex)
144-
145-
// Get the old index image's dbLocationLabel to find this path
146-
labels, err := i.LabelReader.GetLabelsFromImage(request.FromIndex)
147-
if err != nil {
148-
return err
149-
}
150-
if dbLocation, ok := labels[containertools.DbLocationLabel]; ok {
151-
i.Logger.Infof("Previous db location %s", dbLocation)
152-
153-
// extract the database to the file
154-
err = i.ImageReader.GetImageData(request.FromIndex, workingDir)
155-
if err != nil {
156-
return err
157-
}
158-
159-
databaseFile = path.Join(workingDir, dbLocation)
160-
}
161-
} else {
162-
databaseFile = path.Join(workingDir, databaseFile)
122+
databaseFile, err := i.getDatabaseFile(tmpDir, request.FromIndex)
123+
if err != nil {
124+
return err
163125
}
126+
workingDir := path.Dir(databaseFile)
164127

165128
// Run opm registry add on the database
166129
deleteFromRegistryReq := registry.DeleteFromRegistryRequest{
@@ -259,6 +222,33 @@ func (i ImageIndexer) buildDockerfile(binarySourceImage, workingDir, tag string)
259222
return nil
260223
}
261224

225+
func (i ImageIndexer) getDatabaseFile(workingDir, fromIndex string) (string, error) {
226+
if fromIndex == "" {
227+
return path.Join(workingDir, defaultDatabaseFile), nil
228+
}
229+
230+
// Pull the fromIndex
231+
i.Logger.Infof("Pulling previous image %s to get metadata", fromIndex)
232+
233+
// Get the old index image's dbLocationLabel to find this path
234+
labels, err := i.LabelReader.GetLabelsFromImage(fromIndex)
235+
if err != nil {
236+
return "", err
237+
}
238+
dbLocation, ok := labels[containertools.DbLocationLabel]
239+
if !ok {
240+
return "", fmt.Errorf("Index image %s missing label %s", fromIndex, containertools.DbLocationLabel)
241+
}
242+
243+
// extract the database to the working directory
244+
err = i.ImageReader.GetImageData(fromIndex, workingDir)
245+
if err != nil {
246+
return "", err
247+
}
248+
249+
return path.Join(workingDir, dbLocation), nil
250+
}
251+
262252
func build(dockerfileText, imageTag string, commandRunner containertools.CommandRunner, logger *logrus.Entry) error {
263253
if imageTag == "" {
264254
imageTag = defaultImageTag
@@ -306,7 +296,7 @@ type ExportFromIndexRequest struct {
306296
// an index image
307297
func (i ImageIndexer) ExportFromIndex(request ExportFromIndexRequest) error {
308298
// set a temp directory
309-
workingDir, err := ioutil.TempDir("./", "index_tmp")
299+
workingDir, err := ioutil.TempDir("./", tmpDirPrefix)
310300
if err != nil {
311301
return err
312302
}

test/e2e/opm_test.go

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,12 @@ var (
3131
bundleTag1 = rand.String(6)
3232
bundleTag2 = rand.String(6)
3333
bundleTag3 = rand.String(6)
34-
indexTag = rand.String(6)
34+
indexTag1 = rand.String(6)
35+
indexTag2 = rand.String(6)
3536

3637
bundleImage = "quay.io/olmtest/e2e-bundle"
37-
indexImage = "quay.io/olmtest/e2e-index:" + indexTag
38+
indexImage1 = "quay.io/olmtest/e2e-index:" + indexTag1
39+
indexImage2 = "quay.io/olmtest/e2e-index:" + indexTag2
3840
)
3941

4042
func inTemporaryBuildContext(f func() error) (rerr error) {
@@ -82,7 +84,6 @@ func buildIndexWith(containerTool string) error {
8284
bundles := []string{
8385
bundleImage + ":" + bundleTag1,
8486
bundleImage + ":" + bundleTag2,
85-
bundleImage + ":" + bundleTag3,
8687
}
8788
logger := logrus.WithFields(logrus.Fields{"bundles": bundles})
8889
indexAdder := indexer.NewIndexAdder(containerTool, logger)
@@ -92,7 +93,27 @@ func buildIndexWith(containerTool string) error {
9293
FromIndex: "",
9394
BinarySourceImage: "",
9495
OutDockerfile: "",
95-
Tag: indexImage,
96+
Tag: indexImage1,
97+
Bundles: bundles,
98+
Permissive: false,
99+
}
100+
101+
return indexAdder.AddToIndex(request)
102+
}
103+
104+
func buildFromIndexWith(containerTool string) error {
105+
bundles := []string{
106+
bundleImage + ":" + bundleTag3,
107+
}
108+
logger := logrus.WithFields(logrus.Fields{"bundles": bundles})
109+
indexAdder := indexer.NewIndexAdder(containerTool, logger)
110+
111+
request := indexer.AddToIndexRequest{
112+
Generate: false,
113+
FromIndex: indexImage1,
114+
BinarySourceImage: "",
115+
OutDockerfile: "",
116+
Tag: indexImage2,
96117
Bundles: bundles,
97118
Permissive: false,
98119
}
@@ -123,7 +144,7 @@ func exportWith(containerTool string) error {
123144
indexExporter := indexer.NewIndexExporter(containerTool, logger)
124145

125146
request := indexer.ExportFromIndexRequest{
126-
Index: indexImage,
147+
Index: indexImage2,
127148
Package: packageName,
128149
DownloadPath: "downloaded",
129150
ContainerTool: containerTool,
@@ -183,7 +204,15 @@ var _ = Describe("opm", func() {
183204
Expect(err).NotTo(HaveOccurred())
184205

185206
By("pushing an index")
186-
err = pushWith(containerTool, indexImage)
207+
err = pushWith(containerTool, indexImage1)
208+
Expect(err).NotTo(HaveOccurred())
209+
210+
By("building from an index")
211+
err = buildFromIndexWith(containerTool)
212+
Expect(err).NotTo(HaveOccurred())
213+
214+
By("pushing an index")
215+
err = pushWith(containerTool, indexImage2)
187216
Expect(err).NotTo(HaveOccurred())
188217

189218
By("exporting an index to disk")

0 commit comments

Comments
 (0)