github.com/rstandt/terraform@v0.12.32-0.20230710220336-b1063613405c/builtin/providers/test/resource_list.go (about)

     1  package test
     2  
     3  import (
     4  	"github.com/hashicorp/terraform/helper/schema"
     5  )
     6  
     7  func testResourceList() *schema.Resource {
     8  	return &schema.Resource{
     9  		Create: testResourceListCreate,
    10  		Read:   testResourceListRead,
    11  		Update: testResourceListUpdate,
    12  		Delete: testResourceListDelete,
    13  
    14  		CustomizeDiff: func(d *schema.ResourceDiff, _ interface{}) error {
    15  			if d.HasChange("dependent_list") {
    16  				d.SetNewComputed("computed_list")
    17  			}
    18  			return nil
    19  		},
    20  
    21  		Schema: map[string]*schema.Schema{
    22  			"list_block": {
    23  				Type:     schema.TypeList,
    24  				Optional: true,
    25  				Elem: &schema.Resource{
    26  					Schema: map[string]*schema.Schema{
    27  						"string": {
    28  							Type:     schema.TypeString,
    29  							Optional: true,
    30  						},
    31  						"int": {
    32  							Type:     schema.TypeInt,
    33  							Optional: true,
    34  						},
    35  						"force_new": {
    36  							Type:     schema.TypeString,
    37  							Optional: true,
    38  							ForceNew: true,
    39  						},
    40  						"sublist": {
    41  							Type:     schema.TypeList,
    42  							Optional: true,
    43  							Elem: &schema.Schema{
    44  								Type: schema.TypeString,
    45  							},
    46  						},
    47  						"sublist_block": {
    48  							Type:     schema.TypeList,
    49  							Optional: true,
    50  							Computed: true,
    51  							ForceNew: true,
    52  							Elem: &schema.Resource{
    53  								Schema: map[string]*schema.Schema{
    54  									"string": {
    55  										Type:     schema.TypeString,
    56  										Required: true,
    57  									},
    58  									"int": {
    59  										Type:     schema.TypeInt,
    60  										Required: true,
    61  									},
    62  								},
    63  							},
    64  						},
    65  						"sublist_block_optional": {
    66  							Type:     schema.TypeList,
    67  							Optional: true,
    68  							Elem: &schema.Resource{
    69  								Schema: map[string]*schema.Schema{
    70  									"list": {
    71  										Type:     schema.TypeList,
    72  										Optional: true,
    73  										Elem:     &schema.Schema{Type: schema.TypeString},
    74  									},
    75  								},
    76  							},
    77  						},
    78  					},
    79  				},
    80  			},
    81  			"dependent_list": {
    82  				Type:     schema.TypeList,
    83  				Optional: true,
    84  				Elem: &schema.Resource{
    85  					Schema: map[string]*schema.Schema{
    86  						"val": {
    87  							Type:     schema.TypeString,
    88  							Required: true,
    89  						},
    90  					},
    91  				},
    92  			},
    93  			"computed_list": {
    94  				Type:     schema.TypeList,
    95  				Computed: true,
    96  				Elem:     &schema.Schema{Type: schema.TypeString},
    97  			},
    98  			"min_items": {
    99  				Type:     schema.TypeList,
   100  				Optional: true,
   101  				MinItems: 2,
   102  				Elem: &schema.Resource{
   103  					Schema: map[string]*schema.Schema{
   104  						"val": {
   105  							Type:     schema.TypeString,
   106  							Required: true,
   107  						},
   108  					},
   109  				},
   110  			},
   111  			"never_set": {
   112  				Type:     schema.TypeList,
   113  				MaxItems: 1,
   114  				Optional: true,
   115  				Computed: true,
   116  				Elem: &schema.Resource{
   117  					Schema: map[string]*schema.Schema{
   118  						"sublist": {
   119  							Type:     schema.TypeList,
   120  							MaxItems: 1,
   121  							ForceNew: true,
   122  							Optional: true,
   123  							Elem: &schema.Resource{
   124  								Schema: map[string]*schema.Schema{
   125  									"bool": {
   126  										Type:     schema.TypeBool,
   127  										ForceNew: true,
   128  										Required: true,
   129  									},
   130  									"string": {
   131  										Type:     schema.TypeString,
   132  										Computed: true,
   133  									},
   134  								},
   135  							},
   136  						},
   137  					},
   138  				},
   139  			},
   140  			"map_list": {
   141  				Type:     schema.TypeList,
   142  				Optional: true,
   143  				Elem:     &schema.Schema{Type: schema.TypeMap},
   144  			},
   145  		},
   146  	}
   147  }
   148  
   149  func testResourceListCreate(d *schema.ResourceData, meta interface{}) error {
   150  	d.SetId("testId")
   151  	return testResourceListRead(d, meta)
   152  }
   153  
   154  func testResourceListRead(d *schema.ResourceData, meta interface{}) error {
   155  	fixedIps := d.Get("dependent_list")
   156  
   157  	// all_fixed_ips should be set as computed with a CustomizeDiff func, but
   158  	// we're trying to emulate legacy provider behavior, and updating a
   159  	// computed field was a common case.
   160  	ips := []interface{}{}
   161  	if fixedIps != nil {
   162  		for _, v := range fixedIps.([]interface{}) {
   163  			m := v.(map[string]interface{})
   164  			ips = append(ips, m["val"])
   165  		}
   166  	}
   167  	if err := d.Set("computed_list", ips); err != nil {
   168  		return err
   169  	}
   170  
   171  	// "computing" these values should insert empty containers into the
   172  	// never_set block.
   173  	values := make(map[string]interface{})
   174  	values["sublist"] = []interface{}{}
   175  	d.Set("never_set", []interface{}{values})
   176  
   177  	return nil
   178  }
   179  
   180  func testResourceListUpdate(d *schema.ResourceData, meta interface{}) error {
   181  	block := d.Get("never_set").([]interface{})
   182  	if len(block) > 0 {
   183  		// if profiles contains any values, they should not be nil
   184  		_ = block[0].(map[string]interface{})
   185  	}
   186  	return testResourceListRead(d, meta)
   187  }
   188  
   189  func testResourceListDelete(d *schema.ResourceData, meta interface{}) error {
   190  	d.SetId("")
   191  	return nil
   192  }