remove old test provider
This commit is contained in:
parent
e4c72015a3
commit
03d11f988e
|
@ -1,15 +0,0 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"github.com/hashicorp/terraform/internal/legacy/builtin/providers/test"
|
||||
"github.com/hashicorp/terraform/internal/legacy/terraform"
|
||||
"github.com/hashicorp/terraform/plugin"
|
||||
)
|
||||
|
||||
func main() {
|
||||
plugin.Serve(&plugin.ServeOpts{
|
||||
ProviderFunc: func() terraform.ResourceProvider {
|
||||
return test.Provider()
|
||||
},
|
||||
})
|
||||
}
|
|
@ -1,63 +0,0 @@
|
|||
package test
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/hashicorp/terraform/internal/legacy/helper/schema"
|
||||
)
|
||||
|
||||
func testDataSource() *schema.Resource {
|
||||
return &schema.Resource{
|
||||
Read: testDataSourceRead,
|
||||
|
||||
Schema: map[string]*schema.Schema{
|
||||
"list": {
|
||||
Type: schema.TypeList,
|
||||
Computed: true,
|
||||
Elem: &schema.Schema{Type: schema.TypeString},
|
||||
},
|
||||
|
||||
"input": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
},
|
||||
|
||||
"output": {
|
||||
Type: schema.TypeString,
|
||||
Computed: true,
|
||||
},
|
||||
// this attribute is computed, but never set by the provider
|
||||
"nil": {
|
||||
Type: schema.TypeString,
|
||||
Computed: true,
|
||||
},
|
||||
|
||||
"input_map": {
|
||||
Type: schema.TypeMap,
|
||||
Elem: &schema.Schema{Type: schema.TypeString},
|
||||
Optional: true,
|
||||
},
|
||||
"output_map": {
|
||||
Type: schema.TypeMap,
|
||||
Elem: &schema.Schema{Type: schema.TypeString},
|
||||
Computed: true,
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func testDataSourceRead(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId(time.Now().UTC().String())
|
||||
d.Set("list", []interface{}{"one", "two", "three"})
|
||||
|
||||
if input, hasInput := d.GetOk("input"); hasInput {
|
||||
d.Set("output", input)
|
||||
} else {
|
||||
d.Set("output", "some output")
|
||||
}
|
||||
|
||||
if inputMap, hasInput := d.GetOk("input_map"); hasInput {
|
||||
d.Set("output_map", inputMap)
|
||||
}
|
||||
return nil
|
||||
}
|
|
@ -1,25 +0,0 @@
|
|||
package test
|
||||
|
||||
import (
|
||||
"github.com/hashicorp/terraform/internal/legacy/helper/schema"
|
||||
)
|
||||
|
||||
func providerLabelDataSource() *schema.Resource {
|
||||
return &schema.Resource{
|
||||
Read: providerLabelDataSourceRead,
|
||||
|
||||
Schema: map[string]*schema.Schema{
|
||||
"label": {
|
||||
Type: schema.TypeString,
|
||||
Computed: true,
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func providerLabelDataSourceRead(d *schema.ResourceData, meta interface{}) error {
|
||||
label := meta.(string)
|
||||
d.SetId(label)
|
||||
d.Set("label", label)
|
||||
return nil
|
||||
}
|
|
@ -1,59 +0,0 @@
|
|||
package test
|
||||
|
||||
import (
|
||||
"github.com/hashicorp/terraform/internal/legacy/helper/schema"
|
||||
"github.com/hashicorp/terraform/internal/legacy/terraform"
|
||||
)
|
||||
|
||||
func Provider() terraform.ResourceProvider {
|
||||
return &schema.Provider{
|
||||
Schema: map[string]*schema.Schema{
|
||||
// Optional attribute to label a particular instance for a test
|
||||
// that has multiple instances of this provider, so that they
|
||||
// can be distinguished using the test_provider_label data source.
|
||||
"label": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
},
|
||||
},
|
||||
ProviderMetaSchema: map[string]*schema.Schema{
|
||||
// Optionally allow specifying information at a module-level
|
||||
"foo": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
},
|
||||
},
|
||||
ResourcesMap: map[string]*schema.Resource{
|
||||
"test_resource": testResource(),
|
||||
"test_resource_gh12183": testResourceGH12183(),
|
||||
"test_resource_with_custom_diff": testResourceCustomDiff(),
|
||||
"test_resource_timeout": testResourceTimeout(),
|
||||
"test_resource_diff_suppress": testResourceDiffSuppress(),
|
||||
"test_resource_force_new": testResourceForceNew(),
|
||||
"test_resource_nested": testResourceNested(),
|
||||
"test_resource_nested_set": testResourceNestedSet(),
|
||||
"test_resource_state_func": testResourceStateFunc(),
|
||||
"test_resource_deprecated": testResourceDeprecated(),
|
||||
"test_resource_defaults": testResourceDefaults(),
|
||||
"test_resource_list": testResourceList(),
|
||||
"test_resource_list_set": testResourceListSet(),
|
||||
"test_resource_map": testResourceMap(),
|
||||
"test_resource_computed_set": testResourceComputedSet(),
|
||||
"test_resource_config_mode": testResourceConfigMode(),
|
||||
"test_resource_nested_id": testResourceNestedId(),
|
||||
"test_resource_provider_meta": testResourceProviderMeta(),
|
||||
"test_resource_signal": testResourceSignal(),
|
||||
"test_undeleteable": testResourceUndeleteable(),
|
||||
"test_resource_required_min": testResourceRequiredMin(),
|
||||
},
|
||||
DataSourcesMap: map[string]*schema.Resource{
|
||||
"test_data_source": testDataSource(),
|
||||
"test_provider_label": providerLabelDataSource(),
|
||||
},
|
||||
ConfigureFunc: providerConfigure,
|
||||
}
|
||||
}
|
||||
|
||||
func providerConfigure(d *schema.ResourceData) (interface{}, error) {
|
||||
return d.Get("label"), nil
|
||||
}
|
|
@ -1,233 +0,0 @@
|
|||
package test
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/hashicorp/terraform/internal/legacy/helper/schema"
|
||||
)
|
||||
|
||||
func testResource() *schema.Resource {
|
||||
return &schema.Resource{
|
||||
Create: testResourceCreate,
|
||||
Read: testResourceRead,
|
||||
Update: testResourceUpdate,
|
||||
Delete: testResourceDelete,
|
||||
|
||||
Importer: &schema.ResourceImporter{
|
||||
State: schema.ImportStatePassthrough,
|
||||
},
|
||||
|
||||
CustomizeDiff: func(d *schema.ResourceDiff, _ interface{}) error {
|
||||
if d.HasChange("optional") {
|
||||
d.SetNewComputed("planned_computed")
|
||||
}
|
||||
return nil
|
||||
},
|
||||
|
||||
Schema: map[string]*schema.Schema{
|
||||
"required": {
|
||||
Type: schema.TypeString,
|
||||
Required: true,
|
||||
},
|
||||
"optional": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
},
|
||||
"optional_bool": {
|
||||
Type: schema.TypeBool,
|
||||
Optional: true,
|
||||
},
|
||||
"optional_force_new": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
ForceNew: true,
|
||||
},
|
||||
"optional_computed_map": {
|
||||
Type: schema.TypeMap,
|
||||
Optional: true,
|
||||
Computed: true,
|
||||
},
|
||||
"optional_computed_force_new": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
Computed: true,
|
||||
ForceNew: true,
|
||||
},
|
||||
"optional_computed": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
Computed: true,
|
||||
},
|
||||
"computed_read_only": {
|
||||
Type: schema.TypeString,
|
||||
Computed: true,
|
||||
},
|
||||
"computed_from_required": {
|
||||
Type: schema.TypeString,
|
||||
Computed: true,
|
||||
ForceNew: true,
|
||||
},
|
||||
"computed_read_only_force_new": {
|
||||
Type: schema.TypeString,
|
||||
Computed: true,
|
||||
ForceNew: true,
|
||||
},
|
||||
"computed_list": {
|
||||
Type: schema.TypeList,
|
||||
Computed: true,
|
||||
Elem: &schema.Schema{
|
||||
Type: schema.TypeString,
|
||||
},
|
||||
},
|
||||
"set": {
|
||||
Type: schema.TypeSet,
|
||||
Optional: true,
|
||||
Elem: &schema.Schema{
|
||||
Type: schema.TypeString,
|
||||
},
|
||||
Set: schema.HashString,
|
||||
},
|
||||
"computed_set": {
|
||||
Type: schema.TypeSet,
|
||||
Computed: true,
|
||||
Elem: &schema.Schema{
|
||||
Type: schema.TypeString,
|
||||
},
|
||||
Set: schema.HashString,
|
||||
},
|
||||
"map": {
|
||||
Type: schema.TypeMap,
|
||||
Optional: true,
|
||||
},
|
||||
"optional_map": {
|
||||
Type: schema.TypeMap,
|
||||
Optional: true,
|
||||
},
|
||||
"required_map": {
|
||||
Type: schema.TypeMap,
|
||||
Required: true,
|
||||
},
|
||||
"map_that_look_like_set": {
|
||||
Type: schema.TypeMap,
|
||||
Optional: true,
|
||||
Elem: &schema.Schema{
|
||||
Type: schema.TypeString,
|
||||
},
|
||||
},
|
||||
"computed_map": {
|
||||
Type: schema.TypeMap,
|
||||
Computed: true,
|
||||
},
|
||||
"list": {
|
||||
Type: schema.TypeList,
|
||||
Optional: true,
|
||||
Elem: &schema.Schema{
|
||||
Type: schema.TypeString,
|
||||
},
|
||||
},
|
||||
"list_of_map": {
|
||||
Type: schema.TypeList,
|
||||
Optional: true,
|
||||
Elem: &schema.Schema{
|
||||
Type: schema.TypeMap,
|
||||
Elem: &schema.Schema{
|
||||
Type: schema.TypeString,
|
||||
},
|
||||
},
|
||||
},
|
||||
"apply_error": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
Description: "return and error during apply",
|
||||
},
|
||||
"planned_computed": {
|
||||
Type: schema.TypeString,
|
||||
Computed: true,
|
||||
Description: "copied the required field during apply, and plans computed when changed",
|
||||
},
|
||||
// this should return unset from GetOkExists
|
||||
"get_ok_exists_false": {
|
||||
Type: schema.TypeBool,
|
||||
Computed: true,
|
||||
Optional: true,
|
||||
Description: "do not set in config",
|
||||
},
|
||||
"int": {
|
||||
Type: schema.TypeInt,
|
||||
Optional: true,
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func testResourceCreate(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("testId")
|
||||
|
||||
errMsg, _ := d.Get("apply_error").(string)
|
||||
if errMsg != "" {
|
||||
return errors.New(errMsg)
|
||||
}
|
||||
|
||||
// Required must make it through to Create
|
||||
if _, ok := d.GetOk("required"); !ok {
|
||||
return fmt.Errorf("Missing attribute 'required', but it's required!")
|
||||
}
|
||||
if _, ok := d.GetOk("required_map"); !ok {
|
||||
return fmt.Errorf("Missing attribute 'required_map', but it's required!")
|
||||
}
|
||||
|
||||
d.Set("computed_from_required", d.Get("required"))
|
||||
|
||||
return testResourceRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceRead(d *schema.ResourceData, meta interface{}) error {
|
||||
d.Set("computed_read_only", "value_from_api")
|
||||
d.Set("computed_read_only_force_new", "value_from_api")
|
||||
if _, ok := d.GetOk("optional_computed_map"); !ok {
|
||||
d.Set("optional_computed_map", map[string]string{})
|
||||
}
|
||||
d.Set("computed_map", map[string]string{"key1": "value1"})
|
||||
d.Set("computed_list", []string{"listval1", "listval2"})
|
||||
d.Set("computed_set", []string{"setval1", "setval2"})
|
||||
|
||||
d.Set("planned_computed", d.Get("optional"))
|
||||
|
||||
// if there is no "set" value, erroneously set it to an empty set. This
|
||||
// might change a null value to an empty set, but we should be able to
|
||||
// ignore that.
|
||||
s := d.Get("set")
|
||||
if s == nil || s.(*schema.Set).Len() == 0 {
|
||||
d.Set("set", []interface{}{})
|
||||
}
|
||||
|
||||
// This mimics many providers always setting a *string value.
|
||||
// The existing behavior is that this will appear in the state as an empty
|
||||
// string, which we have to maintain.
|
||||
o := d.Get("optional")
|
||||
if o == "" {
|
||||
d.Set("optional", nil)
|
||||
}
|
||||
|
||||
// This should not show as set unless it's set in the config
|
||||
_, ok := d.GetOkExists("get_ok_exists_false")
|
||||
if ok {
|
||||
return errors.New("get_ok_exists_false should not be set")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceUpdate(d *schema.ResourceData, meta interface{}) error {
|
||||
errMsg, _ := d.Get("apply_error").(string)
|
||||
if errMsg != "" {
|
||||
return errors.New(errMsg)
|
||||
}
|
||||
return testResourceRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceDelete(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("")
|
||||
return nil
|
||||
}
|
|
@ -1,123 +0,0 @@
|
|||
package test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"strings"
|
||||
|
||||
"github.com/hashicorp/terraform/helper/hashcode"
|
||||
"github.com/hashicorp/terraform/internal/legacy/helper/schema"
|
||||
)
|
||||
|
||||
func testResourceComputedSet() *schema.Resource {
|
||||
return &schema.Resource{
|
||||
Create: testResourceComputedSetCreate,
|
||||
Read: testResourceComputedSetRead,
|
||||
Delete: testResourceComputedSetDelete,
|
||||
Update: testResourceComputedSetUpdate,
|
||||
|
||||
CustomizeDiff: func(d *schema.ResourceDiff, _ interface{}) error {
|
||||
o, n := d.GetChange("set_count")
|
||||
if o != n {
|
||||
d.SetNewComputed("string_set")
|
||||
}
|
||||
return nil
|
||||
},
|
||||
|
||||
Importer: &schema.ResourceImporter{
|
||||
State: schema.ImportStatePassthrough,
|
||||
},
|
||||
|
||||
Schema: map[string]*schema.Schema{
|
||||
"set_count": {
|
||||
Type: schema.TypeInt,
|
||||
Optional: true,
|
||||
},
|
||||
"string_set": {
|
||||
Type: schema.TypeSet,
|
||||
Computed: true,
|
||||
Elem: &schema.Schema{
|
||||
Type: schema.TypeString,
|
||||
},
|
||||
Set: schema.HashString,
|
||||
},
|
||||
|
||||
"rule": {
|
||||
Type: schema.TypeSet,
|
||||
Optional: true,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"id": {
|
||||
Type: schema.TypeString,
|
||||
Computed: true,
|
||||
},
|
||||
|
||||
"ip_protocol": {
|
||||
Type: schema.TypeString,
|
||||
Required: true,
|
||||
ForceNew: false,
|
||||
},
|
||||
|
||||
"cidr": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
ForceNew: false,
|
||||
StateFunc: func(v interface{}) string {
|
||||
return strings.ToLower(v.(string))
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"optional_set": {
|
||||
Type: schema.TypeSet,
|
||||
Optional: true,
|
||||
Elem: &schema.Schema{Type: schema.TypeString},
|
||||
Set: schema.HashString,
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func computeSecGroupV2RuleHash(v interface{}) int {
|
||||
var buf bytes.Buffer
|
||||
m := v.(map[string]interface{})
|
||||
buf.WriteString(fmt.Sprintf("%s-", m["ip_protocol"].(string)))
|
||||
buf.WriteString(fmt.Sprintf("%s-", strings.ToLower(m["cidr"].(string))))
|
||||
|
||||
return hashcode.String(buf.String())
|
||||
}
|
||||
|
||||
func testResourceComputedSetCreate(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId(fmt.Sprintf("%x", rand.Int63()))
|
||||
return testResourceComputedSetRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceComputedSetRead(d *schema.ResourceData, meta interface{}) error {
|
||||
count := 3
|
||||
v, ok := d.GetOk("set_count")
|
||||
if ok {
|
||||
count = v.(int)
|
||||
}
|
||||
|
||||
var set []interface{}
|
||||
for i := 0; i < count; i++ {
|
||||
set = append(set, fmt.Sprintf("%d", i))
|
||||
}
|
||||
|
||||
d.Set("string_set", schema.NewSet(schema.HashString, set))
|
||||
|
||||
// This isn't computed, but we should be able to ignore without issues.
|
||||
d.Set("optional_set", []interface{}{})
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceComputedSetUpdate(d *schema.ResourceData, meta interface{}) error {
|
||||
return testResourceComputedSetRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceComputedSetDelete(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("")
|
||||
return nil
|
||||
}
|
|
@ -1,78 +0,0 @@
|
|||
package test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/hashicorp/terraform/internal/legacy/helper/schema"
|
||||
)
|
||||
|
||||
func testResourceConfigMode() *schema.Resource {
|
||||
return &schema.Resource{
|
||||
Create: testResourceConfigModeCreate,
|
||||
Read: testResourceConfigModeRead,
|
||||
Delete: testResourceConfigModeDelete,
|
||||
Update: testResourceConfigModeUpdate,
|
||||
|
||||
Schema: map[string]*schema.Schema{
|
||||
"resource_as_attr": {
|
||||
Type: schema.TypeList,
|
||||
ConfigMode: schema.SchemaConfigModeAttr,
|
||||
Optional: true,
|
||||
Computed: true,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"foo": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"nested_set": {
|
||||
Type: schema.TypeSet,
|
||||
Optional: true,
|
||||
ConfigMode: schema.SchemaConfigModeAttr,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"value": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
},
|
||||
"set": {
|
||||
Type: schema.TypeSet,
|
||||
Optional: true,
|
||||
Elem: &schema.Schema{Type: schema.TypeString},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func testResourceConfigModeCreate(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("placeholder")
|
||||
return testResourceConfigModeRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceConfigModeRead(d *schema.ResourceData, meta interface{}) error {
|
||||
if l, ok := d.Get("resource_as_attr").([]interface{}); !ok {
|
||||
return fmt.Errorf("resource_as_attr should appear as []interface{}, not %T", l)
|
||||
} else {
|
||||
for i, item := range l {
|
||||
if _, ok := item.(map[string]interface{}); !ok {
|
||||
return fmt.Errorf("resource_as_attr[%d] should appear as map[string]interface{}, not %T", i, item)
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceConfigModeUpdate(d *schema.ResourceData, meta interface{}) error {
|
||||
return testResourceConfigModeRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceConfigModeDelete(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("")
|
||||
return nil
|
||||
}
|
|
@ -1,70 +0,0 @@
|
|||
package test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
|
||||
"github.com/hashicorp/terraform/internal/legacy/helper/schema"
|
||||
)
|
||||
|
||||
func testResourceDefaults() *schema.Resource {
|
||||
return &schema.Resource{
|
||||
Create: testResourceDefaultsCreate,
|
||||
Read: testResourceDefaultsRead,
|
||||
Delete: testResourceDefaultsDelete,
|
||||
Update: testResourceDefaultsUpdate,
|
||||
|
||||
Importer: &schema.ResourceImporter{
|
||||
State: schema.ImportStatePassthrough,
|
||||
},
|
||||
|
||||
Schema: map[string]*schema.Schema{
|
||||
"default_string": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
Default: "default string",
|
||||
},
|
||||
"default_bool": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
Default: true,
|
||||
},
|
||||
"nested": {
|
||||
Type: schema.TypeSet,
|
||||
Optional: true,
|
||||
ForceNew: true,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"string": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
Default: "default nested",
|
||||
},
|
||||
"optional": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func testResourceDefaultsCreate(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId(fmt.Sprintf("%x", rand.Int63()))
|
||||
return testResourceDefaultsRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceDefaultsUpdate(d *schema.ResourceData, meta interface{}) error {
|
||||
return testResourceDefaultsRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceDefaultsRead(d *schema.ResourceData, meta interface{}) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceDefaultsDelete(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("")
|
||||
return nil
|
||||
}
|
|
@ -1,119 +0,0 @@
|
|||
package test
|
||||
|
||||
import (
|
||||
"github.com/hashicorp/terraform/internal/legacy/helper/schema"
|
||||
)
|
||||
|
||||
func testResourceDeprecated() *schema.Resource {
|
||||
return &schema.Resource{
|
||||
Create: testResourceDeprecatedCreate,
|
||||
Read: testResourceDeprecatedRead,
|
||||
Update: testResourceDeprecatedUpdate,
|
||||
Delete: testResourceDeprecatedDelete,
|
||||
|
||||
Schema: map[string]*schema.Schema{
|
||||
"map_deprecated": {
|
||||
Type: schema.TypeMap,
|
||||
Optional: true,
|
||||
Deprecated: "deprecated",
|
||||
},
|
||||
"map_removed": {
|
||||
Type: schema.TypeMap,
|
||||
Optional: true,
|
||||
Removed: "removed",
|
||||
},
|
||||
"set_block_deprecated": {
|
||||
Type: schema.TypeSet,
|
||||
Optional: true,
|
||||
MaxItems: 1,
|
||||
Deprecated: "deprecated",
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"value": {
|
||||
Type: schema.TypeString,
|
||||
Required: true,
|
||||
Deprecated: "deprecated",
|
||||
},
|
||||
"optional": {
|
||||
Type: schema.TypeString,
|
||||
ForceNew: true,
|
||||
Optional: true,
|
||||
Deprecated: "deprecated",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"set_block_removed": {
|
||||
Type: schema.TypeSet,
|
||||
Optional: true,
|
||||
MaxItems: 1,
|
||||
Removed: "Removed",
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"optional": {
|
||||
Type: schema.TypeString,
|
||||
ForceNew: true,
|
||||
Optional: true,
|
||||
Computed: true,
|
||||
Removed: "removed",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"list_block_deprecated": {
|
||||
Type: schema.TypeList,
|
||||
Optional: true,
|
||||
Deprecated: "deprecated",
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"value": {
|
||||
Type: schema.TypeString,
|
||||
Required: true,
|
||||
Deprecated: "deprecated",
|
||||
},
|
||||
"optional": {
|
||||
Type: schema.TypeString,
|
||||
ForceNew: true,
|
||||
Optional: true,
|
||||
Deprecated: "deprecated",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"list_block_removed": {
|
||||
Type: schema.TypeList,
|
||||
Optional: true,
|
||||
Removed: "removed",
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"optional": {
|
||||
Type: schema.TypeString,
|
||||
ForceNew: true,
|
||||
Optional: true,
|
||||
Removed: "removed",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func testResourceDeprecatedCreate(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("testId")
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceDeprecatedRead(d *schema.ResourceData, meta interface{}) error {
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceDeprecatedUpdate(d *schema.ResourceData, meta interface{}) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceDeprecatedDelete(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("")
|
||||
return nil
|
||||
}
|
|
@ -1,104 +0,0 @@
|
|||
package test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"strings"
|
||||
|
||||
"github.com/hashicorp/terraform/internal/legacy/helper/schema"
|
||||
)
|
||||
|
||||
func testResourceDiffSuppress() *schema.Resource {
|
||||
diffSuppress := func(k, old, new string, d *schema.ResourceData) bool {
|
||||
if old == "" || strings.Contains(new, "replace") {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
return &schema.Resource{
|
||||
Create: testResourceDiffSuppressCreate,
|
||||
Read: testResourceDiffSuppressRead,
|
||||
Delete: testResourceDiffSuppressDelete,
|
||||
Update: testResourceDiffSuppressUpdate,
|
||||
|
||||
Importer: &schema.ResourceImporter{
|
||||
State: schema.ImportStatePassthrough,
|
||||
},
|
||||
|
||||
Schema: map[string]*schema.Schema{
|
||||
"optional": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
},
|
||||
"val_to_upper": {
|
||||
Type: schema.TypeString,
|
||||
Required: true,
|
||||
ForceNew: true,
|
||||
StateFunc: func(val interface{}) string {
|
||||
return strings.ToUpper(val.(string))
|
||||
},
|
||||
DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool {
|
||||
return strings.ToUpper(old) == strings.ToUpper(new)
|
||||
},
|
||||
},
|
||||
"network": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
Default: "default",
|
||||
ForceNew: true,
|
||||
DiffSuppressFunc: diffSuppress,
|
||||
},
|
||||
"subnetwork": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
Computed: true,
|
||||
ForceNew: true,
|
||||
DiffSuppressFunc: diffSuppress,
|
||||
},
|
||||
|
||||
"node_pool": {
|
||||
Type: schema.TypeList,
|
||||
Optional: true,
|
||||
Computed: true,
|
||||
ForceNew: true,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"name": &schema.Schema{
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
Computed: true,
|
||||
ForceNew: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func testResourceDiffSuppressCreate(d *schema.ResourceData, meta interface{}) error {
|
||||
d.Set("network", "modified")
|
||||
d.Set("subnetwork", "modified")
|
||||
|
||||
if _, ok := d.GetOk("node_pool"); !ok {
|
||||
d.Set("node_pool", []string{})
|
||||
}
|
||||
|
||||
id := fmt.Sprintf("%x", rand.Int63())
|
||||
d.SetId(id)
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceDiffSuppressRead(d *schema.ResourceData, meta interface{}) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceDiffSuppressUpdate(d *schema.ResourceData, meta interface{}) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceDiffSuppressDelete(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("")
|
||||
return nil
|
||||
}
|
|
@ -1,39 +0,0 @@
|
|||
package test
|
||||
|
||||
import (
|
||||
"github.com/hashicorp/terraform/internal/legacy/helper/schema"
|
||||
)
|
||||
|
||||
func testResourceForceNew() *schema.Resource {
|
||||
return &schema.Resource{
|
||||
Create: testResourceForceNewCreate,
|
||||
Read: testResourceForceNewRead,
|
||||
Delete: testResourceForceNewDelete,
|
||||
|
||||
Importer: &schema.ResourceImporter{
|
||||
State: schema.ImportStatePassthrough,
|
||||
},
|
||||
|
||||
Schema: map[string]*schema.Schema{
|
||||
"triggers": {
|
||||
Type: schema.TypeMap,
|
||||
Optional: true,
|
||||
ForceNew: true,
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func testResourceForceNewCreate(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("testId")
|
||||
return testResourceForceNewRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceForceNewRead(d *schema.ResourceData, meta interface{}) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceForceNewDelete(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("")
|
||||
return nil
|
||||
}
|
|
@ -1,64 +0,0 @@
|
|||
package test
|
||||
|
||||
import (
|
||||
"github.com/hashicorp/terraform/internal/legacy/helper/schema"
|
||||
)
|
||||
|
||||
// This is a test resource to help reproduce GH-12183. This issue came up
|
||||
// as a complex mixing of core + helper/schema and while we added core tests
|
||||
// to cover some of the cases, this test helps top it off with an end-to-end
|
||||
// test.
|
||||
func testResourceGH12183() *schema.Resource {
|
||||
return &schema.Resource{
|
||||
Create: testResourceCreate_gh12183,
|
||||
Read: testResourceRead_gh12183,
|
||||
Update: testResourceUpdate_gh12183,
|
||||
Delete: testResourceDelete_gh12183,
|
||||
Schema: map[string]*schema.Schema{
|
||||
"key": &schema.Schema{
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
},
|
||||
|
||||
"config": &schema.Schema{
|
||||
Type: schema.TypeList,
|
||||
Optional: true,
|
||||
ForceNew: true,
|
||||
MinItems: 1,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"name": {
|
||||
Type: schema.TypeString,
|
||||
Required: true,
|
||||
},
|
||||
|
||||
"rules": {
|
||||
Type: schema.TypeSet,
|
||||
Computed: true,
|
||||
Elem: &schema.Schema{Type: schema.TypeString},
|
||||
Set: schema.HashString,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func testResourceCreate_gh12183(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("testId")
|
||||
return testResourceRead_gh12183(d, meta)
|
||||
}
|
||||
|
||||
func testResourceRead_gh12183(d *schema.ResourceData, meta interface{}) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceUpdate_gh12183(d *schema.ResourceData, meta interface{}) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceDelete_gh12183(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("")
|
||||
return nil
|
||||
}
|
|
@ -1,192 +0,0 @@
|
|||
package test
|
||||
|
||||
import (
|
||||
"github.com/hashicorp/terraform/internal/legacy/helper/schema"
|
||||
)
|
||||
|
||||
func testResourceList() *schema.Resource {
|
||||
return &schema.Resource{
|
||||
Create: testResourceListCreate,
|
||||
Read: testResourceListRead,
|
||||
Update: testResourceListUpdate,
|
||||
Delete: testResourceListDelete,
|
||||
|
||||
CustomizeDiff: func(d *schema.ResourceDiff, _ interface{}) error {
|
||||
if d.HasChange("dependent_list") {
|
||||
d.SetNewComputed("computed_list")
|
||||
}
|
||||
return nil
|
||||
},
|
||||
|
||||
Schema: map[string]*schema.Schema{
|
||||
"list_block": {
|
||||
Type: schema.TypeList,
|
||||
Optional: true,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"string": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
},
|
||||
"int": {
|
||||
Type: schema.TypeInt,
|
||||
Optional: true,
|
||||
},
|
||||
"force_new": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
ForceNew: true,
|
||||
},
|
||||
"sublist": {
|
||||
Type: schema.TypeList,
|
||||
Optional: true,
|
||||
Elem: &schema.Schema{
|
||||
Type: schema.TypeString,
|
||||
},
|
||||
},
|
||||
"sublist_block": {
|
||||
Type: schema.TypeList,
|
||||
Optional: true,
|
||||
Computed: true,
|
||||
ForceNew: true,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"string": {
|
||||
Type: schema.TypeString,
|
||||
Required: true,
|
||||
},
|
||||
"int": {
|
||||
Type: schema.TypeInt,
|
||||
Required: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"sublist_block_optional": {
|
||||
Type: schema.TypeList,
|
||||
Optional: true,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"list": {
|
||||
Type: schema.TypeList,
|
||||
Optional: true,
|
||||
Elem: &schema.Schema{Type: schema.TypeString},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"dependent_list": {
|
||||
Type: schema.TypeList,
|
||||
Optional: true,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"val": {
|
||||
Type: schema.TypeString,
|
||||
Required: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"computed_list": {
|
||||
Type: schema.TypeList,
|
||||
Computed: true,
|
||||
Elem: &schema.Schema{Type: schema.TypeString},
|
||||
},
|
||||
"min_items": {
|
||||
Type: schema.TypeList,
|
||||
Optional: true,
|
||||
MinItems: 2,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"val": {
|
||||
Type: schema.TypeString,
|
||||
Required: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"never_set": {
|
||||
Type: schema.TypeList,
|
||||
MaxItems: 1,
|
||||
Optional: true,
|
||||
Computed: true,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"sublist": {
|
||||
Type: schema.TypeList,
|
||||
MaxItems: 1,
|
||||
ForceNew: true,
|
||||
Optional: true,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"bool": {
|
||||
Type: schema.TypeBool,
|
||||
ForceNew: true,
|
||||
Required: true,
|
||||
},
|
||||
"string": {
|
||||
Type: schema.TypeString,
|
||||
Computed: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"map_list": {
|
||||
Type: schema.TypeList,
|
||||
Optional: true,
|
||||
Elem: &schema.Schema{Type: schema.TypeMap},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func testResourceListCreate(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("testId")
|
||||
return testResourceListRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceListRead(d *schema.ResourceData, meta interface{}) error {
|
||||
fixedIps := d.Get("dependent_list")
|
||||
|
||||
// all_fixed_ips should be set as computed with a CustomizeDiff func, but
|
||||
// we're trying to emulate legacy provider behavior, and updating a
|
||||
// computed field was a common case.
|
||||
ips := []interface{}{}
|
||||
if fixedIps != nil {
|
||||
for _, v := range fixedIps.([]interface{}) {
|
||||
m := v.(map[string]interface{})
|
||||
ips = append(ips, m["val"])
|
||||
}
|
||||
}
|
||||
if err := d.Set("computed_list", ips); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// "computing" these values should insert empty containers into the
|
||||
// never_set block.
|
||||
values := make(map[string]interface{})
|
||||
values["sublist"] = []interface{}{}
|
||||
d.Set("never_set", []interface{}{values})
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceListUpdate(d *schema.ResourceData, meta interface{}) error {
|
||||
block := d.Get("never_set").([]interface{})
|
||||
if len(block) > 0 {
|
||||
// if profiles contains any values, they should not be nil
|
||||
_ = block[0].(map[string]interface{})
|
||||
}
|
||||
return testResourceListRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceListDelete(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("")
|
||||
return nil
|
||||
}
|
|
@ -1,192 +0,0 @@
|
|||
package test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
|
||||
"github.com/hashicorp/terraform/internal/legacy/helper/schema"
|
||||
)
|
||||
|
||||
func testResourceListSet() *schema.Resource {
|
||||
return &schema.Resource{
|
||||
Create: testResourceListSetCreate,
|
||||
Read: testResourceListSetRead,
|
||||
Delete: testResourceListSetDelete,
|
||||
Update: testResourceListSetUpdate,
|
||||
|
||||
Importer: &schema.ResourceImporter{
|
||||
State: schema.ImportStatePassthrough,
|
||||
},
|
||||
|
||||
Schema: map[string]*schema.Schema{
|
||||
"list": {
|
||||
Type: schema.TypeList,
|
||||
Optional: true,
|
||||
MaxItems: 1,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"set": {
|
||||
Type: schema.TypeSet,
|
||||
Optional: true,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"elem": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
DiffSuppressFunc: func(_, o, n string, _ *schema.ResourceData) bool {
|
||||
return o == n
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
Set: func(v interface{}) int {
|
||||
raw := v.(map[string]interface{})
|
||||
if el, ok := raw["elem"]; ok {
|
||||
return schema.HashString(el)
|
||||
}
|
||||
return 42
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"replication_configuration": {
|
||||
Type: schema.TypeList,
|
||||
Optional: true,
|
||||
MaxItems: 1,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"role": {
|
||||
Type: schema.TypeString,
|
||||
Required: true,
|
||||
},
|
||||
"rules": {
|
||||
Type: schema.TypeSet,
|
||||
Required: true,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"id": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
},
|
||||
"destination": {
|
||||
Type: schema.TypeSet,
|
||||
MaxItems: 1,
|
||||
MinItems: 1,
|
||||
Required: true,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"account_id": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
},
|
||||
"bucket": {
|
||||
Type: schema.TypeString,
|
||||
Required: true,
|
||||
},
|
||||
"storage_class": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
},
|
||||
"replica_kms_key_id": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
},
|
||||
"access_control_translation": {
|
||||
Type: schema.TypeList,
|
||||
Optional: true,
|
||||
MinItems: 1,
|
||||
MaxItems: 1,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"owner": {
|
||||
Type: schema.TypeString,
|
||||
Required: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"source_selection_criteria": {
|
||||
Type: schema.TypeSet,
|
||||
Optional: true,
|
||||
MinItems: 1,
|
||||
MaxItems: 1,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"sse_kms_encrypted_objects": {
|
||||
Type: schema.TypeSet,
|
||||
Optional: true,
|
||||
MinItems: 1,
|
||||
MaxItems: 1,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"enabled": {
|
||||
Type: schema.TypeBool,
|
||||
Required: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"prefix": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
},
|
||||
"status": {
|
||||
Type: schema.TypeString,
|
||||
Required: true,
|
||||
},
|
||||
"priority": {
|
||||
Type: schema.TypeInt,
|
||||
Optional: true,
|
||||
},
|
||||
"filter": {
|
||||
Type: schema.TypeList,
|
||||
Optional: true,
|
||||
MinItems: 1,
|
||||
MaxItems: 1,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"prefix": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
},
|
||||
"tags": {
|
||||
Type: schema.TypeMap,
|
||||
Optional: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func testResourceListSetCreate(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId(fmt.Sprintf("%x", rand.Int63()))
|
||||
return testResourceListSetRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceListSetUpdate(d *schema.ResourceData, meta interface{}) error {
|
||||
return testResourceListSetRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceListSetRead(d *schema.ResourceData, meta interface{}) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceListSetDelete(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("")
|
||||
return nil
|
||||
}
|
|
@ -1,77 +0,0 @@
|
|||
package test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/hashicorp/terraform/configs/hcl2shim"
|
||||
"github.com/hashicorp/terraform/internal/legacy/helper/schema"
|
||||
)
|
||||
|
||||
func testResourceMap() *schema.Resource {
|
||||
return &schema.Resource{
|
||||
Create: testResourceMapCreate,
|
||||
Read: testResourceMapRead,
|
||||
Update: testResourceMapUpdate,
|
||||
Delete: testResourceMapDelete,
|
||||
|
||||
Schema: map[string]*schema.Schema{
|
||||
"name": {
|
||||
Type: schema.TypeString,
|
||||
Required: true,
|
||||
},
|
||||
"map_of_three": {
|
||||
Type: schema.TypeMap,
|
||||
Optional: true,
|
||||
Elem: &schema.Schema{Type: schema.TypeString},
|
||||
ValidateFunc: func(v interface{}, _ string) ([]string, []error) {
|
||||
errs := []error{}
|
||||
for k, v := range v.(map[string]interface{}) {
|
||||
if v == hcl2shim.UnknownVariableValue {
|
||||
errs = append(errs, fmt.Errorf("unknown value in ValidateFunc: %q=%q", k, v))
|
||||
}
|
||||
}
|
||||
return nil, errs
|
||||
},
|
||||
},
|
||||
"map_values": {
|
||||
Type: schema.TypeMap,
|
||||
Optional: true,
|
||||
Elem: &schema.Schema{Type: schema.TypeString},
|
||||
},
|
||||
"computed_map": {
|
||||
Type: schema.TypeMap,
|
||||
Computed: true,
|
||||
Elem: &schema.Schema{Type: schema.TypeString},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func testResourceMapCreate(d *schema.ResourceData, meta interface{}) error {
|
||||
// make sure all elements are passed to the map
|
||||
m := d.Get("map_of_three").(map[string]interface{})
|
||||
if len(m) != 3 {
|
||||
return fmt.Errorf("expected 3 map values, got %#v\n", m)
|
||||
}
|
||||
|
||||
d.SetId("testId")
|
||||
return testResourceMapRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceMapRead(d *schema.ResourceData, meta interface{}) error {
|
||||
var computedMap map[string]interface{}
|
||||
if v, ok := d.GetOk("map_values"); ok {
|
||||
computedMap = v.(map[string]interface{})
|
||||
}
|
||||
d.Set("computed_map", computedMap)
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceMapUpdate(d *schema.ResourceData, meta interface{}) error {
|
||||
return testResourceMapRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceMapDelete(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("")
|
||||
return nil
|
||||
}
|
|
@ -1,114 +0,0 @@
|
|||
package test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
|
||||
"github.com/hashicorp/terraform/internal/legacy/helper/schema"
|
||||
)
|
||||
|
||||
func testResourceNested() *schema.Resource {
|
||||
return &schema.Resource{
|
||||
Create: testResourceNestedCreate,
|
||||
Read: testResourceNestedRead,
|
||||
Delete: testResourceNestedDelete,
|
||||
|
||||
Importer: &schema.ResourceImporter{
|
||||
State: schema.ImportStatePassthrough,
|
||||
},
|
||||
|
||||
Schema: map[string]*schema.Schema{
|
||||
"optional": {
|
||||
Type: schema.TypeBool,
|
||||
Optional: true,
|
||||
ForceNew: true,
|
||||
},
|
||||
"nested": {
|
||||
Type: schema.TypeSet,
|
||||
Optional: true,
|
||||
ForceNew: true,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"string": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
ForceNew: true,
|
||||
},
|
||||
"optional": {
|
||||
Type: schema.TypeBool,
|
||||
Optional: true,
|
||||
ForceNew: true,
|
||||
},
|
||||
"nested_again": {
|
||||
Type: schema.TypeSet,
|
||||
Optional: true,
|
||||
ForceNew: true,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"string": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
ForceNew: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"list_block": {
|
||||
Type: schema.TypeList,
|
||||
Optional: true,
|
||||
Computed: true,
|
||||
MaxItems: 1,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"sub_list_block": {
|
||||
Type: schema.TypeList,
|
||||
Optional: true,
|
||||
MaxItems: 1,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"bool": {
|
||||
Type: schema.TypeBool,
|
||||
Optional: true,
|
||||
},
|
||||
"set": {
|
||||
Type: schema.TypeSet,
|
||||
Optional: true,
|
||||
Elem: &schema.Schema{Type: schema.TypeString},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func testResourceNestedCreate(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId(fmt.Sprintf("%x", rand.Int63()))
|
||||
return testResourceNestedRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceNestedUpdate(d *schema.ResourceData, meta interface{}) error {
|
||||
return testResourceNestedRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceNestedRead(d *schema.ResourceData, meta interface{}) error {
|
||||
set := []map[string]interface{}{map[string]interface{}{
|
||||
"sub_list_block": []map[string]interface{}{map[string]interface{}{
|
||||
"bool": false,
|
||||
"set": schema.NewSet(schema.HashString, nil),
|
||||
}},
|
||||
}}
|
||||
d.Set("list_block", set)
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceNestedDelete(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("")
|
||||
return nil
|
||||
}
|
|
@ -1,48 +0,0 @@
|
|||
package test
|
||||
|
||||
import (
|
||||
"github.com/hashicorp/terraform/internal/legacy/helper/schema"
|
||||
)
|
||||
|
||||
func testResourceNestedId() *schema.Resource {
|
||||
return &schema.Resource{
|
||||
Create: testResourceNestedIdCreate,
|
||||
Read: testResourceNestedIdRead,
|
||||
Update: testResourceNestedIdUpdate,
|
||||
Delete: testResourceNestedIdDelete,
|
||||
|
||||
Schema: map[string]*schema.Schema{
|
||||
"list_block": {
|
||||
Type: schema.TypeList,
|
||||
Optional: true,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"id": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
Computed: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func testResourceNestedIdCreate(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("testId")
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceNestedIdRead(d *schema.ResourceData, meta interface{}) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceNestedIdUpdate(d *schema.ResourceData, meta interface{}) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceNestedIdDelete(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("")
|
||||
return nil
|
||||
}
|
|
@ -1,171 +0,0 @@
|
|||
package test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
|
||||
"github.com/hashicorp/terraform/internal/legacy/helper/schema"
|
||||
)
|
||||
|
||||
func testResourceNestedSet() *schema.Resource {
|
||||
return &schema.Resource{
|
||||
Create: testResourceNestedSetCreate,
|
||||
Read: testResourceNestedSetRead,
|
||||
Delete: testResourceNestedSetDelete,
|
||||
Update: testResourceNestedSetUpdate,
|
||||
|
||||
Importer: &schema.ResourceImporter{
|
||||
State: schema.ImportStatePassthrough,
|
||||
},
|
||||
|
||||
Schema: map[string]*schema.Schema{
|
||||
"optional": {
|
||||
Type: schema.TypeBool,
|
||||
Optional: true,
|
||||
},
|
||||
"force_new": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
ForceNew: true,
|
||||
},
|
||||
"type_list": {
|
||||
Type: schema.TypeList,
|
||||
Optional: true,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"value": {
|
||||
Type: schema.TypeString,
|
||||
ForceNew: true,
|
||||
Optional: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"single": {
|
||||
Type: schema.TypeSet,
|
||||
Optional: true,
|
||||
MaxItems: 1,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"value": {
|
||||
Type: schema.TypeString,
|
||||
ForceNew: true,
|
||||
Required: true,
|
||||
},
|
||||
|
||||
"optional": {
|
||||
Type: schema.TypeString,
|
||||
ForceNew: true,
|
||||
Optional: true,
|
||||
Computed: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"multi": {
|
||||
Type: schema.TypeSet,
|
||||
Optional: true,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"set": {
|
||||
Type: schema.TypeSet,
|
||||
Optional: true,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"required": {
|
||||
Type: schema.TypeString,
|
||||
Required: true,
|
||||
ForceNew: true,
|
||||
},
|
||||
"optional_int": {
|
||||
Type: schema.TypeInt,
|
||||
Optional: true,
|
||||
},
|
||||
"bool": {
|
||||
Type: schema.TypeBool,
|
||||
Optional: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
"optional": {
|
||||
Type: schema.TypeString,
|
||||
// commenting this causes it to get missed during apply
|
||||
//ForceNew: true,
|
||||
Optional: true,
|
||||
},
|
||||
"bool": {
|
||||
Type: schema.TypeBool,
|
||||
Optional: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"with_list": {
|
||||
Type: schema.TypeSet,
|
||||
Optional: true,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"required": {
|
||||
Type: schema.TypeString,
|
||||
Required: true,
|
||||
},
|
||||
"list": {
|
||||
Type: schema.TypeList,
|
||||
Optional: true,
|
||||
Elem: &schema.Schema{
|
||||
Type: schema.TypeString,
|
||||
},
|
||||
},
|
||||
"list_block": {
|
||||
Type: schema.TypeList,
|
||||
Optional: true,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"unused": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func testResourceNestedSetCreate(d *schema.ResourceData, meta interface{}) error {
|
||||
id := fmt.Sprintf("%x", rand.Int63())
|
||||
d.SetId(id)
|
||||
|
||||
// replicate some awkward handling of a computed value in a set
|
||||
set := d.Get("single").(*schema.Set)
|
||||
l := set.List()
|
||||
if len(l) == 1 {
|
||||
if s, ok := l[0].(map[string]interface{}); ok {
|
||||
if v, _ := s["optional"].(string); v == "" {
|
||||
s["optional"] = id
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
d.Set("single", set)
|
||||
|
||||
return testResourceNestedSetRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceNestedSetRead(d *schema.ResourceData, meta interface{}) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceNestedSetDelete(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("")
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceNestedSetUpdate(d *schema.ResourceData, meta interface{}) error {
|
||||
return nil
|
||||
}
|
|
@ -1,95 +0,0 @@
|
|||
package test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/hashicorp/terraform/internal/legacy/helper/schema"
|
||||
)
|
||||
|
||||
func testResourceProviderMeta() *schema.Resource {
|
||||
return &schema.Resource{
|
||||
Create: testResourceProviderMetaCreate,
|
||||
Read: testResourceProviderMetaRead,
|
||||
Update: testResourceProviderMetaUpdate,
|
||||
Delete: testResourceProviderMetaDelete,
|
||||
|
||||
Importer: &schema.ResourceImporter{
|
||||
State: schema.ImportStatePassthrough,
|
||||
},
|
||||
|
||||
Schema: map[string]*schema.Schema{
|
||||
"optional": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
type providerMeta struct {
|
||||
Foo string `cty:"foo"`
|
||||
}
|
||||
|
||||
func testResourceProviderMetaCreate(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("testId")
|
||||
var m providerMeta
|
||||
|
||||
err := d.GetProviderMeta(&m)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if m.Foo != "bar" {
|
||||
return fmt.Errorf("expected provider_meta.foo to be %q, was %q",
|
||||
"bar", m.Foo)
|
||||
}
|
||||
|
||||
return testResourceProviderMetaRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceProviderMetaRead(d *schema.ResourceData, meta interface{}) error {
|
||||
var m providerMeta
|
||||
|
||||
err := d.GetProviderMeta(&m)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if m.Foo != "bar" {
|
||||
return fmt.Errorf("expected provider_meta.foo to be %q, was %q",
|
||||
"bar", m.Foo)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceProviderMetaUpdate(d *schema.ResourceData, meta interface{}) error {
|
||||
var m providerMeta
|
||||
|
||||
err := d.GetProviderMeta(&m)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if m.Foo != "bar" {
|
||||
return fmt.Errorf("expected provider_meta.foo to be %q, was %q",
|
||||
"bar", m.Foo)
|
||||
}
|
||||
return testResourceProviderMetaRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceProviderMetaDelete(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("")
|
||||
var m providerMeta
|
||||
|
||||
err := d.GetProviderMeta(&m)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if m.Foo != "bar" {
|
||||
return fmt.Errorf("expected provider_meta.foo to be %q, was %q",
|
||||
"bar", m.Foo)
|
||||
}
|
||||
return nil
|
||||
}
|
|
@ -1,68 +0,0 @@
|
|||
package test
|
||||
|
||||
import (
|
||||
"github.com/hashicorp/terraform/internal/legacy/helper/schema"
|
||||
)
|
||||
|
||||
func testResourceRequiredMin() *schema.Resource {
|
||||
return &schema.Resource{
|
||||
Create: testResourceRequiredMinCreate,
|
||||
Read: testResourceRequiredMinRead,
|
||||
Update: testResourceRequiredMinUpdate,
|
||||
Delete: testResourceRequiredMinDelete,
|
||||
|
||||
CustomizeDiff: func(d *schema.ResourceDiff, _ interface{}) error {
|
||||
if d.HasChange("dependent_list") {
|
||||
d.SetNewComputed("computed_list")
|
||||
}
|
||||
return nil
|
||||
},
|
||||
|
||||
Schema: map[string]*schema.Schema{
|
||||
"min_items": {
|
||||
Type: schema.TypeList,
|
||||
Optional: true,
|
||||
MinItems: 2,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"val": {
|
||||
Type: schema.TypeString,
|
||||
Required: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"required_min_items": {
|
||||
Type: schema.TypeList,
|
||||
Required: true,
|
||||
MinItems: 2,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"val": {
|
||||
Type: schema.TypeString,
|
||||
Required: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func testResourceRequiredMinCreate(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("testId")
|
||||
return testResourceRequiredMinRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceRequiredMinRead(d *schema.ResourceData, meta interface{}) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceRequiredMinUpdate(d *schema.ResourceData, meta interface{}) error {
|
||||
return testResourceRequiredMinRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceRequiredMinDelete(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("")
|
||||
return nil
|
||||
}
|
|
@ -1,43 +0,0 @@
|
|||
package test
|
||||
|
||||
import (
|
||||
"github.com/hashicorp/terraform/internal/legacy/helper/schema"
|
||||
)
|
||||
|
||||
func testResourceSignal() *schema.Resource {
|
||||
return &schema.Resource{
|
||||
Create: testResourceSignalCreate,
|
||||
Read: testResourceSignalRead,
|
||||
Update: testResourceSignalUpdate,
|
||||
Delete: testResourceSignalDelete,
|
||||
|
||||
Importer: &schema.ResourceImporter{
|
||||
State: schema.ImportStatePassthrough,
|
||||
},
|
||||
|
||||
Schema: map[string]*schema.Schema{
|
||||
"optional": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func testResourceSignalCreate(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("testId")
|
||||
|
||||
return testResourceSignalRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceSignalRead(d *schema.ResourceData, meta interface{}) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceSignalUpdate(d *schema.ResourceData, meta interface{}) error {
|
||||
return testResourceSignalRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceSignalDelete(d *schema.ResourceData, meta interface{}) error {
|
||||
return nil
|
||||
}
|
|
@ -1,118 +0,0 @@
|
|||
package test
|
||||
|
||||
import (
|
||||
"crypto/sha1"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"math/rand"
|
||||
|
||||
"github.com/hashicorp/terraform/helper/hashcode"
|
||||
"github.com/hashicorp/terraform/internal/legacy/helper/schema"
|
||||
)
|
||||
|
||||
func testResourceStateFunc() *schema.Resource {
|
||||
return &schema.Resource{
|
||||
Create: testResourceStateFuncCreate,
|
||||
Read: testResourceStateFuncRead,
|
||||
Update: testResourceStateFuncUpdate,
|
||||
Delete: testResourceStateFuncDelete,
|
||||
|
||||
Importer: &schema.ResourceImporter{
|
||||
State: schema.ImportStatePassthrough,
|
||||
},
|
||||
|
||||
Schema: map[string]*schema.Schema{
|
||||
"optional": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
},
|
||||
"state_func": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
ForceNew: true,
|
||||
StateFunc: stateFuncHash,
|
||||
},
|
||||
"state_func_value": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
},
|
||||
|
||||
// set block with computed elements
|
||||
"set_block": {
|
||||
Type: schema.TypeSet,
|
||||
Optional: true,
|
||||
Set: setBlockHash,
|
||||
Elem: &schema.Resource{
|
||||
Schema: map[string]*schema.Schema{
|
||||
"required": {
|
||||
Type: schema.TypeString,
|
||||
Required: true,
|
||||
},
|
||||
"optional": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
Computed: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func stateFuncHash(v interface{}) string {
|
||||
hash := sha1.Sum([]byte(v.(string)))
|
||||
return hex.EncodeToString(hash[:])
|
||||
}
|
||||
|
||||
func setBlockHash(v interface{}) int {
|
||||
m := v.(map[string]interface{})
|
||||
required, _ := m["required"].(string)
|
||||
optional, _ := m["optional"].(string)
|
||||
return hashcode.String(fmt.Sprintf("%s|%s", required, optional))
|
||||
}
|
||||
|
||||
func testResourceStateFuncCreate(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId(fmt.Sprintf("%x", rand.Int63()))
|
||||
|
||||
// if we have a reference for the actual data in the state_func field,
|
||||
// compare it
|
||||
if data, ok := d.GetOk("state_func_value"); ok {
|
||||
expected := data.(string)
|
||||
got := d.Get("state_func").(string)
|
||||
if expected != got {
|
||||
return fmt.Errorf("expected state_func value:%q, got%q", expected, got)
|
||||
}
|
||||
}
|
||||
|
||||
// Check that we can lookup set elements by our computed hash.
|
||||
// This is not advised, but we can use this to make sure the final diff was
|
||||
// prepared with the correct values.
|
||||
setBlock, ok := d.GetOk("set_block")
|
||||
if ok {
|
||||
set := setBlock.(*schema.Set)
|
||||
for _, obj := range set.List() {
|
||||
idx := setBlockHash(obj)
|
||||
requiredAddr := fmt.Sprintf("%s.%d.%s", "set_block", idx, "required")
|
||||
_, ok := d.GetOkExists(requiredAddr)
|
||||
if !ok {
|
||||
return fmt.Errorf("failed to get attr %q from %#v", fmt.Sprintf(requiredAddr), d.State().Attributes)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return testResourceStateFuncRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceStateFuncRead(d *schema.ResourceData, meta interface{}) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceStateFuncUpdate(d *schema.ResourceData, meta interface{}) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceStateFuncDelete(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("")
|
||||
return nil
|
||||
}
|
|
@ -1,125 +0,0 @@
|
|||
package test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/hashicorp/terraform/internal/legacy/helper/schema"
|
||||
)
|
||||
|
||||
func testResourceTimeout() *schema.Resource {
|
||||
return &schema.Resource{
|
||||
Create: testResourceTimeoutCreate,
|
||||
Read: testResourceTimeoutRead,
|
||||
Update: testResourceTimeoutUpdate,
|
||||
Delete: testResourceTimeoutDelete,
|
||||
|
||||
// Due to the schema version also being stashed in the private/meta
|
||||
// data, we need to ensure that it does not overwrite the map
|
||||
// containing the timeouts.
|
||||
SchemaVersion: 1,
|
||||
|
||||
Timeouts: &schema.ResourceTimeout{
|
||||
Create: schema.DefaultTimeout(time.Second),
|
||||
Update: schema.DefaultTimeout(time.Second),
|
||||
Delete: schema.DefaultTimeout(time.Second),
|
||||
},
|
||||
|
||||
Importer: &schema.ResourceImporter{
|
||||
State: schema.ImportStatePassthrough,
|
||||
},
|
||||
|
||||
Schema: map[string]*schema.Schema{
|
||||
"create_delay": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
},
|
||||
"read_delay": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
},
|
||||
"update_delay": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
},
|
||||
"delete_delay": {
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func testResourceTimeoutCreate(d *schema.ResourceData, meta interface{}) error {
|
||||
delayString := d.Get("create_delay").(string)
|
||||
var delay time.Duration
|
||||
var err error
|
||||
if delayString != "" {
|
||||
delay, err = time.ParseDuration(delayString)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if delay > d.Timeout(schema.TimeoutCreate) {
|
||||
return fmt.Errorf("timeout while creating resource")
|
||||
}
|
||||
|
||||
d.SetId("testId")
|
||||
|
||||
return testResourceRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceTimeoutRead(d *schema.ResourceData, meta interface{}) error {
|
||||
delayString := d.Get("read_delay").(string)
|
||||
var delay time.Duration
|
||||
var err error
|
||||
if delayString != "" {
|
||||
delay, err = time.ParseDuration(delayString)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if delay > d.Timeout(schema.TimeoutRead) {
|
||||
return fmt.Errorf("timeout while reading resource")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceTimeoutUpdate(d *schema.ResourceData, meta interface{}) error {
|
||||
delayString := d.Get("update_delay").(string)
|
||||
var delay time.Duration
|
||||
var err error
|
||||
if delayString != "" {
|
||||
delay, err = time.ParseDuration(delayString)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if delay > d.Timeout(schema.TimeoutUpdate) {
|
||||
return fmt.Errorf("timeout while updating resource")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceTimeoutDelete(d *schema.ResourceData, meta interface{}) error {
|
||||
delayString := d.Get("delete_delay").(string)
|
||||
var delay time.Duration
|
||||
var err error
|
||||
if delayString != "" {
|
||||
delay, err = time.ParseDuration(delayString)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if delay > d.Timeout(schema.TimeoutDelete) {
|
||||
return fmt.Errorf("timeout while deleting resource")
|
||||
}
|
||||
|
||||
d.SetId("")
|
||||
return nil
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
package test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/hashicorp/terraform/internal/legacy/helper/schema"
|
||||
)
|
||||
|
||||
func testResourceUndeleteable() *schema.Resource {
|
||||
return &schema.Resource{
|
||||
Create: testResourceUndeleteableCreate,
|
||||
Read: testResourceUndeleteableRead,
|
||||
Delete: testResourceUndeleteableDelete,
|
||||
|
||||
Schema: map[string]*schema.Schema{},
|
||||
}
|
||||
}
|
||||
|
||||
func testResourceUndeleteableCreate(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("placeholder")
|
||||
return testResourceUndeleteableRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceUndeleteableRead(d *schema.ResourceData, meta interface{}) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceUndeleteableDelete(d *schema.ResourceData, meta interface{}) error {
|
||||
return fmt.Errorf("test_undeleteable always fails deletion (use terraform state rm if you really want to delete it)")
|
||||
}
|
|
@ -1,154 +0,0 @@
|
|||
package test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/hashicorp/terraform/internal/legacy/helper/schema"
|
||||
)
|
||||
|
||||
func testResourceCustomDiff() *schema.Resource {
|
||||
return &schema.Resource{
|
||||
Create: testResourceCustomDiffCreate,
|
||||
Read: testResourceCustomDiffRead,
|
||||
CustomizeDiff: testResourceCustomDiffCustomizeDiff,
|
||||
Update: testResourceCustomDiffUpdate,
|
||||
Delete: testResourceCustomDiffDelete,
|
||||
Schema: map[string]*schema.Schema{
|
||||
"required": {
|
||||
Type: schema.TypeString,
|
||||
Required: true,
|
||||
},
|
||||
"computed": {
|
||||
Type: schema.TypeInt,
|
||||
Computed: true,
|
||||
},
|
||||
"index": {
|
||||
Type: schema.TypeInt,
|
||||
Computed: true,
|
||||
},
|
||||
"veto": {
|
||||
Type: schema.TypeBool,
|
||||
Optional: true,
|
||||
},
|
||||
"list": {
|
||||
Type: schema.TypeList,
|
||||
Computed: true,
|
||||
Elem: &schema.Schema{Type: schema.TypeString},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
type listDiffCases struct {
|
||||
Type string
|
||||
Value string
|
||||
}
|
||||
|
||||
func testListDiffCases(index int) []listDiffCases {
|
||||
switch index {
|
||||
case 0:
|
||||
return []listDiffCases{
|
||||
{
|
||||
Type: "add",
|
||||
Value: "dc1",
|
||||
},
|
||||
}
|
||||
case 1:
|
||||
return []listDiffCases{
|
||||
{
|
||||
Type: "remove",
|
||||
Value: "dc1",
|
||||
},
|
||||
{
|
||||
Type: "add",
|
||||
Value: "dc2",
|
||||
},
|
||||
{
|
||||
Type: "add",
|
||||
Value: "dc3",
|
||||
},
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func testListDiffCasesReadResult(index int) []interface{} {
|
||||
switch index {
|
||||
case 1:
|
||||
return []interface{}{"dc1"}
|
||||
default:
|
||||
return []interface{}{"dc2", "dc3"}
|
||||
}
|
||||
}
|
||||
|
||||
func testResourceCustomDiffCreate(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("testId")
|
||||
|
||||
// Required must make it through to Create
|
||||
if _, ok := d.GetOk("required"); !ok {
|
||||
return fmt.Errorf("missing attribute 'required', but it's required")
|
||||
}
|
||||
|
||||
_, new := d.GetChange("computed")
|
||||
expected := new.(int) - 1
|
||||
actual := d.Get("index").(int)
|
||||
if expected != actual {
|
||||
return fmt.Errorf("expected computed to be 1 ahead of index, got computed: %d, index: %d", expected, actual)
|
||||
}
|
||||
d.Set("index", new)
|
||||
|
||||
return testResourceCustomDiffRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceCustomDiffRead(d *schema.ResourceData, meta interface{}) error {
|
||||
if err := d.Set("list", testListDiffCasesReadResult(d.Get("index").(int))); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceCustomDiffCustomizeDiff(d *schema.ResourceDiff, meta interface{}) error {
|
||||
if d.Get("veto").(bool) == true {
|
||||
return fmt.Errorf("veto is true, diff vetoed")
|
||||
}
|
||||
// Note that this gets put into state after the update, regardless of whether
|
||||
// or not anything is acted upon in the diff.
|
||||
d.SetNew("computed", d.Get("computed").(int)+1)
|
||||
|
||||
// This tests a diffed list, based off of the value of index
|
||||
dcs := testListDiffCases(d.Get("index").(int))
|
||||
s := d.Get("list").([]interface{})
|
||||
for _, dc := range dcs {
|
||||
switch dc.Type {
|
||||
case "add":
|
||||
s = append(s, dc.Value)
|
||||
case "remove":
|
||||
for i := range s {
|
||||
if s[i].(string) == dc.Value {
|
||||
copy(s[i:], s[i+1:])
|
||||
s = s[:len(s)-1]
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
d.SetNew("list", s)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func testResourceCustomDiffUpdate(d *schema.ResourceData, meta interface{}) error {
|
||||
_, new := d.GetChange("computed")
|
||||
expected := new.(int) - 1
|
||||
actual := d.Get("index").(int)
|
||||
if expected != actual {
|
||||
return fmt.Errorf("expected computed to be 1 ahead of index, got computed: %d, index: %d", expected, actual)
|
||||
}
|
||||
d.Set("index", new)
|
||||
return testResourceCustomDiffRead(d, meta)
|
||||
}
|
||||
|
||||
func testResourceCustomDiffDelete(d *schema.ResourceData, meta interface{}) error {
|
||||
d.SetId("")
|
||||
return nil
|
||||
}
|
Loading…
Reference in New Issue