in cmd/hub/compose/elaborate.go [859:935]
func connectRequires(parentStackName string, parentStackProvides []string,
stackRequires []string, componentsManifests []manifest.Manifest, order []string) []string {
provides := make(map[string][]string)
addProv := func(name, prov string) {
who, exist := provides[prov]
if !exist {
provides[prov] = []string{name}
} else {
if config.Trace && (!strings.HasPrefix(who[0], "*") || len(who) > 1) {
log.Printf("`%s` already provides `%s`, but component `%s` also provides `%s`",
strings.Join(who, ", "), prov, name, prov)
}
provides[prov] = append(who, name)
}
}
requires := make(map[string][]string)
addReq := func(name, req string) {
by, exist := provides[req]
if exist {
if config.Debug {
log.Printf("Component `%s` requirement `%s` provided by `%s`",
name, req, strings.Join(by, ", "))
}
return
}
who, exist := requires[req]
if !exist {
requires[req] = []string{name}
} else {
requires[req] = append(who, name)
}
}
parentStack := fmt.Sprintf("*%s*", parentStackName)
for _, parentProvide := range parentStackProvides {
addProv(parentStack, parentProvide)
if parentProvide == "kubernetes" {
addProv(parentStack, "kubectl")
}
}
stack := "*stack*"
for _, req := range stackRequires {
addReq(stack, req)
}
components := make(map[string]manifest.Manifest)
for _, component := range componentsManifests {
name := manifest.ComponentQualifiedNameFromMeta(&component.Meta)
components[name] = component
}
for _, name := range order {
component := components[name]
for _, req := range component.Requires {
addReq(name, req)
}
for _, prov := range component.Provides {
addProv(name, prov)
if prov == "kubernetes" {
addProv(name, "kubectl")
}
}
}
if config.Debug && len(requires) > 0 {
log.Print("Stack requires:")
util.PrintDeps(requires)
}
keys := make([]string, 0, len(requires))
for k := range requires {
keys = append(keys, k)
}
sort.Strings(keys)
return keys
}