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 }