Generate changes from CompilerBackendOptions and pass by image name so img can unpack images

This commit is contained in:
Ettore Di Giacinto
2020-12-08 22:16:17 +01:00
parent 767488327b
commit b5990b5333
8 changed files with 29 additions and 16 deletions

View File

@@ -102,15 +102,15 @@ ENV PACKAGE_VERSION=1.4.0
ENV PACKAGE_CATEGORY=app-admin ENV PACKAGE_CATEGORY=app-admin
RUN echo foo > /test RUN echo foo > /test
RUN echo bar > /test2`)) RUN echo bar > /test2`))
opts = CompilerBackendOptions{ opts2 := CompilerBackendOptions{
ImageName: "test", ImageName: "test",
SourcePath: tmpdir, SourcePath: tmpdir,
DockerFileName: "LuetDockerfile", DockerFileName: "LuetDockerfile",
Destination: filepath.Join(tmpdir, "output2.tar"), Destination: filepath.Join(tmpdir, "output2.tar"),
} }
Expect(b.ImageDefinitionToTar(opts)).ToNot(HaveOccurred()) Expect(b.ImageDefinitionToTar(opts2)).ToNot(HaveOccurred())
Expect(helpers.Exists(filepath.Join(tmpdir, "output2.tar"))).To(BeTrue()) Expect(helpers.Exists(filepath.Join(tmpdir, "output2.tar"))).To(BeTrue())
diffs, err := b.Changes(filepath.Join(tmpdir2, "output1.tar"), filepath.Join(tmpdir, "output2.tar")) diffs, err := b.Changes(opts, opts2)
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
artifacts := []ArtifactNode{} artifacts := []ArtifactNode{}

View File

