resources: Add NewNamedResource helper

This makes the common pattern of NewResource, SetName, easier. It also
makes it less likely for you to forget to use SetName.
This commit is contained in:
James Shubin
2017-06-17 17:32:52 -04:00
parent e341256627
commit 0dadf3d78a
8 changed files with 41 additions and 36 deletions

View File

@@ -57,15 +57,13 @@ func (obj *MyGAPI) Graph() (*pgraph.Graph, error) {
return nil, fmt.Errorf("libmgmt: MyGAPI is not initialized") return nil, fmt.Errorf("libmgmt: MyGAPI is not initialized")
} }
// TODO: this method of instantiation is deprecated, use: NewResource n1, err := resources.NewNamedResource("noop", "noop1")
n1 := &resources.NoopRes{ if err != nil {
BaseRes: resources.BaseRes{ return nil, err
Name: "noop1",
Kind: "noop",
MetaParams: resources.DefaultMetaParams,
},
} }
// NOTE: This is considered the legacy method to build graphs. Avoid
// importing the legacy `yamlgraph` lib if possible for custom graphs.
// we can still build a graph via the yaml method // we can still build a graph via the yaml method
gc := &yamlgraph.GraphConfig{ gc := &yamlgraph.GraphConfig{
Graph: obj.Name, Graph: obj.Name,
@@ -74,7 +72,7 @@ func (obj *MyGAPI) Graph() (*pgraph.Graph, error) {
Exec: []*resources.ExecRes{}, Exec: []*resources.ExecRes{},
File: []*resources.FileRes{}, File: []*resources.FileRes{},
Msg: []*resources.MsgRes{}, Msg: []*resources.MsgRes{},
Noop: []*resources.NoopRes{n1}, Noop: []*resources.NoopRes{n1.(*resources.NoopRes)},
Pkg: []*resources.PkgRes{}, Pkg: []*resources.PkgRes{},
Svc: []*resources.SvcRes{}, Svc: []*resources.SvcRes{},
Timer: []*resources.TimerRes{}, Timer: []*resources.TimerRes{},

View File

@@ -65,11 +65,10 @@ func (obj *MyGAPI) Graph() (*pgraph.Graph, error) {
} }
var vertex pgraph.Vertex var vertex pgraph.Vertex
for i := uint(0); i < obj.Count; i++ { for i := uint(0); i < obj.Count; i++ {
n, err := resources.NewResource("noop") n, err := resources.NewNamedResource("noop", fmt.Sprintf("noop%d", i))
if err != nil { if err != nil {
return nil, err return nil, err
} }
n.SetName(fmt.Sprintf("noop%d", i))
g.AddVertex(n) g.AddVertex(n)
if i > 0 { if i > 0 {
g.AddEdge(vertex, n, &resources.Edge{Name: fmt.Sprintf("e%d", i)}) g.AddEdge(vertex, n, &resources.Edge{Name: fmt.Sprintf("e%d", i)})

View File

@@ -357,14 +357,12 @@ func loadResourcesHcl(list *ast.ObjectList) ([]*Resource, error) {
} }
} }
res, err := resources.NewResource(kind) res, err := resources.NewNamedResource(kind, name)
if err != nil { if err != nil {
log.Printf("hcl: unable to parse resource: %v", err) log.Printf("hcl: unable to parse resource: %v", err)
return nil, err return nil, err
} }
res.SetName(name)
if err := hcl.DecodeObject(res, item.Val); err != nil { if err := hcl.DecodeObject(res, item.Val); err != nil {
log.Printf("hcl: unable to decode body: %v", err) log.Printf("hcl: unable to decode body: %v", err)
return nil, fmt.Errorf( return nil, fmt.Errorf(

View File

@@ -52,7 +52,8 @@ func RegisterResource(kind string, fn func() Res) {
registeredResources[kind] = fn registeredResources[kind] = fn
} }
// NewResource returns an empty resource object from a registered kind. // NewResource returns an empty resource object from a registered kind. It
// errors if the resource kind doesn't exist.
func NewResource(kind string) (Res, error) { func NewResource(kind string) (Res, error) {
fn, ok := registeredResources[kind] fn, ok := registeredResources[kind]
if !ok { if !ok {
@@ -64,6 +65,21 @@ func NewResource(kind string) (Res, error) {
return res, nil return res, nil
} }
// NewNamedResource returns an empty resource object from a registered kind. It
// also sets the name. It is a wrapper around NewResource. It also errors if the
// name is empty.
func NewNamedResource(kind, name string) (Res, error) {
if name == "" {
return nil, fmt.Errorf("resource name is empty")
}
res, err := NewResource(kind)
if err != nil {
return nil, err
}
res.SetName(name)
return res, nil
}
//go:generate stringer -type=ResState -output=resstate_stringer.go //go:generate stringer -type=ResState -output=resstate_stringer.go
// The ResState type represents the current activity state of each resource. // The ResState type represents the current activity state of each resource.

View File

@@ -44,18 +44,12 @@ func TestSort0(t *testing.T) {
} }
func TestSort1(t *testing.T) { func TestSort1(t *testing.T) {
r1, _ := NewResource("noop") r1, _ := NewNamedResource("noop", "noop1")
r1.SetName("noop1") r2, _ := NewNamedResource("noop", "noop2")
r2, _ := NewResource("noop") r3, _ := NewNamedResource("noop", "noop3")
r2.SetName("noop2") r4, _ := NewNamedResource("noop", "noop4")
r3, _ := NewResource("noop") r5, _ := NewNamedResource("noop", "noop5")
r3.SetName("noop3") r6, _ := NewNamedResource("noop", "noop6")
r4, _ := NewResource("noop")
r4.SetName("noop4")
r5, _ := NewResource("noop")
r5.SetName("noop5")
r6, _ := NewResource("noop")
r6.SetName("noop6")
rs := []Res{r3, r2, r6, r1, r5, r4} rs := []Res{r3, r2, r6, r1, r5, r4}
s := Sort(rs) s := Sort(rs)
@@ -124,7 +118,11 @@ func TestMiscEncodeDecode2(t *testing.T) {
var err error var err error
// encode // encode
input, _ := NewResource("file") input, err := NewNamedResource("file", "file1")
if err != nil {
t.Errorf("Can't create: %v", err)
return
}
b64, err := ResToB64(input) b64, err := ResToB64(input)
if err != nil { if err != nil {

View File

@@ -62,11 +62,10 @@ func (obj *MyGAPI) Graph() (*pgraph.Graph, error) {
return nil, err return nil, err
} }
n0, err := resources.NewResource("noop") n0, err := resources.NewNamedResource("noop", "noop1")
if err != nil { if err != nil {
return nil, err return nil, err
} }
n0.SetName("noop1")
g.AddVertex(n0) g.AddVertex(n0)
//g, err := config.NewGraphFromConfig(obj.data.Hostname, obj.data.World, obj.data.Noop) //g, err := config.NewGraphFromConfig(obj.data.Hostname, obj.data.World, obj.data.Noop)

View File

@@ -69,28 +69,25 @@ func (obj *MyGAPI) Graph() (*pgraph.Graph, error) {
} }
if !obj.flipflop { if !obj.flipflop {
n0, err := resources.NewResource("noop") n0, err := resources.NewNamedResource("noop", "noop0")
if err != nil { if err != nil {
return nil, err return nil, err
} }
n0.SetName("noop0")
g.AddVertex(n0) g.AddVertex(n0)
} else { } else {
// NOTE: these will get autogrouped // NOTE: these will get autogrouped
n1, err := resources.NewResource("noop") n1, err := resources.NewNamedResource("noop", "noop1")
if err != nil { if err != nil {
return nil, err return nil, err
} }
n1.SetName("noop1")
n1.Meta().AutoGroup = obj.autoGroup // enable or disable it n1.Meta().AutoGroup = obj.autoGroup // enable or disable it
g.AddVertex(n1) g.AddVertex(n1)
n2, err := resources.NewResource("noop") n2, err := resources.NewNamedResource("noop", "noop2")
if err != nil { if err != nil {
return nil, err return nil, err
} }
n2.SetName("noop2")
n2.Meta().AutoGroup = obj.autoGroup // enable or disable it n2.Meta().AutoGroup = obj.autoGroup // enable or disable it
g.AddVertex(n2) g.AddVertex(n2)
} }

View File

@@ -36,7 +36,7 @@ rmdir "$tmpdir" # cleanup
if [[ -n "$failures" ]]; then if [[ -n "$failures" ]]; then
echo 'FAIL' echo 'FAIL'
echo 'The following tests have failed:' echo "The following tests (in: ${linkto}) have failed:"
echo -e "$failures" echo -e "$failures"
exit 1 exit 1
fi fi