helper/resource: automatically validate resources
/cc @pearkes - So, just set a ConfigValidator struct up on your resources and it'll now automatically validate.
This commit is contained in:
parent
50b8e761f1
commit
0c812ba9e8
|
@ -13,6 +13,21 @@ type Map struct {
|
||||||
Mapping map[string]Resource
|
Mapping map[string]Resource
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *Map) Validate(
|
||||||
|
t string, c *terraform.ResourceConfig) ([]string, []error) {
|
||||||
|
r, ok := m.Mapping[t]
|
||||||
|
if !ok {
|
||||||
|
return nil, []error{fmt.Errorf("Unknown resource type: %s", t)}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If there is no validator set, then it is valid
|
||||||
|
if r.ConfigValidator == nil {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return r.ConfigValidator.Validate(c)
|
||||||
|
}
|
||||||
|
|
||||||
// Apply performs a create or update depending on the diff, and calls
|
// Apply performs a create or update depending on the diff, and calls
|
||||||
// the proper function on the matching Resource.
|
// the proper function on the matching Resource.
|
||||||
func (m *Map) Apply(
|
func (m *Map) Apply(
|
||||||
|
|
|
@ -4,6 +4,8 @@ import (
|
||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
tfconfig "github.com/hashicorp/terraform/config"
|
||||||
|
"github.com/hashicorp/terraform/helper/config"
|
||||||
"github.com/hashicorp/terraform/terraform"
|
"github.com/hashicorp/terraform/terraform"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -30,3 +32,50 @@ func TestMapResources(t *testing.T) {
|
||||||
t.Fatalf("bad: %#v", rts)
|
t.Fatalf("bad: %#v", rts)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMapValidate(t *testing.T) {
|
||||||
|
m := &Map{
|
||||||
|
Mapping: map[string]Resource{
|
||||||
|
"aws_elb": Resource{
|
||||||
|
ConfigValidator: &config.Validator{
|
||||||
|
Required: []string{"foo"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var c *terraform.ResourceConfig
|
||||||
|
var ws []string
|
||||||
|
var es []error
|
||||||
|
|
||||||
|
// Valid
|
||||||
|
c = testConfig(t, map[string]interface{}{"foo": "bar"})
|
||||||
|
ws, es = m.Validate("aws_elb", c)
|
||||||
|
if len(ws) > 0 {
|
||||||
|
t.Fatalf("bad: %#v", ws)
|
||||||
|
}
|
||||||
|
if len(es) > 0 {
|
||||||
|
t.Fatalf("bad: %#v", es)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Invalid
|
||||||
|
c = testConfig(t, map[string]interface{}{})
|
||||||
|
ws, es = m.Validate("aws_elb", c)
|
||||||
|
if len(ws) > 0 {
|
||||||
|
t.Fatalf("bad: %#v", ws)
|
||||||
|
}
|
||||||
|
if len(es) == 0 {
|
||||||
|
t.Fatalf("bad: %#v", es)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func testConfig(
|
||||||
|
t *testing.T,
|
||||||
|
c map[string]interface{}) *terraform.ResourceConfig {
|
||||||
|
r, err := tfconfig.NewRawConfig(c)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("bad: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return terraform.NewResourceConfig(r)
|
||||||
|
}
|
||||||
|
|
|
@ -1,15 +1,17 @@
|
||||||
package resource
|
package resource
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/hashicorp/terraform/helper/config"
|
||||||
"github.com/hashicorp/terraform/terraform"
|
"github.com/hashicorp/terraform/terraform"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Resource struct {
|
type Resource struct {
|
||||||
Create CreateFunc
|
ConfigValidator *config.Validator
|
||||||
Destroy DestroyFunc
|
Create CreateFunc
|
||||||
Diff DiffFunc
|
Destroy DestroyFunc
|
||||||
Refresh RefreshFunc
|
Diff DiffFunc
|
||||||
Update UpdateFunc
|
Refresh RefreshFunc
|
||||||
|
Update UpdateFunc
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateFunc is a function that creates a resource that didn't previously
|
// CreateFunc is a function that creates a resource that didn't previously
|
||||||
|
|
Loading…
Reference in New Issue