This repository has been archived by the owner on May 17, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add support to inspect kpack metadata [#172090193]
Signed-off-by: Debbie Chen <[email protected]> Signed-off-by: Jeff Jun <[email protected]>
- Loading branch information
1 parent
a66c9f3
commit dcb4121
Showing
11 changed files
with
267 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -10,3 +10,5 @@ | |
|
||
# Output of the go coverage tool, specifically when used with LiteIDE | ||
*.out | ||
|
||
.idea/* |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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") | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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")))) | ||
}) | ||
}) | ||
}) | ||
}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters