mirror of https://github.com/helm/helm
parent
65a7be5618
commit
c349bfbffd
@ -0,0 +1,120 @@
|
|||||||
|
package helm
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
|
||||||
|
chartutil "github.com/kubernetes/helm/pkg/chart"
|
||||||
|
chartpbs "github.com/kubernetes/helm/pkg/proto/hapi/chart"
|
||||||
|
)
|
||||||
|
|
||||||
|
func ChartToProto(ch *chartutil.Chart) (chpb *chartpbs.Chart, err error) {
|
||||||
|
chpb = new(chartpbs.Chart)
|
||||||
|
|
||||||
|
chpb.Metadata, err = MetadataToProto(ch)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
chpb.Templates, err = TemplatesToProto(ch)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
chpb.Values, err = ValuesToProto(ch)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
chs, err := WalkChartFile(ch)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, dep := range chs.deps {
|
||||||
|
chdep, err := ChartToProto(dep.File())
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
chpb.Dependencies = append(chpb.Dependencies, chdep)
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func MetadataToProto(ch *chartutil.Chart) (*chartpbs.Metadata, error) {
|
||||||
|
if ch == nil {
|
||||||
|
return nil, ErrMissingChart
|
||||||
|
}
|
||||||
|
|
||||||
|
chfi := ch.Chartfile()
|
||||||
|
|
||||||
|
md := &chartpbs.Metadata{
|
||||||
|
Name: chfi.Name,
|
||||||
|
Home: chfi.Home,
|
||||||
|
Version: chfi.Version,
|
||||||
|
Description: chfi.Description,
|
||||||
|
}
|
||||||
|
|
||||||
|
md.Sources = make([]string, len(chfi.Source))
|
||||||
|
copy(md.Sources, chfi.Source)
|
||||||
|
|
||||||
|
md.Keywords = make([]string, len(chfi.Keywords))
|
||||||
|
copy(md.Keywords, chfi.Keywords)
|
||||||
|
|
||||||
|
for _, maintainer := range chfi.Maintainers {
|
||||||
|
md.Maintainers = append(md.Maintainers, &chartpbs.Maintainer{
|
||||||
|
Name: maintainer.Name,
|
||||||
|
Email: maintainer.Email,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return md, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func TemplatesToProto(ch *chartutil.Chart) (tpls []*chartpbs.Template, err error) {
|
||||||
|
if ch == nil {
|
||||||
|
return nil, ErrMissingChart
|
||||||
|
}
|
||||||
|
|
||||||
|
members, err := ch.LoadTemplates()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var tpl *chartpbs.Template
|
||||||
|
|
||||||
|
for _, member := range members {
|
||||||
|
tpl = &chartpbs.Template{
|
||||||
|
Name: member.Path,
|
||||||
|
Data: make([]byte, len(member.Content)),
|
||||||
|
}
|
||||||
|
|
||||||
|
copy(tpl.Data, member.Content)
|
||||||
|
|
||||||
|
tpls = append(tpls, tpl)
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func ValuesToProto(ch *chartutil.Chart) (*chartpbs.Config, error) {
|
||||||
|
if ch == nil {
|
||||||
|
return nil, ErrMissingChart
|
||||||
|
}
|
||||||
|
|
||||||
|
vals, err := ch.LoadValues()
|
||||||
|
if err != nil {
|
||||||
|
return nil, ErrMissingValues
|
||||||
|
}
|
||||||
|
|
||||||
|
var buf bytes.Buffer
|
||||||
|
if err = vals.Encode(&buf); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
cfgVals := new(chartpbs.Config)
|
||||||
|
cfgVals.Raw = buf.String()
|
||||||
|
|
||||||
|
return cfgVals, nil
|
||||||
|
}
|
@ -0,0 +1,110 @@
|
|||||||
|
package helm
|
||||||
|
|
||||||
|
import (
|
||||||
|
chartutil "github.com/kubernetes/helm/pkg/chart"
|
||||||
|
)
|
||||||
|
|
||||||
|
//
|
||||||
|
// TODO - we should probably consolidate
|
||||||
|
// most of the code in this package, that
|
||||||
|
// is specific to charts, into chartutil.
|
||||||
|
//
|
||||||
|
|
||||||
|
// Walk a chart's dependency tree, returning
|
||||||
|
// a pointer to the root chart.
|
||||||
|
//
|
||||||
|
// The following is an example chart dependency
|
||||||
|
// hierarchy and the structure of a chartObj
|
||||||
|
// post traversal. (note some chart files are
|
||||||
|
// omitted for brevity),
|
||||||
|
//
|
||||||
|
// mychart/
|
||||||
|
// charts/
|
||||||
|
// chart_A/
|
||||||
|
// charts/
|
||||||
|
// chart_B/
|
||||||
|
// chart_C/
|
||||||
|
// charts/
|
||||||
|
// chart_F/
|
||||||
|
// chart_D/
|
||||||
|
// charts/
|
||||||
|
// chart_E/
|
||||||
|
// chart_F/
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// chart: mychart (deps = 2)
|
||||||
|
// |
|
||||||
|
// |----> chart_A (deps = 2)
|
||||||
|
// |
|
||||||
|
// |--------> chart_B (deps = 0)
|
||||||
|
// |
|
||||||
|
// |--------> chart_C (deps = 1)
|
||||||
|
// |
|
||||||
|
// |------------> chart_F (deps = 0)
|
||||||
|
// |
|
||||||
|
// |----> chart_D (deps = 2)
|
||||||
|
// |
|
||||||
|
// |--------> chart_E (deps = 0)
|
||||||
|
// |
|
||||||
|
// |--------> chart_F (deps = 0)
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
func WalkChartFile(chfi *chartutil.Chart) (*chartObj, error) {
|
||||||
|
root := &chartObj{file: chfi}
|
||||||
|
err := root.walkChartDeps(chfi)
|
||||||
|
|
||||||
|
return root, err
|
||||||
|
}
|
||||||
|
|
||||||
|
type chartObj struct {
|
||||||
|
file *chartutil.Chart
|
||||||
|
deps []*chartObj
|
||||||
|
}
|
||||||
|
|
||||||
|
func (chd *chartObj) File() *chartutil.Chart {
|
||||||
|
return chd.file
|
||||||
|
}
|
||||||
|
|
||||||
|
func (chs *chartObj) walkChartDeps(chfi *chartutil.Chart) error {
|
||||||
|
if hasDeps(chfi) {
|
||||||
|
names, err := chfi.ChartDepNames()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(names) > 0 {
|
||||||
|
chs.deps = append(chs.deps, resolveChartDeps(names)...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func resolveChartDeps(names []string) (deps []*chartObj) {
|
||||||
|
for _, name := range names {
|
||||||
|
chfi, err := chartutil.LoadDir(name)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
chs := &chartObj{file: chfi}
|
||||||
|
err = chs.walkChartDeps(chfi)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
deps = append(deps, chs)
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func hasDeps(chfi *chartutil.Chart) bool {
|
||||||
|
names, err := chfi.ChartDepNames()
|
||||||
|
if err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return chfi.ChartsDir() != "" && len(names) > 0
|
||||||
|
}
|
Loading…
Reference in new issue