Skip to content

Commit 918725a

Browse files
authored
Merge pull request #64 from douwentao/dwt_dev
fix data_disks
2 parents 78cf1be + de1e4e4 commit 918725a

File tree

3 files changed

+104
-51
lines changed

3 files changed

+104
-51
lines changed

alibabacloudstack/data_source_apsarastack_disks.go

+89-48
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package alibabacloudstack
22

33
import (
4+
"encoding/json"
45
"log"
56
"regexp"
7+
"strconv"
68
"strings"
79

810
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
11+
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
912
"github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
1013
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/connectivity"
1114
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -148,28 +151,45 @@ func dataSourceAlibabacloudStackDisks() *schema.Resource {
148151
func dataSourceAlibabacloudStackDisksRead(d *schema.ResourceData, meta interface{}) error {
149152
client := meta.(*connectivity.AlibabacloudStackClient)
150153

151-
request := ecs.CreateDescribeDisksRequest()
154+
request := requests.NewCommonRequest()
152155
if strings.ToLower(client.Config.Protocol) == "https" {
153156
request.Scheme = "https"
154157
} else {
155158
request.Scheme = "http"
156159
}
157160
request.RegionId = client.RegionId
158-
request.Headers = map[string]string{"RegionId": client.RegionId}
159-
request.QueryParams = map[string]string{"AccessKeySecret": client.SecretKey, "Product": "ecs", "Department": client.Department, "ResourceGroup": client.ResourceGroup}
161+
request.Method = "POST"
162+
request.Product = "Ecs"
163+
request.Version = "2014-05-26"
164+
165+
request.ApiName = "DescribeDisks"
166+
request.Headers = map[string]string{"RegionId": client.RegionId, "Content-Type": requests.Json}
167+
PageNumber := 1
168+
request.QueryParams = map[string]string{
169+
"AccessKeySecret": client.SecretKey,
170+
"Product": "ecs",
171+
"Department": client.Department,
172+
"ResourceGroup": client.ResourceGroup,
173+
"RegionId": client.RegionId,
174+
"Action": "DescribeDisks",
175+
"Version": "2014-05-26",
176+
"ResourceGroupId": client.ResourceGroup,
177+
"PageSize": "50",
178+
"PageNumber": strconv.Itoa(PageNumber),
179+
}
160180
if v, ok := d.GetOk("ids"); ok && len(v.([]interface{})) > 0 {
161-
request.DiskIds = convertListToJsonString(v.([]interface{}))
181+
request.QueryParams["DiskIds"] = convertListToJsonString(v.([]interface{}))
162182
}
183+
DiskType := ""
163184
if v, ok := d.GetOk("type"); ok && v.(string) != "" {
164-
request.DiskType = v.(string)
165-
request.QueryParams["Type"] = request.DiskType
185+
DiskType = v.(string)
186+
request.QueryParams["DiskType"] = DiskType
166187
}
167188
if v, ok := d.GetOk("category"); ok && v.(string) != "" {
168-
request.Category = v.(string)
189+
request.QueryParams["DiskCategory"] = v.(string)
169190
}
170-
log.Printf("Disktype25 %v", request.DiskType)
171191
if v, ok := d.GetOk("instance_id"); ok && v.(string) != "" {
172-
request.InstanceId = v.(string)
192+
request.QueryParams["InstanceId"] = v.(string)
173193
}
174194
if v, ok := d.GetOk("tags"); ok {
175195
var tags []ecs.DescribeDisksTag
@@ -180,48 +200,55 @@ func dataSourceAlibabacloudStackDisksRead(d *schema.ResourceData, meta interface
180200
Value: value.(string),
181201
})
182202
}
183-
request.Tag = &tags
203+
tags_json, _ := json.Marshal(tags)
204+
request.QueryParams["Tag"] = string(tags_json)
184205
}
185206

186-
var allDisks []ecs.Disk
187-
request.PageSize = requests.NewInteger(PageSizeLarge)
188-
request.PageNumber = requests.NewInteger(1)
207+
var allDisks []interface{}
208+
resp := make(map[string]interface{})
189209
for {
190210
raw, err := client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
191-
return ecsClient.DescribeDisks(request)
211+
return ecsClient.ProcessCommonRequest(request)
192212
})
193213
if err != nil {
194214
return WrapErrorf(err, DataDefaultErrorMsg, "alibabacloudstack_disks", request.GetActionName(), AlibabacloudStackSdkGoERROR)
195215
}
196-
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
197-
response, _ := raw.(*ecs.DescribeDisksResponse)
216+
addDebug(request.GetActionName(), raw, request, request.QueryParams)
217+
response, _ := raw.(*responses.CommonResponse)
218+
err = json.Unmarshal(response.GetHttpContentBytes(), &resp)
219+
if err != nil {
220+
return WrapErrorf(err, DataDefaultErrorMsg, "alibabacloudstack_disks", request.GetActionName(), AlibabacloudStackSdkGoERROR)
221+
}
222+
Disks := resp["Disks"].(map[string]interface{})["Disk"].([]interface{})
198223
log.Printf("ecsDescribeDisk25 %v", response)
199-
if response == nil || len(response.Disks.Disk) < 1 {
224+
if response == nil || len(Disks) < 1 {
200225
break
201226
}
227+
for _, disk := range Disks {
228+
allDisks = append(allDisks, disk)
202229

203-
allDisks = append(allDisks, response.Disks.Disk...)
230+
}
204231

205-
if len(response.Disks.Disk) < PageSizeLarge {
232+
if len(Disks) < PageNumber*50 {
206233
break
207234
}
208235

209-
page, err := getNextpageNumber(request.PageNumber)
236+
PageNumber = PageNumber + 1
210237
if err != nil {
211238
return WrapError(err)
212239
}
213-
request.PageNumber = page
240+
request.QueryParams["PageNumber"] = strconv.Itoa(PageNumber)
214241
}
215242

216-
var filteredDisksTemp []ecs.Disk
243+
var filteredDisksTemp []interface{}
217244

218245
nameRegex, ok := d.GetOk("name_regex")
219246

220-
if request.DiskType == "system" || request.DiskType == "data" {
247+
if DiskType == "system" || DiskType == "data" {
221248
log.Printf("entered ")
222249
for _, disk := range allDisks {
223250

224-
if disk.Type == request.DiskType {
251+
if disk.(map[string]interface{})["Type"].(string) == DiskType {
225252
filteredDisksTemp = append(filteredDisksTemp, disk)
226253
}
227254

@@ -235,7 +262,7 @@ func dataSourceAlibabacloudStackDisksRead(d *schema.ResourceData, meta interface
235262
r = regexp.MustCompile(nameRegex.(string))
236263
}
237264
for _, disk := range allDisks {
238-
if r != nil && !r.MatchString(disk.DiskName) {
265+
if r != nil && !r.MatchString(disk.(map[string]interface{})["DiskName"].(string)) {
239266
continue
240267
}
241268
filteredDisksTemp = append(filteredDisksTemp, disk)
@@ -246,35 +273,49 @@ func dataSourceAlibabacloudStackDisksRead(d *schema.ResourceData, meta interface
246273
return disksDescriptionAttributes(d, filteredDisksTemp, meta)
247274
}
248275

249-
func disksDescriptionAttributes(d *schema.ResourceData, disks []ecs.Disk, meta interface{}) error {
276+
func disksDescriptionAttributes(d *schema.ResourceData, disks []interface{}, meta interface{}) error {
250277
client := meta.(*connectivity.AlibabacloudStackClient)
251278
ecsService := EcsService{client}
252279
var ids []string
253280
var s []map[string]interface{}
254-
for _, disk := range disks {
281+
for _, diskdata := range disks {
282+
disk := diskdata.(map[string]interface{})
283+
var tag []ecs.Tag
284+
tags := disk["Tags"].(map[string]interface{})
285+
if len(tags["Tag"].([]interface{})) > 0 {
286+
for _, v := range tags["Tag"].([]interface{}) {
287+
if v != nil {
288+
v = v.(map[string]interface{})
289+
290+
tag = append(tag, ecs.Tag{
291+
TagKey: v.(map[string]interface{})["TagKey"].(string),
292+
TagValue: v.(map[string]interface{})["TagValue"].(string),
293+
})
294+
}
295+
}
296+
}
255297
mapping := map[string]interface{}{
256-
"id": disk.DiskId,
257-
"name": disk.DiskName,
258-
"description": disk.Description,
259-
"region_id": disk.RegionId,
260-
"availability_zone": disk.ZoneId,
261-
"status": disk.Status,
262-
"type": disk.Type,
263-
"category": disk.Category,
264-
"size": disk.Size,
265-
"image_id": disk.ImageId,
266-
"snapshot_id": disk.SourceSnapshotId,
267-
"instance_id": disk.InstanceId,
268-
"creation_time": disk.CreationTime,
269-
"attached_time": disk.AttachedTime,
270-
"detached_time": disk.DetachedTime,
271-
"expiration_time": disk.ExpiredTime,
272-
"storage_set_id": disk.StorageSetId,
273-
"kms_key_id": disk.KMSKeyId,
274-
"tags": ecsService.tagsToMap(disk.Tags.Tag),
298+
"id": disk["DiskId"].(string),
299+
"name": disk["DiskName"].(string),
300+
"description": disk["Description"].(string),
301+
"region_id": disk["RegionId"].(string),
302+
"availability_zone": disk["ZoneId"].(string),
303+
"status": disk["Status"].(string),
304+
"type": disk["Type"].(string),
305+
"category": disk["Category"].(string),
306+
"size": disk["Size"].(float64),
307+
"image_id": disk["ImageId"].(string),
308+
"snapshot_id": disk["SourceSnapshotId"].(string),
309+
"instance_id": disk["InstanceId"].(string),
310+
"creation_time": disk["CreationTime"].(string),
311+
"attached_time": disk["AttachedTime"].(string),
312+
"detached_time": disk["DetachedTime"].(string),
313+
"expiration_time": disk["ExpiredTime"].(string),
314+
"storage_set_id": disk["StorageSetId"].(string),
315+
"kms_key_id": disk["KMSKeyId"].(string),
316+
"tags": ecsService.tagsToMap(tag),
275317
}
276-
277-
ids = append(ids, disk.DiskId)
318+
ids = append(ids, disk["DiskId"].(string))
278319
s = append(s, mapping)
279320
}
280321

alibabacloudstack/resource_apsarastack_instance.go

+8-2
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,10 @@ func resourceAlibabacloudStackInstance() *schema.Resource {
135135
Optional: true,
136136
ValidateFunc: validation.StringLenBetween(2, 256),
137137
},
138+
"system_disk_id": {
139+
Type: schema.TypeString,
140+
Computed: true,
141+
},
138142
"data_disks": {
139143
Type: schema.TypeList,
140144
Optional: true,
@@ -344,7 +348,7 @@ func resourceAlibabacloudStackInstanceCreate(d *schema.ResourceData, meta interf
344348
}
345349
}
346350
if d.Get("enable_ipv6").(bool) && d.Get("ipv6_address_count").(int) > 0 {
347-
ipv6s, err := AssignIpv6AddressesFunc(d.Id(), d.Get("ipv6_address_count").(int), meta)
351+
ipv6s, err := AssignIpv6AddressesFunc(d.Id(), d.Get("ipv6_address_count").(int), d.Get("ipv6_address_list").([]string), meta)
348352
if err != nil {
349353
return WrapError(err)
350354
} else {
@@ -381,6 +385,7 @@ func resourceAlibabacloudStackInstanceRead(d *schema.ResourceData, meta interfac
381385
d.Set("system_disk_size", disk.Size)
382386
d.Set("system_disk_name", disk.DiskName)
383387
d.Set("system_disk_description", disk.Description)
388+
d.Set("system_disk_id", disk.DiskId)
384389
d.Set("storage_set_id", disk.StorageSetId)
385390
d.Set("instance_name", instance.InstanceName)
386391
d.Set("description", instance.Description)
@@ -1333,7 +1338,7 @@ func modifyInstanceNetworkSpec(d *schema.ResourceData, meta interface{}) error {
13331338
return nil
13341339
}
13351340

1336-
func AssignIpv6AddressesFunc(id string, ipv6_addresses_count int, meta interface{}) ([]string, error) {
1341+
func AssignIpv6AddressesFunc(id string, ipv6_addresses_count int, ipv6_addresses []string, meta interface{}) ([]string, error) {
13371342
client := meta.(*connectivity.AlibabacloudStackClient)
13381343
ecsService := EcsService{client: client}
13391344
var ipv6s []string
@@ -1345,6 +1350,7 @@ func AssignIpv6AddressesFunc(id string, ipv6_addresses_count int, meta interface
13451350
}
13461351
request.NetworkInterfaceId = instance.NetworkInterfaces.NetworkInterface[0].NetworkInterfaceId
13471352
request.Ipv6AddressCount = requests.NewInteger(ipv6_addresses_count)
1353+
request.Ipv6Address = &ipv6_addresses
13481354
request.RegionId = client.RegionId
13491355
request.Headers = map[string]string{"RegionId": client.RegionId}
13501356
request.QueryParams = map[string]string{"AccessKeySecret": client.SecretKey, "Product": "ecs", "Department": client.Department, "ResourceGroup": client.ResourceGroup}

website/docs/r/snapshot.html.markdown

+7-1
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,20 @@ Provides an ECS snapshot resource.
1414
## Example Usage
1515

1616
```
17+
data "alibabacloudstack_disks" "system_disk" {
18+
instance_id = "i-dw906gn8yjmrrzb46dmu"
19+
type = "system"
20+
}
21+
1722
resource "alibabacloudstack_snapshot" "snapshot" {
18-
disk_id = "${alibabacloudstack_disk_attachment.instance-attachment.disk_id}"
23+
disk_id = data.alibabacloudstack_disks.system_disk.ids[0]
1924
name = "test-snapshot"
2025
description = "this snapshot is created for testing"
2126
tags = {
2227
version = "1.2"
2328
}
2429
}
30+
2531
```
2632

2733
## Argument Reference

0 commit comments

Comments
 (0)