From 7d55179727fb53a7fde3476733e45ae1edb030ea Mon Sep 17 00:00:00 2001 From: ChrisMcKenzie Date: Fri, 9 Jun 2017 13:58:01 -0700 Subject: [PATCH] hcl: Removed edge object in favor of depends_on field in resource --- examples/graph0.hcl | 12 ++--- hcl/parse.go | 112 ++++++++++++++++++++------------------------ 2 files changed, 54 insertions(+), 70 deletions(-) diff --git a/examples/graph0.hcl b/examples/graph0.hcl index 2e25f6e4..a9152178 100644 --- a/examples/graph0.hcl +++ b/examples/graph0.hcl @@ -2,19 +2,13 @@ resource "file" "file1" { path = "/tmp/mgmt-hello-world" content = "hello, world" state = "exists" + depends_on = ["noop.noop1", "exec.sleep"] } resource "noop" "noop1" { test = "nil" } -edge "e1" { - from = { - kind = "noop" - name = "noop1" - } - to = { - kind = "file" - name = "file1" - } +resource "exec" "sleep" { + cmd = "sleep 10s" } diff --git a/hcl/parse.go b/hcl/parse.go index 1d005150..ece7c124 100644 --- a/hcl/parse.go +++ b/hcl/parse.go @@ -67,6 +67,7 @@ type Resource struct { Kind string resource resources.Res Meta resources.MetaParams + deps []*Edge } type key struct { @@ -188,20 +189,22 @@ func graphFromConfig(c *Config, data gapi.Data) (*pgraph.Graph, error) { } } - for _, e := range c.Edges { - if _, ok := lookup[key{strings.ToLower(e.From.Kind), e.From.Name}]; !ok { - return nil, fmt.Errorf("can't find 'from' name") + for _, r := range c.Resources { + for _, e := range r.deps { + if _, ok := lookup[key{strings.ToLower(e.From.Kind), e.From.Name}]; !ok { + return nil, fmt.Errorf("can't find 'from' name") + } + if _, ok := lookup[key{strings.ToLower(e.To.Kind), e.To.Name}]; !ok { + return nil, fmt.Errorf("can't find 'to' name") + } + from := lookup[key{strings.ToLower(e.From.Kind), e.From.Name}] + to := lookup[key{strings.ToLower(e.To.Kind), e.To.Name}] + edge := &resources.Edge{ + Name: e.Name, + Notify: e.Notify, + } + graph.AddEdge(from, to, edge) } - if _, ok := lookup[key{strings.ToLower(e.To.Kind), e.To.Name}]; !ok { - return nil, fmt.Errorf("can't find 'to' name") - } - from := lookup[key{strings.ToLower(e.From.Kind), e.From.Name}] - to := lookup[key{strings.ToLower(e.To.Kind), e.To.Name}] - edge := &resources.Edge{ - Name: e.Name, - Notify: e.Notify, - } - graph.AddEdge(from, to, edge) } return graph, nil @@ -212,13 +215,11 @@ func loadHcl(f *string) (*Config, error) { return nil, fmt.Errorf("empty file given") } - log.Printf("loading file %s", *f) data, err := ioutil.ReadFile(*f) if err != nil { return nil, fmt.Errorf("unable to read file: %v", err) } - log.Printf("parsing contents: %s", data) file, err := hcl.ParseBytes(data) if err != nil { return nil, fmt.Errorf("unable to parse file: %s", err) @@ -239,43 +240,9 @@ func loadHcl(f *string) (*Config, error) { } } - if edges := list.Filter("edge"); len(edges.Items) > 0 { - var err error - config.Edges, err = loadEdgesHcl(edges) - if err != nil { - return nil, fmt.Errorf("unable to parse: %s", err) - } - } - return config, nil } -func loadEdgesHcl(list *ast.ObjectList) ([]*Edge, error) { - list = list.Children() - if len(list.Items) == 0 { - return nil, nil - } - - var result []*Edge - - for _, item := range list.Items { - name := item.Keys[0].Token.Value().(string) - - var config Edge - if err := hcl.DecodeObject(&config, item.Val); err != nil { - return nil, fmt.Errorf( - "Error reading config for %s: %s", - name, - err) - } - - config.Name = name - - result = append(result, &config) - } - return result, nil -} - func loadResourcesHcl(list *ast.ObjectList) ([]*Resource, error) { list = list.Children() if len(list.Items) == 0 { @@ -284,7 +251,6 @@ func loadResourcesHcl(list *ast.ObjectList) ([]*Resource, error) { var result []*Resource - log.Printf("HCLParse: parsing %d items", len(list.Items)) for _, item := range list.Items { kind := item.Keys[0].Token.Value().(string) name := item.Keys[1].Token.Value().(string) @@ -296,6 +262,40 @@ func loadResourcesHcl(list *ast.ObjectList) ([]*Resource, error) { return nil, fmt.Errorf("module '%s': should be an object", name) } + var params = resources.DefaultMetaParams + if o := listVal.Filter("meta"); len(o.Items) > 0 { + err := hcl.DecodeObject(¶ms, o) + if err != nil { + return nil, fmt.Errorf( + "Error parsing meta for %s: %s", + name, + err) + } + } + + var deps []string + if edges := listVal.Filter("depends_on"); len(edges.Items) > 0 { + err := hcl.DecodeObject(&deps, edges.Items[0].Val) + if err != nil { + return nil, fmt.Errorf("unable to parse: %s", err) + } + } + + var edges []*Edge + for _, dep := range deps { + vertices := strings.Split(dep, ".") + edges = append(edges, &Edge{ + To: vertex{ + Kind: kind, + Name: name, + }, + From: vertex{ + Kind: vertices[0], + Name: vertices[1], + }, + }) + } + res, err := resources.NewResource(kind) if err != nil { log.Printf("HCLParse: unable to parse resource: %v", err) @@ -312,17 +312,6 @@ func loadResourcesHcl(list *ast.ObjectList) ([]*Resource, error) { err) } - var params = resources.DefaultMetaParams - if o := listVal.Filter("meta"); len(o.Items) > 0 { - err := hcl.DecodeObject(¶ms, o) - if err != nil { - return nil, fmt.Errorf( - "Error parsing meta for %s: %s", - name, - err) - } - } - meta := res.Meta() *meta = params @@ -330,6 +319,7 @@ func loadResourcesHcl(list *ast.ObjectList) ([]*Resource, error) { Name: name, Kind: kind, resource: res, + deps: edges, }) }