Skip to content
This repository has been archived by the owner on May 17, 2023. It is now read-only.

Commit

Permalink
Add support to inspect kpack metadata [#172090193]
Browse files Browse the repository at this point in the history
Signed-off-by: Debbie Chen <[email protected]>
Signed-off-by: Jeff Jun <[email protected]>
  • Loading branch information
xtreme-jason-smith authored and Pivotal-Jeff-Jun committed May 5, 2020
1 parent a66c9f3 commit dcb4121
Show file tree
Hide file tree
Showing 11 changed files with 267 additions and 0 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,5 @@

# Output of the go coverage tool, specifically when used with LiteIDE
*.out

.idea/*
2 changes: 2 additions & 0 deletions pkg/deplab/deplab.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"bytes"
"encoding/json"
"fmt"
"github.com/pivotal/deplab/pkg/kpack"
"os"
"strings"

Expand Down Expand Up @@ -82,6 +83,7 @@ func RunInspect(inputImage, inputImageTar string) error {
rpm.Provider,
cnb.Provider,
osrelease.Provider,
kpack.Provider,
ProvenanceProvider,
ExistingLabelProvider,
} {
Expand Down
13 changes: 13 additions & 0 deletions pkg/kpack/kpack_suite_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package kpack_test

import (
"testing"

. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)

func TestKpack(t *testing.T) {
RegisterFailHandler(Fail)
RunSpecs(t, "Kpack Suite")
}
67 changes: 67 additions & 0 deletions pkg/kpack/provider.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package kpack

import (
"encoding/json"
"fmt"
"github.com/pivotal/deplab/pkg/common"
"github.com/pivotal/deplab/pkg/image"
"github.com/pivotal/deplab/pkg/metadata"
)

type RepoSource struct {
Source Source `json:"source"`
}

type Source struct {
Type string `json:"type"`
Version map[string]string `json:"version"`
Metadata map[string]string `json:"metadata"`
}

func Provider(dli image.Image, _ common.RunParams, md metadata.Metadata) (metadata.Metadata, error) {
var kpackMetadataContents string

config, err := dli.GetConfig()
if err != nil {
return metadata.Metadata{}, err
}

kpackMetadataContents = config.Config.Labels["io.buildpacks.project.metadata"]

if kpackMetadataContents != "" {
dep, err := parseMetadataJSON(kpackMetadataContents)
if err != nil {
return metadata.Metadata{}, fmt.Errorf("could not parse kpack metadata: %w", err)
}

md.Dependencies = append(md.Dependencies, dep)
}

return md, nil
}

func parseMetadataJSON(kpackMetadata string) (metadata.Dependency, error) {
var md RepoSource

err := json.Unmarshal([]byte(kpackMetadata), &md)
if err != nil {
return metadata.Dependency{}, fmt.Errorf("could not decode json: %w", err)
}

var kpackMd = metadata.KpackRepoSourceMetadata{
Url: md.Source.Metadata["repository"],
Refs: []interface{}{},
}

var dep = metadata.Dependency{
Type: "package",
Source: metadata.Source{
Type: "git",
Version: map[string]interface{}{
"commit": md.Source.Version["commit"],
},
Metadata: kpackMd,
},
}
return dep, nil
}
91 changes: 91 additions & 0 deletions pkg/kpack/provider_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package kpack_test

import (
v1 "github.com/google/go-containerregistry/pkg/v1"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"github.com/pivotal/deplab/pkg/common"
. "github.com/pivotal/deplab/pkg/kpack"
"github.com/pivotal/deplab/pkg/metadata"
"github.com/pivotal/deplab/test/test_utils"
)

type MockImage struct {
labels map[string]string
}

func (m MockImage) GetConfig() (*v1.ConfigFile, error) {
config := &v1.ConfigFile{}

config.Config.Labels = m.labels

return config, nil
}

func (m MockImage) Cleanup() {
panic("implement me")
}

func (m MockImage) GetFileContent(string) (string, error) {
panic("implement me")
}

func (m MockImage) GetDirContents(string) ([]string, error) {
panic("implement me")
}

func (m MockImage) AbsolutePath(string) (string, error) {
panic("implement me")
}

func (m MockImage) ExportWithMetadata(metadata.Metadata, string, string) error {
panic("implement me")
}

var _ = Describe("Kpack", func() {
Describe("Provider", func() {
Context("when the image has no kpack label", func() {
It("does not modify the metadata content", func() {
Expect(Provider(test_utils.NewMockImageWithEmptyConfig(), common.RunParams{}, metadata.Metadata{})).To(Equal(metadata.Metadata{}))
})
})
Context("when the image has kpack label", func() {
It("returns properly formatted metadata", func() {
expectedMd := metadata.KpackRepoSourceMetadata {
Url: "https://github.com/zmackie/github-actions-automate-projects.git",
Refs: []interface{}{},
}
expectedResult := metadata.Dependency{
Type: "package",
Source: metadata.Source{
Type: "git",
Version: map[string]interface{}{
"commit": "1736b5e3b43a8cf40b3640821ee0e26049e1a58c",
},
Metadata: expectedMd,
},
}
labels := map[string]string{}
labels["io.buildpacks.project.metadata"] = "{\"source\":{\"type\":\"git\",\"version\":{\"commit\":\"1736b5e3b43a8cf40b3640821ee0e26049e1a58c\"},\"metadata\":{\"repository\":\"https://github.com/zmackie/github-actions-automate-projects.git\",\"revision\":\"1736b5e3b43a8cf40b3640821ee0e26049e1a58c\"}}}"

md, err := Provider(MockImage{labels}, common.RunParams{}, metadata.Metadata{})

Expect(err).To(Not(HaveOccurred()))
Expect(md.Dependencies).To(HaveLen(1))
Expect(md.Dependencies[0]).To(Equal(expectedResult))
})
})
Context("when the image has kpack label with malformed data", func() {
It("returns generic error message that supported metadata is not present", func() {
labels := map[string]string{}
labels["io.buildpacks.project.metadata"] = "broken-source\"\"type\":\"git\",\"version\":{\"commit\":\"1736b5e3b43a8cf40b3640821ee0e26049e1a58c\"},\"metadata\":{\"repository\":\"https://github.com/zmackie/github-actions-automate-projects.git\",\"revision\":\"1736b5e3b43a8cf40b3640821ee0e26049e1a58c\"}}}"

_, err := Provider(MockImage{labels}, common.RunParams{}, metadata.Metadata{})

Expect(err).To(MatchError(SatisfyAll(
ContainSubstring("could not parse kpack metadata"),
ContainSubstring("could not decode json"))))
})
})
})
})
1 change: 1 addition & 0 deletions pkg/metadata/merge.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ func Merge(original, current Metadata) (Metadata, []Warning) {
newDependencies, warnings = selectAdditionalDependencies(DebianPackageListSourceType, newDependencies, warnings, original, current)
newDependencies, warnings = selectAdditionalDependencies(RPMPackageListSourceType, newDependencies, warnings, original, current)
newDependencies, warnings = selectAdditionalDependencies(BuildpackMetadataType, newDependencies, warnings, original, current)
newDependencies, warnings = selectAdditionalDependencies(PackageType, newDependencies, warnings, original, current)

for _, dep := range original.Dependencies {
if dep.Source.Type == GitSourceType {
Expand Down
35 changes: 35 additions & 0 deletions pkg/metadata/merge_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -428,6 +428,41 @@ var _ = Describe("Merge", func() {
})
})

Describe("kpack", func() {
Context("when there is no original and only current", func() {
It("retains only the kpack list dependencies from the current metadata", func() {
kpackMD := metadata.KpackRepoSourceMetadata {
Url: "some-url",
Refs: []interface{}{},
}

currentKpack := metadata.Dependency{
Type: metadata.PackageType,
Source: metadata.Source{
Type: "git",
Version: map[string]interface{}{
"commit": "some-sha",
},
Metadata: kpackMD,
},
}

result, warnings := metadata.Merge(metadata.Metadata{
Dependencies: []metadata.Dependency{},
}, metadata.Metadata{
Dependencies: []metadata.Dependency{currentKpack},
})

Expect(warnings).To(BeEmpty())

dpkg, ok := test_utils.SelectKpackDependency(result.Dependencies)
Expect(ok).To(BeTrue())
Expect(dpkg).To(Equal(currentKpack))
})
})
})


Context("all possible types of metadata in both original and current", func() {
It("should merge", func() {
originalGit1 := metadata.Dependency{
Expand Down
5 changes: 5 additions & 0 deletions pkg/metadata/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@ type BuildpackBOMSourceMetadata struct {
Launcher map[string]interface{} `json:"launcher"`
}

type KpackRepoSourceMetadata struct {
Url string `json:"url"`
Refs []interface{} `json:"refs"`
}

type GitSourceMetadata struct {
URL string `json:"url"`
Refs []string `json:"refs"`
Expand Down
Binary file not shown.
47 changes: 47 additions & 0 deletions test/integration/kpack_integration_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package integration_test

import (
"encoding/json"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"github.com/pivotal/deplab/pkg/metadata"
)

var _ = Describe("deplab", func() {
Describe("inspect", func() {
Context("with an image with kpack metadata", func() {
It("can find a kpack dependency", func() {
stdOut, _ := runDepLab([]string{
"inspect",
"--image-tar", getTestAssetPath("image-archives/kpack-image.tgz"),
}, 0)

md := metadata.Metadata{}
err := json.NewDecoder(stdOut).Decode(&md)

Expect(err).ToNot(HaveOccurred())

kpackDependency, ok := filterKpackDependencies(md.Dependencies)
Expect(ok).To(BeTrue())

Expect(kpackDependency.Source.Type).To(Equal("git"))

kpackSourceVersion := kpackDependency.Source.Version
kpackSourceMetadata := kpackDependency.Source.Metadata.(map[string]interface {})

Expect(kpackSourceVersion["commit"]).To(Equal("1736b5e3b43a8cf40b3640821ee0e26049e1a58c"))
Expect(kpackSourceMetadata["url"]).To(Equal("https://github.com/zmackie/github-actions-automate-projects.git"))
Expect(kpackSourceMetadata["refs"]).To(Equal([]interface{}{}))
})
})
})
})

func filterKpackDependencies(dependencies []metadata.Dependency) (metadata.Dependency, bool) {
for _, dependency := range dependencies {
if dependency.Type == metadata.PackageType {
return dependency, true
}
}
return metadata.Dependency{}, false
}
4 changes: 4 additions & 0 deletions test/test_utils/dependencies.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,7 @@ func SelectRpmDependency(dependencies []metadata.Dependency) (metadata.Dependenc
func SelectBuildpackDependency(dependencies []metadata.Dependency) (metadata.Dependency, bool) {
return metadata.SelectDependency(dependencies, metadata.BuildpackMetadataType)
}

func SelectKpackDependency(dependencies []metadata.Dependency) (metadata.Dependency, bool) {
return metadata.SelectDependency(dependencies, metadata.PackageType)
}

0 comments on commit dcb4121

Please sign in to comment.