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