// Graph builds a dependency graph of all the resources for infrastructure // change. // // This dependency graph shows the correct order that any resources need // to be operated on. // // The Meta field of a graph Noun can contain one of the follow types. A // description is next to each type to explain what it is. // // *GraphNodeResource - A resource. See the documentation of this // struct for more details. // *GraphNodeResourceProvider - A resource provider that needs to be // configured at this point. // func Graph(opts *GraphOpts) (*depgraph.Graph, error) { if opts.Config == nil { return nil, errors.New("Config is required for Graph") } log.Printf("[DEBUG] Creating graph...") g := new(depgraph.Graph) // First, build the initial resource graph. This only has the resources // and no dependencies. graphAddConfigResources(g, opts.Config, opts.State) // Add explicit dependsOn dependencies to the graph graphAddExplicitDeps(g) // Next, add the state orphans if we have any if opts.State != nil { graphAddOrphans(g, opts.Config, opts.State) } // Map the provider configurations to all of the resources graphAddProviderConfigs(g, opts.Config) // Setup the provisioners. These may have variable dependencies, // and must be done before dependency setup if err := graphMapResourceProvisioners(g, opts.Provisioners); err != nil { return nil, err } // Add all the variable dependencies graphAddVariableDeps(g) // Build the root so that we have a single valid root graphAddRoot(g) // If providers were given, lets associate the proper providers and // instantiate them. if len(opts.Providers) > 0 { // Add missing providers from the mapping if err := graphAddMissingResourceProviders(g, opts.Providers); err != nil { return nil, err } // Initialize all the providers if err := graphInitResourceProviders(g, opts.Providers); err != nil { return nil, err } // Map the providers to resources if err := graphMapResourceProviders(g); err != nil { return nil, err } } // If we have a diff, then make sure to add that in if opts.Diff != nil { if err := graphAddDiff(g, opts.Diff); err != nil { return nil, err } } // Validate if err := g.Validate(); err != nil { return nil, err } log.Printf( "[DEBUG] Graph created and valid. %d nouns.", len(g.Nouns)) return g, nil }