Skip to content

Commit

Permalink
chore(*) make kumactl install control-plane use Helm Charts
Browse files Browse the repository at this point in the history
Signed-off-by: Nikolay Nikolaev <nikolay.nikolaev@konghq.com>
  • Loading branch information
Nikolay Nikolaev committed Aug 24, 2020
1 parent 3a4c807 commit 82036d4
Show file tree
Hide file tree
Showing 14 changed files with 1,136 additions and 434 deletions.
15 changes: 15 additions & 0 deletions api/go.sum
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/census-instrumentation/opencensus-proto v0.2.1 h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cncf/udpa/go v0.0.0-20200313221541-5f7e5dd04533 h1:8wZizuKuZVu5COB7EsBYxBQz8nRcXXn5d4Gt91eJLvU=
github.com/cncf/udpa/go v0.0.0-20200313221541-5f7e5dd04533/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
github.com/envoyproxy/go-control-plane v0.9.5 h1:lRJIqDD8yjV1YyPRqecMdytjDLs2fTXq363aCib5xPU=
github.com/envoyproxy/go-control-plane v0.9.5/go.mod h1:OXl5to++W0ctG+EHWTFUjiypVxC/Y4VLc/KFU+al13s=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/envoyproxy/protoc-gen-validate v0.3.0-java.0.20200311152155-ab56c3dd1cf9 h1:mU3oOAYTK9ZRKMj//H1EWk1vWbkYeWKBPYKMnIwcs/A=
github.com/envoyproxy/protoc-gen-validate v0.3.0-java.0.20200311152155-ab56c3dd1cf9/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
Expand All @@ -19,6 +25,7 @@ github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaW
github.com/golang/protobuf v1.3.5 h1:F768QJ1E9tib+q5Sc8MkdJi1RxLTbRcTf8LJV56aRls=
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
Expand All @@ -27,7 +34,9 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W
github.com/onsi/ginkgo v1.12.1 h1:mFwc4LvZ0xpSvDZ3E+k8Yte0hLOMxXUlP+yXtJqkYfQ=
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.9.0 h1:R1uwffexN6Pr340GtYRIdZmAiN4J+iw6WG4wog1DUXg=
github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
Expand All @@ -40,6 +49,7 @@ golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73r
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
Expand All @@ -51,24 +61,29 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e h1:N7DeIrjYszNmSW409R3frPPwglRwMkXSBzwVbkOjLLA=
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE=
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
Expand Down
106 changes: 55 additions & 51 deletions app/kumactl/cmd/install/install_control_plane.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import (
"fmt"
"net/url"

kuma_version "github.com/kumahq/kuma/pkg/version"

"github.com/pkg/errors"
"github.com/spf13/cobra"

Expand All @@ -15,7 +17,6 @@ import (
kuma_cmd "github.com/kumahq/kuma/pkg/cmd"
"github.com/kumahq/kuma/pkg/config/core"
"github.com/kumahq/kuma/pkg/tls"
kuma_version "github.com/kumahq/kuma/pkg/version"
)

var (
Expand All @@ -24,28 +25,29 @@ var (
)

type InstallControlPlaneArgs struct {
Namespace string
ImagePullPolicy string
ControlPlaneVersion string
ControlPlaneImage string
ControlPlaneServiceName string
ControlPlaneSecrets []ImageEnvSecret
AdmissionServerTlsCert string
AdmissionServerTlsKey string
InjectorFailurePolicy string
DataplaneImage string
DataplaneInitImage string
SdsTlsCert string
SdsTlsKey string
KdsTlsCert string
KdsTlsKey string
KdsGlobalAddress string
CNIEnabled bool
CNIImage string
CNIVersion string
KumaCpMode string
Zone string
GlobalRemotePortType string
Release_Namespace string
Values_controlPlane_image_pullPolicy string
Values_controlPlane_image_registry string
Values_controlPlane_image_repositry string
Values_controlPlane_image_tag string
ControlPlaneServiceName string
ControlPlaneSecrets []ImageEnvSecret
AdmissionServerTlsCert string
AdmissionServerTlsKey string
InjectorFailurePolicy string
DataplaneImage string
DataplaneInitImage string
SdsTlsCert string
SdsTlsKey string
KdsTlsCert string
KdsTlsKey string
KdsGlobalAddress string
CNIEnabled bool
CNIImage string
CNIVersion string
KumaCpMode string
Zone string
GlobalRemotePortType string
}

type ImageEnvSecret struct {
Expand All @@ -55,23 +57,24 @@ type ImageEnvSecret struct {
}

var DefaultInstallControlPlaneArgs = InstallControlPlaneArgs{
Namespace: "kuma-system",
ImagePullPolicy: "IfNotPresent",
ControlPlaneVersion: kuma_version.Build.Version,
ControlPlaneImage: "kong-docker-kuma-docker.bintray.io/kuma-cp",
ControlPlaneServiceName: "kuma-control-plane",
AdmissionServerTlsCert: "",
AdmissionServerTlsKey: "",
InjectorFailurePolicy: "Ignore",
DataplaneImage: "kong-docker-kuma-docker.bintray.io/kuma-dp",
DataplaneInitImage: "kong-docker-kuma-docker.bintray.io/kuma-init",
SdsTlsCert: "",
SdsTlsKey: "",
CNIImage: "lobkovilya/install-cni",
CNIVersion: "0.0.1",
KumaCpMode: core.Standalone,
Zone: "",
GlobalRemotePortType: "LoadBalancer",
Release_Namespace: "kuma-system",
Values_controlPlane_image_pullPolicy: "IfNotPresent",
Values_controlPlane_image_registry: "kong-docker-kuma-docker.bintray.io",
Values_controlPlane_image_repositry: "kuma-cp",
Values_controlPlane_image_tag: kuma_version.Build.Version,
ControlPlaneServiceName: "kuma-control-plane",
AdmissionServerTlsCert: "",
AdmissionServerTlsKey: "",
InjectorFailurePolicy: "Ignore",
DataplaneImage: "kong-docker-kuma-docker.bintray.io/kuma-dp",
DataplaneInitImage: "kong-docker-kuma-docker.bintray.io/kuma-init",
SdsTlsCert: "",
SdsTlsKey: "",
CNIImage: "lobkovilya/install-cni",
CNIVersion: "0.0.1",
KumaCpMode: core.Standalone,
Zone: "",
GlobalRemotePortType: "LoadBalancer",
}

var InstallCpTemplateFilesFn = InstallCpTemplateFiles
Expand Down Expand Up @@ -101,9 +104,9 @@ func newInstallControlPlaneCmd(pctx *kumactl_cmd.RootContext) *cobra.Command {
return errors.Wrap(err, "Failed to read template files")
}

renderedFiles, err := renderFiles(templateFiles, args, simpleTemplateRenderer)
renderedFiles, err := renderHelmFiles(templateFiles, args)
if err != nil {
return errors.Wrap(err, "Failed to render template files")
return errors.Wrap(err, "Failed to render helm template files")
}

sortedResources := k8s.SortResourcesByKind(renderedFiles)
Expand All @@ -118,10 +121,11 @@ func newInstallControlPlaneCmd(pctx *kumactl_cmd.RootContext) *cobra.Command {
},
}
// flags
cmd.Flags().StringVar(&args.Namespace, "namespace", args.Namespace, "namespace to install Kuma Control Plane to")
cmd.Flags().StringVar(&args.ImagePullPolicy, "image-pull-policy", args.ImagePullPolicy, "image pull policy that applies to all components of the Kuma Control Plane")
cmd.Flags().StringVar(&args.ControlPlaneVersion, "control-plane-version", args.ControlPlaneVersion, "version shared by all components of the Kuma Control Plane")
cmd.Flags().StringVar(&args.ControlPlaneImage, "control-plane-image", args.ControlPlaneImage, "image of the Kuma Control Plane component")
cmd.Flags().StringVar(&args.Release_Namespace, "namespace", args.Release_Namespace, "namespace to install Kuma Control Plane to")
cmd.Flags().StringVar(&args.Values_controlPlane_image_pullPolicy, "image-pull-policy", args.Values_controlPlane_image_pullPolicy, "image pull policy that applies to all components of the Kuma Control Plane")
cmd.Flags().StringVar(&args.Values_controlPlane_image_registry, "control-plane-registry", args.Values_controlPlane_image_registry, "registry for the image of the Kuma Control Plane component")
cmd.Flags().StringVar(&args.Values_controlPlane_image_repositry, "control-plane-repository", args.Values_controlPlane_image_repositry, "repository for the image of the Kuma Control Plane component")
cmd.Flags().StringVar(&args.Values_controlPlane_image_tag, "control-plane-version", args.Values_controlPlane_image_tag, "version shared by all components of the Kuma Control Plane")
cmd.Flags().StringVar(&args.ControlPlaneServiceName, "control-plane-service-name", args.ControlPlaneServiceName, "Service name of the Kuma Control Plane")
cmd.Flags().StringVar(&args.AdmissionServerTlsCert, "admission-server-tls-cert", args.AdmissionServerTlsCert, "TLS certificate for the admission web hooks implemented by the Kuma Control Plane")
cmd.Flags().StringVar(&args.AdmissionServerTlsKey, "admission-server-tls-key", args.AdmissionServerTlsKey, "TLS key for the admission web hooks implemented by the Kuma Control Plane")
Expand Down Expand Up @@ -178,7 +182,7 @@ func validateArgs(args InstallControlPlaneArgs) error {

func autogenerateCerts(args *InstallControlPlaneArgs) error {
if args.AdmissionServerTlsCert == "" && args.AdmissionServerTlsKey == "" {
fqdn := fmt.Sprintf("%s.%s.svc", args.ControlPlaneServiceName, args.Namespace)
fqdn := fmt.Sprintf("%s.%s.svc", args.ControlPlaneServiceName, args.Release_Namespace)
// notice that Kubernetes doesn't requires DNS SAN in a X509 cert of a WebHook
admissionCert, err := NewSelfSignedCert(fqdn, tls.ServerCertType)
if err != nil {
Expand All @@ -189,10 +193,10 @@ func autogenerateCerts(args *InstallControlPlaneArgs) error {
}

if args.SdsTlsCert == "" && args.SdsTlsKey == "" {
fqdn := fmt.Sprintf("%s.%s.svc", args.ControlPlaneServiceName, args.Namespace)
fqdn := fmt.Sprintf("%s.%s.svc", args.ControlPlaneServiceName, args.Release_Namespace)
hosts := []string{
fqdn,
fmt.Sprintf("%s.%s", args.ControlPlaneServiceName, args.Namespace),
fmt.Sprintf("%s.%s", args.ControlPlaneServiceName, args.Release_Namespace),
args.ControlPlaneServiceName,
"localhost",
}
Expand All @@ -206,7 +210,7 @@ func autogenerateCerts(args *InstallControlPlaneArgs) error {
}

if args.KdsTlsCert == "" && args.KdsTlsKey == "" {
fqdn := fmt.Sprintf("%s.%s.svc", args.ControlPlaneServiceName, args.Namespace)
fqdn := fmt.Sprintf("%s.%s.svc", args.ControlPlaneServiceName, args.Release_Namespace)
hosts := []string{
fqdn,
"localhost",
Expand All @@ -222,7 +226,7 @@ func autogenerateCerts(args *InstallControlPlaneArgs) error {
}

func InstallCpTemplateFiles(args InstallControlPlaneArgs) (data.FileList, error) {
templateFiles, err := data.ReadFiles(controlplane.Templates)
templateFiles, err := data.ReadFiles(controlplane.HelmTemplates)
if err != nil {
return nil, err
}
Expand Down
2 changes: 1 addition & 1 deletion app/kumactl/cmd/install/install_control_plane_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ var _ = Describe("kumactl install control-plane", func() {
GitCommit: "91ce236824a9d875601679aa80c63783fb0e8725",
BuildDate: "2019-08-07T11:26:06Z",
}
install.DefaultInstallControlPlaneArgs.ControlPlaneVersion = "0.0.1"
install.DefaultInstallControlPlaneArgs.Values_controlPlane_image_tag = "0.0.1"
})

var stdout *bytes.Buffer
Expand Down
131 changes: 131 additions & 0 deletions app/kumactl/cmd/install/render_helm_files.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
package install

import (
"reflect"
"strings"

"github.com/pkg/errors"
"helm.sh/helm/v3/pkg/chart"
"helm.sh/helm/v3/pkg/chart/loader"
"helm.sh/helm/v3/pkg/chartutil"
"helm.sh/helm/v3/pkg/engine"

"github.com/kumahq/kuma/app/kumactl/pkg/install/data"
)

func renderHelmFiles(templates []data.File, args interface{}) ([]data.File, error) {
loadedChart, err := loadCharts(templates)
if err != nil {
return nil, errors.Errorf("Failed to load charts: %s", err)
}

overrideValues := generateOverrideValues(args)
if err := chartutil.ProcessDependencies(loadedChart, overrideValues); err != nil {
return nil, errors.Errorf("Failed to process dependencies: %s", err)
}

namespace := (overrideValues["Release"].(map[string]interface{}))["Namespace"].(string)
options := generateReleaseOptions(loadedChart.Metadata.Name, namespace)

valuesToRender, err := chartutil.ToRenderValues(loadedChart, overrideValues, options, nil)
if err != nil {
return nil, errors.Errorf("Failed to render values: %s", err)
}

files, err := engine.Render(loadedChart, valuesToRender)
if err != nil {
return nil, errors.Errorf("Failed to render templates: %s", err)
}

return postRender(loadedChart, files), nil
}

func loadCharts(templates []data.File) (*chart.Chart, error) {
files := []*loader.BufferedFile{}
for _, f := range templates {
files = append(files, &loader.BufferedFile{
Name: f.FullPath[1:],
Data: f.Data,
})
}

loadedChart, err := loader.LoadFiles(files)
if err != nil {
return nil, err
}

// Filter out the pre- templates
loadedTemplates := loadedChart.Templates
loadedChart.Templates = []*chart.File{}

for _, t := range loadedTemplates {
if !strings.HasPrefix(t.Name, "templates/pre-") {
loadedChart.Templates = append(loadedChart.Templates, &chart.File{
Name: t.Name,
Data: t.Data,
})
}
}

return loadedChart, nil
}

func generateOverrideValues(args interface{}) map[string]interface{} {
overrideValues := map[string]interface{}{}

v := reflect.ValueOf(args)
t := v.Type()
for i := 0; i < t.NumField(); i++ {
name := t.Field(i).Name
value := v.FieldByName(name).Interface()

splitName := strings.Split(name, "_")
len := len(splitName)

root := overrideValues

for i := 0; i < len-1; i++ {
n := splitName[i]

if _, ok := root[n]; !ok {
root[n] = map[string]interface{}{}
}
root = root[n].(map[string]interface{})
}
root[splitName[len-1]] = value
}

return overrideValues
}

func generateReleaseOptions(name, namespace string) chartutil.ReleaseOptions {
return chartutil.ReleaseOptions{
Name: name,
Namespace: namespace,
Revision: 1,
IsInstall: true,
IsUpgrade: false,
}
}

func postRender(loadedChart *chart.Chart, files map[string]string) []data.File {
result := []data.File{}

for _, crd := range loadedChart.CRDObjects() {
result = append(result, data.File{
Data: crd.File.Data,
Name: crd.Name,
})
}

for n, d := range files {
if strings.HasSuffix(n, "yaml") {
result = append(result, data.File{
Data: []byte(d),
Name: n,
})
}
}

return result
}
Loading

0 comments on commit 82036d4

Please sign in to comment.