@@ -52,7 +52,10 @@ import (
// } // }
// } // }
// ] // ]
func GenerateChanges(b compiler.CompilerBackend, srcImage, dstImage string) ([]compiler.ArtifactLayer, error) { func GenerateChanges(b compiler.CompilerBackend, fromImage, toImage compiler.CompilerBackendOptions) ([]compiler.ArtifactLayer, error) {
srcImage := fromImage.Destination
dstImage := toImage.Destination
res := compiler.ArtifactLayer{FromImage: srcImage, ToImage: dstImage} res := compiler.ArtifactLayer{FromImage: srcImage, ToImage: dstImage}
@@ -95,6 +98,7 @@ func GenerateChanges(b compiler.CompilerBackend, srcImage, dstImage string) ([]c
srcImageExtract := compiler.CompilerBackendOptions{ srcImageExtract := compiler.CompilerBackendOptions{
SourcePath: srcImage, SourcePath: srcImage,
ImageName: fromImage.ImageName,
Destination: srcRootFS, Destination: srcRootFS,
} }
err = b.ExtractRootfs(srcImageExtract, false) // No need to keep permissions as we just collect file diffs err = b.ExtractRootfs(srcImageExtract, false) // No need to keep permissions as we just collect file diffs
@@ -123,6 +127,7 @@ func GenerateChanges(b compiler.CompilerBackend, srcImage, dstImage string) ([]c
dstImageExtract := compiler.CompilerBackendOptions{ dstImageExtract := compiler.CompilerBackendOptions{
SourcePath: dstImage, SourcePath: dstImage,
ImageName: toImage.ImageName,
Destination: dstRootFS, Destination: dstRootFS,
} }
err = b.ExtractRootfs(dstImageExtract, false) err = b.ExtractRootfs(dstImageExtract, false)

View File

@@ -32,12 +32,14 @@ var _ = Describe("Docker image diffs", func() {
Context("Generate diffs from docker images", func() { Context("Generate diffs from docker images", func() {
It("Detect no changes", func() { It("Detect no changes", func() {
err := b.DownloadImage(compiler.CompilerBackendOptions{ opts := compiler.CompilerBackendOptions{
ImageName: "alpine:latest", ImageName: "alpine:latest",
}) Destination: "alpine:latest",
}
err := b.DownloadImage(opts)
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
layers, err := GenerateChanges(b, "alpine:latest", "alpine:latest") layers, err := GenerateChanges(b, opts, opts)
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(len(layers)).To(Equal(1)) Expect(len(layers)).To(Equal(1))
Expect(len(layers[0].Diffs.Additions)).To(Equal(0)) Expect(len(layers[0].Diffs.Additions)).To(Equal(0))
@@ -55,7 +57,13 @@ var _ = Describe("Docker image diffs", func() {
}) })
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
layers, err := GenerateChanges(b, "quay.io/mocaccino/micro", "quay.io/mocaccino/extra") layers, err := GenerateChanges(b, compiler.CompilerBackendOptions{
ImageName: "quay.io/mocaccino/micro",
Destination: "quay.io/mocaccino/micro",
}, compiler.CompilerBackendOptions{
ImageName: "quay.io/mocaccino/extra",
Destination: "quay.io/mocaccino/extra",
})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(len(layers)).To(Equal(1)) Expect(len(layers)).To(Equal(1))

View File

@@ -239,7 +239,7 @@ func (*SimpleDocker) ExtractRootfs(opts compiler.CompilerBackendOptions, keepPer
} }
// Changes retrieves changes between image layers // Changes retrieves changes between image layers
func (d *SimpleDocker) Changes(fromImage, toImage string) ([]compiler.ArtifactLayer, error) { func (d *SimpleDocker) Changes(fromImage, toImage compiler.CompilerBackendOptions) ([]compiler.ArtifactLayer, error) {
diffs, err := GenerateChanges(d, fromImage, toImage) diffs, err := GenerateChanges(d, fromImage, toImage)
if config.LuetCfg.GetGeneral().Debug { if config.LuetCfg.GetGeneral().Debug {

View File

@@ -93,13 +93,13 @@ ENV PACKAGE_VERSION=1.4.0
ENV PACKAGE_CATEGORY=app-admin ENV PACKAGE_CATEGORY=app-admin
RUN echo foo > /test RUN echo foo > /test
RUN echo bar > /test2`)) RUN echo bar > /test2`))
opts = CompilerBackendOptions{ opts2 := CompilerBackendOptions{
ImageName: "test", ImageName: "test",
SourcePath: tmpdir, SourcePath: tmpdir,
DockerFileName: "LuetDockerfile", DockerFileName: "LuetDockerfile",
Destination: filepath.Join(tmpdir, "output2.tar"), Destination: filepath.Join(tmpdir, "output2.tar"),
} }
Expect(b.ImageDefinitionToTar(opts)).ToNot(HaveOccurred()) Expect(b.ImageDefinitionToTar(opts2)).ToNot(HaveOccurred())
Expect(helpers.Exists(filepath.Join(tmpdir, "output2.tar"))).To(BeTrue()) Expect(helpers.Exists(filepath.Join(tmpdir, "output2.tar"))).To(BeTrue())
artifacts := []ArtifactNode{} artifacts := []ArtifactNode{}
@@ -109,7 +109,7 @@ RUN echo bar > /test2`))
artifacts = append(artifacts, ArtifactNode{Name: "/test", Size: 4}) artifacts = append(artifacts, ArtifactNode{Name: "/test", Size: 4})
artifacts = append(artifacts, ArtifactNode{Name: "/test2", Size: 4}) artifacts = append(artifacts, ArtifactNode{Name: "/test2", Size: 4})
Expect(b.Changes(filepath.Join(tmpdir2, "output1.tar"), filepath.Join(tmpdir, "output2.tar"))).To(Equal( Expect(b.Changes(opts, opts2)).To(Equal(
[]ArtifactLayer{{ []ArtifactLayer{{
FromImage: filepath.Join(tmpdir2, "output1.tar"), FromImage: filepath.Join(tmpdir2, "output1.tar"),
ToImage: filepath.Join(tmpdir, "output2.tar"), ToImage: filepath.Join(tmpdir, "output2.tar"),

View File

@@ -149,7 +149,7 @@ func (*SimpleImg) ExtractRootfs(opts compiler.CompilerBackendOptions, keepPerms
// TODO: Use container-diff (https://github.com/GoogleContainerTools/container-diff) for checking out layer diffs // TODO: Use container-diff (https://github.com/GoogleContainerTools/container-diff) for checking out layer diffs
// Changes uses container-diff (https://github.com/GoogleContainerTools/container-diff) for retrieving out layer diffs // Changes uses container-diff (https://github.com/GoogleContainerTools/container-diff) for retrieving out layer diffs
func (i *SimpleImg) Changes(fromImage, toImage string) ([]compiler.ArtifactLayer, error) { func (i *SimpleImg) Changes(fromImage, toImage compiler.CompilerBackendOptions) ([]compiler.ArtifactLayer, error) {
return GenerateChanges(i, fromImage, toImage) return GenerateChanges(i, fromImage, toImage)
} }

View File

@@ -272,7 +272,7 @@ func (cs *LuetCompiler) unpackDelta(rootfs string, concurrency int, keepPermissi
defer os.Remove(builderOpts.Destination) defer os.Remove(builderOpts.Destination)
} }
Info(pkgTag, ":hammer: Generating delta") Info(pkgTag, ":hammer: Generating delta")
diffs, err := cs.Backend.Changes(builderOpts.Destination, runnerOpts.Destination) diffs, err := cs.Backend.Changes(builderOpts, runnerOpts)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "Could not generate changes from layers") return nil, errors.Wrap(err, "Could not generate changes from layers")
} }

View File

@@ -79,7 +79,7 @@ type CompilerBackend interface {
BuildImage(CompilerBackendOptions) error BuildImage(CompilerBackendOptions) error
ExportImage(CompilerBackendOptions) error ExportImage(CompilerBackendOptions) error
RemoveImage(CompilerBackendOptions) error RemoveImage(CompilerBackendOptions) error
Changes(fromImage, toImage string) ([]ArtifactLayer, error) Changes(fromImage, toImage CompilerBackendOptions) ([]ArtifactLayer, error)
ImageDefinitionToTar(CompilerBackendOptions) error ImageDefinitionToTar(CompilerBackendOptions) error
ExtractRootfs(opts CompilerBackendOptions, keepPerms bool) error ExtractRootfs(opts CompilerBackendOptions, keepPerms bool) error