Skip to content

Commit 6d5b8d4

Browse files
Merge pull request #424 from carolynvs/schema-version
Populate Schema Version in the CNAB bundle.json
2 parents bb29145 + 40d7f42 commit 6d5b8d4

File tree

200 files changed

+20623
-16092
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

200 files changed

+20623
-16092
lines changed

Gopkg.lock

+37-33
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Gopkg.toml

+11-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
# Stay exactly in step with a specific duffle release
22
[[constraint]]
33
name = "github.com/deislabs/duffle"
4-
version = "=0.1.0-ralpha.5+englishrose"
4+
version = "=0.2.0-beta.1"
55

66
[[constraint]]
77
name = "github.com/deislabs/cnab-go"
88
branch = "master"
9-
9+
10+
# Using our branch of cnab-to-oci because it is using a more recent version of cnab-go which we need because
11+
# it has more recent schema changes from CNAB spec 1.0
12+
[[constraint]]
13+
name = "github.com/docker/cnab-to-oci"
14+
branch = "cnab-go-with-schema-version"
15+
source = "github.com/deislabs/cnab-to-oci"
16+
1017
[[constraint]]
1118
name = "github.com/carolynvs/datetime-printer"
1219
version = "v0.2.0"
@@ -89,9 +96,9 @@
8996
go-tests = true
9097
unused-packages = true
9198

92-
# This is temporary until we know what packages we need from duffle
99+
# This is temporary until we know what packages we need from cnab-go
93100
[[prune.project]]
94-
name = "github.com/deislabs/duffle"
101+
name = "github.com/deislabs/cnab-go"
95102
unused-packages = false
96103

97104
[[constraint]]

pkg/cnab/config_adapter/adapter.go

