Skip to content
This repository was archived by the owner on Jul 18, 2025. It is now read-only.

Commit 2618559

Browse files
committed
Allow creating helm chart for v1beta1 spec of Compose-Kubernetes
Signed-off-by: Joffrey F <joffrey@docker.com>
1 parent 40cb59e commit 2618559

2 files changed

Lines changed: 71 additions & 27 deletions

File tree

cmd/docker-app/helm.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
)
1010

1111
var (
12+
beta1 bool
1213
helmComposeFiles []string
1314
helmSettingsFile []string
1415
helmEnv []string
@@ -31,7 +32,7 @@ func helmCmd() *cobra.Command {
3132
if err != nil {
3233
return err
3334
}
34-
return renderer.Helm(appname, helmComposeFiles, helmSettingsFile, d, helmRender)
35+
return renderer.Helm(appname, helmComposeFiles, helmSettingsFile, d, helmRender, beta1)
3536
},
3637
}
3738
if internal.Experimental == "on" {
@@ -43,5 +44,6 @@ be rendered instead of exported as a template.`
4344
}
4445
cmd.Flags().StringArrayVarP(&helmSettingsFile, "settings-files", "f", []string{}, "Override settings files")
4546
cmd.Flags().StringArrayVarP(&helmEnv, "set", "s", []string{}, "Override settings values")
47+
cmd.Flags().BoolVarP(&beta1, "beta1", "b", false, "Use an older specification to produce a chart compatible with Docker UCP 2.0")
4648
return cmd
4749
}

internal/renderer/helm.go

Lines changed: 68 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"github.com/docker/app/internal/types"
1717
conversion "github.com/docker/cli/cli/command/stack/kubernetes"
1818
"github.com/docker/cli/cli/compose/loader"
19+
"github.com/docker/cli/kubernetes/compose/v1beta1"
1920
"github.com/docker/cli/kubernetes/compose/v1beta2"
2021
"github.com/pkg/errors"
2122
yaml "gopkg.in/yaml.v2"
@@ -207,21 +208,41 @@ func makeChart(appname, targetDir string) error {
207208
return ioutil.WriteFile(filepath.Join(targetDir, "Chart.yaml"), hmetadata, 0644)
208209
}
209210

210-
func helmRender(appname string, targetDir string, composeFiles []string, settingsFile []string, env map[string]string) error {
211+
func helmRender(appname string, targetDir string, composeFiles []string, settingsFile []string, env map[string]string, beta1 bool) error {
211212
rendered, err := Render(appname, composeFiles, settingsFile, env)
212213
if err != nil {
213214
return err
214215
}
215-
stackSpec := conversion.FromComposeConfig(rendered)
216-
stack := v1beta2.Stack{
217-
TypeMeta: metav1.TypeMeta{
218-
Kind: "stacks.compose.docker.com",
219-
APIVersion: "v1beta2",
220-
},
221-
ObjectMeta: metav1.ObjectMeta{
222-
Name: internal.AppNameFromDir(appname),
223-
},
224-
Spec: stackSpec,
216+
var stack interface{}
217+
if !beta1 {
218+
stackSpec := conversion.FromComposeConfig(rendered)
219+
stack = v1beta2.Stack{
220+
TypeMeta: metav1.TypeMeta{
221+
Kind: "stacks.compose.docker.com",
222+
APIVersion: "v1beta2",
223+
},
224+
ObjectMeta: metav1.ObjectMeta{
225+
Name: internal.AppNameFromDir(appname),
226+
},
227+
Spec: stackSpec,
228+
}
229+
} else {
230+
composeFile, err := yaml.Marshal(rendered)
231+
if err != nil {
232+
return err
233+
}
234+
stack = v1beta1.Stack{
235+
TypeMeta: metav1.TypeMeta{
236+
Kind: "stacks.compose.docker.com",
237+
APIVersion: "v1beta1",
238+
},
239+
ObjectMeta: metav1.ObjectMeta{
240+
Name: internal.AppNameFromDir(appname),
241+
},
242+
Spec: v1beta1.StackSpec{
243+
ComposeFile: string(composeFile),
244+
},
245+
}
225246
}
226247
stackData, err := yaml.Marshal(stack)
227248
if err != nil {
@@ -231,7 +252,7 @@ func helmRender(appname string, targetDir string, composeFiles []string, setting
231252
}
232253

233254
//makeStack converts data into a helm template for a stack
234-
func makeStack(appname string, targetDir string, data []byte) error {
255+
func makeStack(appname string, targetDir string, data []byte, beta1 bool) error {
235256
parsed, err := loader.ParseYAML(data)
236257
if err != nil {
237258
return errors.Wrap(err, "failed to parse template compose")
@@ -241,17 +262,38 @@ func makeStack(appname string, targetDir string, data []byte) error {
241262
return errors.Wrap(err, "failed to load template compose")
242263
}
243264
os.Mkdir(filepath.Join(targetDir, "templates"), 0755)
244-
stackSpec := templateconversion.FromComposeConfig(rendered)
245-
stack := templatev1beta2.Stack{
246-
TypeMeta: metav1.TypeMeta{
247-
Kind: "stacks.compose.docker.com",
248-
APIVersion: "v1beta2",
249-
},
250-
ObjectMeta: metav1.ObjectMeta{
251-
Name: internal.AppNameFromDir(appname),
252-
Namespace: "default", // FIXME
253-
},
254-
Spec: stackSpec,
265+
var stack interface{}
266+
if !beta1 {
267+
stackSpec := templateconversion.FromComposeConfig(rendered)
268+
stack = templatev1beta2.Stack{
269+
TypeMeta: metav1.TypeMeta{
270+
Kind: "stacks.compose.docker.com",
271+
APIVersion: "v1beta2",
272+
},
273+
ObjectMeta: metav1.ObjectMeta{
274+
Name: internal.AppNameFromDir(appname),
275+
Namespace: "default", // FIXME
276+
},
277+
Spec: stackSpec,
278+
}
279+
} else {
280+
composeFile, err := yaml.Marshal(rendered)
281+
if err != nil {
282+
return err
283+
}
284+
stack = v1beta1.Stack{
285+
TypeMeta: metav1.TypeMeta{
286+
Kind: "stacks.compose.docker.com",
287+
APIVersion: "v1beta1",
288+
},
289+
ObjectMeta: metav1.ObjectMeta{
290+
Name: internal.AppNameFromDir(appname),
291+
Namespace: "default", // FIXME
292+
},
293+
Spec: v1beta1.StackSpec{
294+
ComposeFile: string(composeFile),
295+
},
296+
}
255297
}
256298
stackData, err := yaml.Marshal(stack)
257299
if err != nil {
@@ -274,7 +316,7 @@ func makeStack(appname string, targetDir string, data []byte) error {
274316
}
275317

276318
// Helm renders an app as an Helm Chart
277-
func Helm(appname string, composeFiles []string, settingsFile []string, env map[string]string, render bool) error {
319+
func Helm(appname string, composeFiles []string, settingsFile []string, env map[string]string, render, beta1 bool) error {
278320
targetDir := internal.AppNameFromDir(appname) + ".chart"
279321
if err := os.Mkdir(targetDir, 0755); err != nil && !os.IsExist(err) {
280322
return errors.Wrap(err, "failed to create Chart directory")
@@ -284,7 +326,7 @@ func Helm(appname string, composeFiles []string, settingsFile []string, env map[
284326
return err
285327
}
286328
if render {
287-
return helmRender(appname, targetDir, composeFiles, settingsFile, env)
329+
return helmRender(appname, targetDir, composeFiles, settingsFile, env, beta1)
288330
}
289331
data, err := ioutil.ReadFile(filepath.Join(appname, internal.ComposeFileName))
290332
if err != nil {
@@ -294,7 +336,7 @@ func Helm(appname string, composeFiles []string, settingsFile []string, env map[
294336
if err != nil {
295337
return errors.Wrap(err, "failed to parse docker-compose.yml, maybe because it is a template")
296338
}
297-
err = makeStack(appname, targetDir, data)
339+
err = makeStack(appname, targetDir, data, beta1)
298340
if err != nil {
299341
return err
300342
}

0 commit comments

Comments
 (0)