Skip to content

Commit 319a67a

Browse files
committed
bug(opm): use db dir when modifying existing index
This makes it possible to modify an index using `--from-index`.
1 parent 1a514b0 commit 319a67a

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
@@ -53,36 +54,18 @@ type AddToIndexRequest struct {
5354

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

81-
databaseFile = path.Join(workingDir, dbLocation)
82-
}
83-
} else {
84-
databaseFile = path.Join(workingDir, databaseFile)
64+
databaseFile, err := i.getDatabaseFile(tmpDir, request.FromIndex)
65+
if err != nil {
66+
return err
8567
}
68+
workingDir := path.Dir(databaseFile)
8669

8770
// Run opm registry add on the database
8871
addToRegistryReq := registry.AddToRegistryRequest{
@@ -127,38 +110,18 @@ type DeleteFromIndexRequest struct {
127110
// DeleteFromIndex is an aggregate API used to generate a registry index image
128111
// without specific operators
129112
func (i ImageIndexer) DeleteFromIndex(request DeleteFromIndexRequest) error {
130-
databaseFile := defaultDatabaseFile
131-
132113
// set a temp directory
133-
workingDir, err := ioutil.TempDir("./", "index_tmp")
114+
tmpDir, err := ioutil.TempDir("./", tmpDirPrefix)
134115
if err != nil {
135116
return err
136117
}
137-
defer os.RemoveAll(workingDir)
118+
defer os.RemoveAll(tmpDir)
138119

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

163126
// Run opm registry add on the database
164127
deleteFromRegistryReq := registry.DeleteFromRegistryRequest{
@@ -257,6 +220,33 @@ func (i ImageIndexer) buildDockerfile(binarySourceImage, workingDir, tag string)
257220
return nil
258221
}
259222

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

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,
@@ -186,7 +207,15 @@ var _ = Describe("opm", func() {
186207
Expect(err).NotTo(HaveOccurred())
187208

188209
By("pushing an index")
189-
err = pushWith(containerTool, indexImage)
210+
err = pushWith(containerTool, indexImage1)
211+
Expect(err).NotTo(HaveOccurred())
212+
213+
By("building from an index")
214+
err = buildFromIndexWith(containerTool)
215+
Expect(err).NotTo(HaveOccurred())
216+
217+
By("pushing an index")
218+
err = pushWith(containerTool, indexImage2)
190219
Expect(err).NotTo(HaveOccurred())
191220

192221
By("exporting an index to disk")

0 commit comments

Comments
 (0)