Skip to content
This repository was archived by the owner on Jan 25, 2019. It is now read-only.

Commit 3e02d1e

Browse files
committed
pkg/helm: validate env config
1 parent 451a853 commit 3e02d1e

File tree

1 file changed

+29
-11
lines changed

1 file changed

+29
-11
lines changed

helm-app-operator/pkg/helm/helm.go

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,12 @@ type Installer interface {
5252
type installer struct {
5353
storageBackend *storage.Storage
5454
tillerKubeClient *kube.Client
55-
chartDir string
55+
chart *cpb.Chart
5656
}
5757

5858
// NewInstaller returns a new Helm installer capable of installing and uninstalling releases.
59-
func NewInstaller(storageBackend *storage.Storage, tillerKubeClient *kube.Client, chartDir string) Installer {
60-
return installer{storageBackend, tillerKubeClient, chartDir}
59+
func NewInstaller(storageBackend *storage.Storage, tillerKubeClient *kube.Client, chart *cpb.Chart) Installer {
60+
return installer{storageBackend, tillerKubeClient, chart}
6161
}
6262

6363
// NewInstallerFromEnv returns a GVK and installer based on configuration provided
@@ -73,7 +73,30 @@ func NewInstallerFromEnv(storageBackend *storage.Storage, tillerKubeClient *kube
7373
return gvk, nil, err
7474
}
7575
gvk = gv.WithKind(kind)
76-
installer := NewInstaller(storageBackend, tillerKubeClient, chartDir)
76+
77+
// Verify the GVK. In general, GVKs without groups are valid. However,
78+
// a GVK without a group will most likely fail with a more descriptive
79+
// error later in the initialization process.
80+
if gvk.Version == "" {
81+
return gvk, nil, fmt.Errorf("invalid %s: version must not be empty", APIVersionEnvVar)
82+
}
83+
if gvk.Kind == "" {
84+
return gvk, nil, fmt.Errorf("invalid %s: kind must not be empty", KindEnvVar)
85+
}
86+
87+
// Verify that the Helm chart directory is valid.
88+
if chartDir == "" {
89+
return gvk, nil, fmt.Errorf("invalid %s: must not be empty", HelmChartEnvVar)
90+
}
91+
if stat, err := os.Stat(chartDir); err != nil || !stat.IsDir() {
92+
return gvk, nil, fmt.Errorf("invalid %s: %s is not a directory", HelmChartEnvVar, chartDir)
93+
}
94+
chart, err := chartutil.LoadDir(chartDir)
95+
if err != nil {
96+
return gvk, nil, fmt.Errorf("invalid %s: failed loading chart from %s: %s", HelmChartEnvVar, chartDir, err)
97+
}
98+
99+
installer := NewInstaller(storageBackend, tillerKubeClient, chart)
77100
return gvk, installer, nil
78101
}
79102

@@ -86,11 +109,6 @@ func (c installer) InstallRelease(r *v1alpha1.HelmApp) (*v1alpha1.HelmApp, error
86109
return r, err
87110
}
88111

89-
chart, err := chartutil.LoadDir(c.chartDir)
90-
if err != nil {
91-
return r, err
92-
}
93-
94112
var updatedRelease *release.Release
95113
latestRelease, err := c.storageBackend.Last(releaseName(r))
96114

@@ -101,7 +119,7 @@ func (c installer) InstallRelease(r *v1alpha1.HelmApp) (*v1alpha1.HelmApp, error
101119
installReq := &services.InstallReleaseRequest{
102120
Namespace: r.GetNamespace(),
103121
Name: releaseName(r),
104-
Chart: chart,
122+
Chart: c.chart,
105123
Values: &cpb.Config{Raw: string(cr)},
106124
}
107125

@@ -118,7 +136,7 @@ func (c installer) InstallRelease(r *v1alpha1.HelmApp) (*v1alpha1.HelmApp, error
118136
} else {
119137
updateReq := &services.UpdateReleaseRequest{
120138
Name: releaseName(r),
121-
Chart: chart,
139+
Chart: c.chart,
122140
Values: &cpb.Config{Raw: string(cr)},
123141
}
124142

0 commit comments

Comments
 (0)