// nounAddVariableDeps updates the dependencies of a noun given // a set of associated variable values func nounAddVariableDeps( g *depgraph.Graph, n *depgraph.Noun, vars map[string]config.InterpolatedVariable, removeSelf bool) { for _, v := range vars { // Only resource variables impose dependencies rv, ok := v.(*config.ResourceVariable) if !ok { continue } // Find the target target := g.Noun(rv.ResourceId()) if target == nil { continue } // If we're ignoring self-references, then don't add that // dependency. if removeSelf && n == target { continue } // Build the dependency dep := &depgraph.Dependency{ Name: rv.ResourceId(), Source: n, Target: target, } n.Deps = append(n.Deps, dep) } }
// graphAddMissingResourceProviders adds GraphNodeResourceProvider nodes for // the resources that do not have an explicit resource provider specified // because no provider configuration was given. func graphAddMissingResourceProviders( g *depgraph.Graph, ps map[string]ResourceProviderFactory) error { var errs []error for _, n := range g.Nouns { rn, ok := n.Meta.(*GraphNodeResource) if !ok { continue } if rn.ResourceProviderID != "" { continue } prefixes := matchingPrefixes(rn.Type, ps) if len(prefixes) == 0 { errs = append(errs, fmt.Errorf( "No matching provider for type: %s", rn.Type)) continue } // The resource provider ID is simply the shortest matching // prefix, since that'll give us the most resource providers // to choose from. rn.ResourceProviderID = prefixes[len(prefixes)-1] // If we don't have a matching noun for this yet, insert it. pn := g.Noun(fmt.Sprintf("provider.%s", rn.ResourceProviderID)) if pn == nil { pn = &depgraph.Noun{ Name: fmt.Sprintf("provider.%s", rn.ResourceProviderID), Meta: &GraphNodeResourceProvider{ ID: rn.ResourceProviderID, Config: nil, }, } g.Nouns = append(g.Nouns, pn) } // Add the provider configuration noun as a dependency dep := &depgraph.Dependency{ Name: pn.Name, Source: n, Target: pn, } n.Deps = append(n.Deps, dep) } if len(errs) > 0 { return &multierror.Error{Errors: errs} } return nil }