/
data_source_yandex_cdn_resource.go
88 lines (66 loc) · 2.22 KB
/
data_source_yandex_cdn_resource.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package yandex
import (
"context"
"fmt"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/yandex-cloud/go-genproto/yandex/cloud/cdn/v1"
)
func dataSourceYandexCDNResource() *schema.Resource {
resourceSchema := defineYandexCDNResourceBaseSchema()
// TODO: SA1019: resourceSchema.Read is deprecated: Use ReadContext or ReadWithoutTimeout instead. This implementation does not support request cancellation initiated by Terraform, such as a system or practitioner sending SIGINT (Ctrl-c). This implementation also does not support warning diagnostics. (staticcheck)
resourceSchema.Read = dataSourceYandexCDNResourceRead
resourceSchema.Schema["resource_id"] = &schema.Schema{
Type: schema.TypeString,
Computed: true,
Optional: true,
}
return resourceSchema
}
func resolveCDNResourceID(ctx context.Context, config *Config, d *schema.ResourceData) (string, error) {
cname := d.Get("cname").(string)
if cname == "" {
return "", fmt.Errorf("empty cname for resource")
}
folderID, err := getFolderID(d, config)
if err != nil {
return "", err
}
iterator := config.sdk.CDN().Resource().ResourceIterator(ctx, &cdn.ListResourcesRequest{
FolderId: folderID,
})
for iterator.Next() {
cdnResource := iterator.Value()
if cname == cdnResource.Cname {
return cdnResource.Id, nil
}
}
return "", fmt.Errorf("resource with cname %q not found", cname)
}
func dataSourceYandexCDNResourceRead(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
ctx := config.Context()
err := checkOneOf(d, "resource_id", "cname")
if err != nil {
return err
}
resourceID := d.Get("resource_id").(string)
_, resourceCNameOk := d.GetOk("cname")
if resourceCNameOk {
resourceID, err = resolveCDNResourceID(ctx, config, d)
if err != nil {
return fmt.Errorf("failed to resolve data source cdn resource by name: %v", err)
}
}
resource, err := config.sdk.CDN().Resource().Get(ctx, &cdn.GetResourceRequest{
ResourceId: resourceID,
})
if err != nil {
return handleNotFoundError(err, d, fmt.Sprintf("cdn resource with ID %q", resourceID))
}
if err := flattenYandexCDNResource(d, resource); err != nil {
return err
}
d.Set("resource_id", resource.Id)
d.SetId(resource.Id)
return nil
}