hcl: Removed edge object in favor of depends_on field in resource
This commit is contained in:
@@ -2,19 +2,13 @@ resource "file" "file1" {
|
|||||||
path = "/tmp/mgmt-hello-world"
|
path = "/tmp/mgmt-hello-world"
|
||||||
content = "hello, world"
|
content = "hello, world"
|
||||||
state = "exists"
|
state = "exists"
|
||||||
|
depends_on = ["noop.noop1", "exec.sleep"]
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "noop" "noop1" {
|
resource "noop" "noop1" {
|
||||||
test = "nil"
|
test = "nil"
|
||||||
}
|
}
|
||||||
|
|
||||||
edge "e1" {
|
resource "exec" "sleep" {
|
||||||
from = {
|
cmd = "sleep 10s"
|
||||||
kind = "noop"
|
|
||||||
name = "noop1"
|
|
||||||
}
|
|
||||||
to = {
|
|
||||||
kind = "file"
|
|
||||||
name = "file1"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
88
hcl/parse.go
88
hcl/parse.go
@@ -67,6 +67,7 @@ type Resource struct {
|
|||||||
Kind string
|
Kind string
|
||||||
resource resources.Res
|
resource resources.Res
|
||||||
Meta resources.MetaParams
|
Meta resources.MetaParams
|
||||||
|
deps []*Edge
|
||||||
}
|
}
|
||||||
|
|
||||||
type key struct {
|
type key struct {
|
||||||
@@ -188,7 +189,8 @@ func graphFromConfig(c *Config, data gapi.Data) (*pgraph.Graph, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, e := range c.Edges {
|
for _, r := range c.Resources {
|
||||||
|
for _, e := range r.deps {
|
||||||
if _, ok := lookup[key{strings.ToLower(e.From.Kind), e.From.Name}]; !ok {
|
if _, ok := lookup[key{strings.ToLower(e.From.Kind), e.From.Name}]; !ok {
|
||||||
return nil, fmt.Errorf("can't find 'from' name")
|
return nil, fmt.Errorf("can't find 'from' name")
|
||||||
}
|
}
|
||||||
@@ -203,6 +205,7 @@ func graphFromConfig(c *Config, data gapi.Data) (*pgraph.Graph, error) {
|
|||||||
}
|
}
|
||||||
graph.AddEdge(from, to, edge)
|
graph.AddEdge(from, to, edge)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return graph, nil
|
return graph, nil
|
||||||
}
|
}
|
||||||
@@ -212,13 +215,11 @@ func loadHcl(f *string) (*Config, error) {
|
|||||||
return nil, fmt.Errorf("empty file given")
|
return nil, fmt.Errorf("empty file given")
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Printf("loading file %s", *f)
|
|
||||||
data, err := ioutil.ReadFile(*f)
|
data, err := ioutil.ReadFile(*f)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("unable to read file: %v", err)
|
return nil, fmt.Errorf("unable to read file: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Printf("parsing contents: %s", data)
|
|
||||||
file, err := hcl.ParseBytes(data)
|
file, err := hcl.ParseBytes(data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("unable to parse file: %s", err)
|
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
|
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) {
|
func loadResourcesHcl(list *ast.ObjectList) ([]*Resource, error) {
|
||||||
list = list.Children()
|
list = list.Children()
|
||||||
if len(list.Items) == 0 {
|
if len(list.Items) == 0 {
|
||||||
@@ -284,7 +251,6 @@ func loadResourcesHcl(list *ast.ObjectList) ([]*Resource, error) {
|
|||||||
|
|
||||||
var result []*Resource
|
var result []*Resource
|
||||||
|
|
||||||
log.Printf("HCLParse: parsing %d items", len(list.Items))
|
|
||||||
for _, item := range list.Items {
|
for _, item := range list.Items {
|
||||||
kind := item.Keys[0].Token.Value().(string)
|
kind := item.Keys[0].Token.Value().(string)
|
||||||
name := item.Keys[1].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)
|
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)
|
res, err := resources.NewResource(kind)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("HCLParse: unable to parse resource: %v", err)
|
log.Printf("HCLParse: unable to parse resource: %v", err)
|
||||||
@@ -312,17 +312,6 @@ func loadResourcesHcl(list *ast.ObjectList) ([]*Resource, error) {
|
|||||||
err)
|
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 := res.Meta()
|
||||||
*meta = params
|
*meta = params
|
||||||
|
|
||||||
@@ -330,6 +319,7 @@ func loadResourcesHcl(list *ast.ObjectList) ([]*Resource, error) {
|
|||||||
Name: name,
|
Name: name,
|
||||||
Kind: kind,
|
Kind: kind,
|
||||||
resource: res,
|
resource: res,
|
||||||
|
deps: edges,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user