+139
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
package configadapter
2+
3+
import (
4+
"fmt"
5+
"strings"
6+
7+
"github.com/deislabs/cnab-go/bundle"
8+
"github.com/deislabs/porter/pkg/config"
9+
"github.com/deislabs/porter/pkg/context"
10+
)
11+
12+
// ManifestConverter converts from a porter manifest to a CNAB bundle definition.
13+
type ManifestConverter struct {
14+
*context.Context
15+
Manifest *config.Manifest
16+
}
17+
18+
func (c *ManifestConverter) ToBundle() bundle.Bundle {
19+
fmt.Fprintf(c.Out, "\nGenerating Bundle File with Invocation Image %s =======> \n", c.Manifest.Image)
20+
b := bundle.Bundle{
21+
Name: c.Manifest.Name,
22+
Description: c.Manifest.Description,
23+
Version: c.Manifest.Version,
24+
Custom: make(map[string]interface{}, 1),
25+
}
26+
image := bundle.InvocationImage{
27+
BaseImage: bundle.BaseImage{
28+
Image: c.Manifest.Image,
29+
ImageType: "docker",
30+
},
31+
}
32+
33+
b.InvocationImages = []bundle.InvocationImage{image}
34+
b.Parameters = c.generateBundleParameters()
35+
b.Credentials = c.generateBundleCredentials()
36+
b.Images = c.generateBundleImages()
37+
b.Custom[config.CustomBundleKey] = c.GenerateStamp()
38+
39+
return b
40+
}
41+
42+
func (c *ManifestConverter) generateBundleParameters() bundle.ParametersDefinition {
43+
params := bundle.ParametersDefinition{
44+
Fields: make(map[string]bundle.ParameterDefinition, len(c.Manifest.Parameters)),
45+
}
46+
for _, param := range append(c.Manifest.Parameters, c.buildDefaultPorterParameters()...) {
47+
fmt.Fprintf(c.Out, "Generating parameter definition %s ====>\n", param.Name)
48+
p := bundle.ParameterDefinition{
49+
DataType: param.DataType,
50+
Default: param.Default,
51+
AllowedValues: param.AllowedValues,
52+
MinValue: param.MinValue,
53+
MaxValue: param.MaxValue,
54+
MinLength: param.MinLength,
55+
MaxLength: param.MaxLength,
56+
}
57+
58+
// If the default is empty, set required to true.
59+
if param.Default == nil {
60+
params.Required = append(params.Required, param.Name)
61+
}
62+
63+
if param.Metadata.Description != "" {
64+
p.Metadata = &bundle.ParameterMetadata{Description: param.Metadata.Description}
65+
}
66+
67+
if param.Destination != nil {
68+
p.Destination = &bundle.Location{
69+
EnvironmentVariable: param.Destination.EnvironmentVariable,
70+
Path: param.Destination.Path,
71+
}
72+
} else {
73+
p.Destination = &bundle.Location{
74+
EnvironmentVariable: strings.ToUpper(param.Name),
75+
}
76+
}
77+
params.Fields[param.Name] = p
78+
}
79+
return params
80+
}
81+
82+
func (c *ManifestConverter) buildDefaultPorterParameters() []config.ParameterDefinition {
83+
return []config.ParameterDefinition{
84+
{
85+
Name: "porter-debug",
86+
Destination: &config.Location{
87+
EnvironmentVariable: "PORTER_DEBUG",
88+
},
89+
DataType: "bool",
90+
Default: false,
91+
Metadata: config.ParameterMetadata{
92+
Description: "Print debug information from Porter when executing the bundle"},
93+
},
94+
}
95+
}
96+
97+
func (c *ManifestConverter) generateBundleCredentials() map[string]bundle.Credential {
98+
params := map[string]bundle.Credential{}
99+
for _, cred := range c.Manifest.Credentials {
100+
fmt.Fprintf(c.Out, "Generating credential %s ====>\n", cred.Name)
101+
l := bundle.Credential{
102+
Description: cred.Description,
103+
Required: cred.Required,
104+
Location: bundle.Location{
105+
Path: cred.Path,
106+
EnvironmentVariable: cred.EnvironmentVariable,
107+
},
108+
}
109+
params[cred.Name] = l
110+
}
111+
return params
112+
}
113+
114+
func (c *ManifestConverter) generateBundleImages() map[string]bundle.Image {
115+
images := make(map[string]bundle.Image, len(c.Manifest.ImageMap))
116+
117+
for i, refImage := range c.Manifest.ImageMap {
118+
img := bundle.Image{
119+
Description: refImage.Description,
120+
BaseImage: bundle.BaseImage{
121+
Image: refImage.Image,
122+
Digest: refImage.Digest,
123+
ImageType: refImage.ImageType,
124+
MediaType: refImage.MediaType,
125+
OriginalImage: refImage.OriginalImage,
126+
Size: refImage.Size,
127+
},
128+
}
129+
if refImage.Platform != nil {
130+
img.Platform = &bundle.ImagePlatform{
131+
Architecture: refImage.Platform.Architecture,
132+
OS: refImage.Platform.OS,
133+
}
134+
}
135+
images[i] = img
136+
}
137+
138+
return images
139+
}
+81
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package configadapter
2+
3+
import (
4+
"testing"
5+
6+
"github.com/deislabs/porter/pkg/config"
7+
"github.com/stretchr/testify/assert"
8+
"github.com/stretchr/testify/require"
9+
)
10+
11+
func TestPorter_generateImages(t *testing.T) {
12+
c := config.NewTestConfig(t)
13+
c.TestContext.AddTestFile("../../config/testdata/simple.porter.yaml", config.Name)
14+
15+
err := c.LoadManifest()
16+
require.NoError(t, err)
17+
18+
a := ManifestConverter{
19+
Context: c.Context,
20+
Manifest: c.Manifest,
21+
}
22+
23+
mappedImage := config.MappedImage{
24+
Description: "un petite server",
25+
Image: "deislabs/myserver:1.0.0",
26+
ImageType: "docker",
27+
Digest: "abc123",
28+
Size: 12,
29+
MediaType: "download",
30+
OriginalImage: "deis/myserver:1.0.0",
31+
Platform: &config.ImagePlatform{
32+
OS: "linux",
33+
Architecture: "amd64",
34+
},
35+
}
36+
a.Manifest.ImageMap = map[string]config.MappedImage{
37+
"server": mappedImage,
38+
}
39+
40+
images := a.generateBundleImages()
41+
42+
require.Len(t, images, 1)
43+
img := images["server"]
44+
assert.Equal(t, mappedImage.Description, img.Description)
45+
assert.Equal(t, mappedImage.Image, img.Image)
46+
assert.Equal(t, mappedImage.ImageType, img.ImageType)
47+
assert.Equal(t, mappedImage.Digest, img.Digest)
48+
assert.Equal(t, mappedImage.Size, img.Size)
49+
assert.Equal(t, mappedImage.MediaType, img.MediaType)
50+
assert.Equal(t, mappedImage.OriginalImage, img.OriginalImage)
51+
assert.Equal(t, mappedImage.Platform.OS, img.Platform.OS)
52+
assert.Equal(t, mappedImage.Platform.Architecture, img.Platform.Architecture)
53+
}
54+
55+
func TestPorter_generateBundleImages_EmptyPlatform(t *testing.T) {
56+
c := config.NewTestConfig(t)
57+
c.TestContext.AddTestFile("../../config/testdata/simple.porter.yaml", config.Name)
58+
59+
err := c.LoadManifest()
60+
require.NoError(t, err)
61+
62+
a := ManifestConverter{
63+
Context: c.Context,
64+
Manifest: c.Manifest,
65+
}
66+
67+
mappedImage := config.MappedImage{
68+
Description: "un petite server",
69+
Image: "deislabs/myserver:1.0.0",
70+
ImageType: "docker",
71+
Platform: nil,
72+
}
73+
a.Manifest.ImageMap = map[string]config.MappedImage{
74+
"server": mappedImage,
75+
}
76+
77+
images := a.generateBundleImages()
78+
require.Len(t, images, 1)
79+
img := images["server"]
80+
assert.Nil(t, img.Platform)
81+
}

0 commit comments

Comments
 (0)