AppController dependency support

Dependencies between objects that charts consist of are retrieved based
on manifest name and chart name. This required altering release naming
in order to achieve shorter manifest names.

Dependencies are appended to manifest doc, which now consist of
AppController ResourceDefinitions and Dependencies.
pull/1756/head
Maciej Kwiek 9 years ago
parent 18a36c49f9
commit 7b3780f093

@ -584,6 +584,9 @@ func (s *ReleaseServer) uniqName(start string, reuse bool) (string, error) {
for i := 0; i < maxTries; i++ { for i := 0; i < maxTries; i++ {
namer := moniker.New() namer := moniker.New()
name := namer.NameSep("-") name := namer.NameSep("-")
//too long for services, for now get rid of first segment
name = strings.Split(name, "-")[1]
log.Println(name)
if len(name) > releaseNameMaxLen { if len(name) > releaseNameMaxLen {
name = name[:releaseNameMaxLen] name = name[:releaseNameMaxLen]
} }
@ -722,6 +725,21 @@ func (s *ReleaseServer) getVersionSet() (versionSet, error) {
return newVersionSet(versions...), nil return newVersionSet(versions...), nil
} }
type Dependency struct {
Name string
Child string
Parent string
}
func (d Dependency) String() string {
return fmt.Sprintf(`apiVersion: appcontroller.k8s/v1alpha1
kind: Dependency
metadata:
name: %s
parent: %s
child: %s`, d.Name, d.Parent, d.Child)
}
func (s *ReleaseServer) renderResources(ch *chart.Chart, values chartutil.Values) ([]*release.Hook, *bytes.Buffer, string, error) { func (s *ReleaseServer) renderResources(ch *chart.Chart, values chartutil.Values) ([]*release.Hook, *bytes.Buffer, string, error) {
renderer := s.engine(ch) renderer := s.engine(ch)
files, err := renderer.Render(ch, values) files, err := renderer.Render(ch, values)
@ -787,6 +805,13 @@ func (s *ReleaseServer) renderResources(ch *chart.Chart, values chartutil.Values
b.WriteString(wrapped) b.WriteString(wrapped)
} }
deps := getDependencies(ch, manifests)
for _, d := range deps {
b.WriteString("\n---\n")
b.WriteString(d.String())
}
//log.Println(b.String()) //log.Println(b.String())
return hooks, b, notes, nil return hooks, b, notes, nil
@ -801,6 +826,52 @@ func getInput(in string, indent int) string {
} }
func getDependencies(ch *chart.Chart, manifests []manifest) []Dependency {
dependencies := []Dependency{}
for _, dep := range ch.Dependencies {
dependencies = append(dependencies, getDependencies(dep, manifests)...)
dependencies = append(dependencies, getInterChartDependencies(ch, dep, manifests)...)
}
return dependencies
}
// This is horribly hacky.
func getInterChartDependencies(child, parent *chart.Chart, manifests []manifest) []Dependency {
parentNames := []string{}
childNames := []string{}
for _, m := range manifests {
kind := m.head.Kind
name := m.head.Metadata.Name
log.Printf("comparing %s and %s with %s/%s", child.Metadata.Name, parent.Metadata.Name, kind, name)
//so hacky I'm gonna cry. need to find a better way
//I had to remove first segment of helm release name for this to work (chart names were truncated from release name)
if strings.Contains(name, parent.Metadata.Name) {
log.Printf("adding %s to parents", strings.ToLower(kind)+"/"+name)
parentNames = append(parentNames, strings.ToLower(kind)+"/"+name)
}
if strings.Contains(name, child.Metadata.Name) {
log.Printf("adding %s to children", strings.ToLower(kind)+"/"+name)
childNames = append(childNames, strings.ToLower(kind)+"/"+name)
}
}
deps := make([]Dependency, 0, len(parentNames)*len(childNames))
for _, parent := range parentNames {
for _, child := range childNames {
namer := moniker.New()
deps = append(deps, Dependency{
Name: namer.NameSep("-"),
Child: child,
Parent: parent,
})
}
}
return deps
}
func (s *ReleaseServer) recordRelease(r *release.Release, reuse bool) { func (s *ReleaseServer) recordRelease(r *release.Release, reuse bool) {
if reuse { if reuse {
if err := s.env.Releases.Update(r); err != nil { if err := s.env.Releases.Update(r); err != nil {

Loading…
Cancel
Save