Skip to content

Commit ff12156

Browse files
authored
feat(webhosting): add dns records and name servers (#2962)
* feat(webhosting): add dns records and name servers * feat(webhosting): fix lint * feat(webhosting): fix lint
1 parent 9d5a94f commit ff12156

File tree

6 files changed

+1507
-632
lines changed

6 files changed

+1507
-632
lines changed

internal/services/webhosting/helpers.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,17 @@ func newHostingAPIWithRegion(d *schema.ResourceData, m interface{}) (*webhosting
4040
return api, region, nil
4141
}
4242

43+
func newDNSAPIWithRegion(d *schema.ResourceData, m interface{}) (*webhosting.DnsAPI, scw.Region, error) {
44+
api := webhosting.NewDnsAPI(meta.ExtractScwClient(m))
45+
46+
region, err := meta.ExtractRegion(d, m)
47+
if err != nil {
48+
return nil, "", err
49+
}
50+
51+
return api, region, nil
52+
}
53+
4354
// NewAPIWithRegionAndID returns a Hosting API with region and ID extracted from the state.
4455
func NewAPIWithRegionAndID(m interface{}, id string) (*webhosting.HostingAPI, scw.Region, string, error) {
4556
api := webhosting.NewHostingAPI(meta.ExtractScwClient(m))
@@ -65,3 +76,32 @@ func waitForHosting(ctx context.Context, api *webhosting.HostingAPI, region scw.
6576
RetryInterval: &retryInterval,
6677
}, scw.WithContext(ctx))
6778
}
79+
80+
func flattenDNSRecords(records []*webhosting.DNSRecord) []map[string]interface{} {
81+
result := []map[string]interface{}{}
82+
for _, r := range records {
83+
result = append(result, map[string]interface{}{
84+
"name": r.Name,
85+
"type": r.Type.String(),
86+
"ttl": r.TTL,
87+
"value": r.Value,
88+
"priority": r.Priority,
89+
"status": r.Status.String(),
90+
})
91+
}
92+
93+
return result
94+
}
95+
96+
func flattenNameServers(servers []*webhosting.Nameserver) []map[string]interface{} {
97+
result := []map[string]interface{}{}
98+
for _, s := range servers {
99+
result = append(result, map[string]interface{}{
100+
"hostname": s.Hostname,
101+
"status": s.Status.String(),
102+
"is_default": s.IsDefault,
103+
})
104+
}
105+
106+
return result
107+
}

internal/services/webhosting/testdata/data-source-offer-basic.cassette.yaml

Lines changed: 80 additions & 80 deletions
Large diffs are not rendered by default.

internal/services/webhosting/testdata/data-source-webhosting-basic.cassette.yaml

Lines changed: 1072 additions & 386 deletions
Large diffs are not rendered by default.

internal/services/webhosting/testdata/webhosting-basic.cassette.yaml

Lines changed: 264 additions & 166 deletions
Large diffs are not rendered by default.

internal/services/webhosting/webhosting.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,33 @@ func ResourceWebhosting() *schema.Resource {
139139
Computed: true,
140140
Description: "Main hosting cPanel username",
141141
},
142+
"records": {
143+
Type: schema.TypeList,
144+
Computed: true,
145+
Description: "List of DNS records associated with the webhosting.",
146+
Elem: &schema.Resource{
147+
Schema: map[string]*schema.Schema{
148+
"name": {Type: schema.TypeString, Computed: true},
149+
"type": {Type: schema.TypeString, Computed: true},
150+
"ttl": {Type: schema.TypeInt, Computed: true},
151+
"value": {Type: schema.TypeString, Computed: true},
152+
"priority": {Type: schema.TypeInt, Computed: true},
153+
"status": {Type: schema.TypeString, Computed: true},
154+
},
155+
},
156+
},
157+
"name_servers": {
158+
Type: schema.TypeList,
159+
Computed: true,
160+
Description: "List of nameservers associated with the webhosting.",
161+
Elem: &schema.Resource{
162+
Schema: map[string]*schema.Schema{
163+
"hostname": {Type: schema.TypeString, Computed: true},
164+
"status": {Type: schema.TypeString, Computed: true},
165+
"is_default": {Type: schema.TypeBool, Computed: true},
166+
},
167+
},
168+
},
142169
"region": regional.Schema(),
143170
"project_id": account.ProjectIDSchema(),
144171
"organization_id": func() *schema.Schema {
@@ -217,6 +244,11 @@ func resourceWebhostingRead(ctx context.Context, d *schema.ResourceData, m inter
217244
return diag.FromErr(err)
218245
}
219246

247+
dnsAPI, _, err := newDNSAPIWithRegion(d, m)
248+
if err != nil {
249+
return diag.FromErr(err)
250+
}
251+
220252
webhostingResponse, err := waitForHosting(ctx, api, region, id, d.Timeout(schema.TimeoutRead))
221253
if err != nil {
222254
if httperrors.Is404(err) {
@@ -228,6 +260,16 @@ func resourceWebhostingRead(ctx context.Context, d *schema.ResourceData, m inter
228260
return diag.FromErr(err)
229261
}
230262

263+
dnsRecordsResponse, err := dnsAPI.GetDomainDNSRecords(&webhosting.DNSAPIGetDomainDNSRecordsRequest{
264+
Domain: webhostingResponse.Domain,
265+
}, scw.WithContext(ctx))
266+
if err != nil {
267+
return diag.FromErr(err)
268+
}
269+
270+
_ = d.Set("records", flattenDNSRecords(dnsRecordsResponse.Records))
271+
_ = d.Set("name_servers", flattenNameServers(dnsRecordsResponse.NameServers))
272+
231273
_ = d.Set("tags", webhostingResponse.Tags)
232274
_ = d.Set("offer_id", regional.NewIDString(region, webhostingResponse.Offer.ID))
233275
_ = d.Set("domain", webhostingResponse.Domain)

internal/services/webhosting/webhosting_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,15 @@ func TestAccWebhosting_Basic(t *testing.T) {
4747
resource.TestCheckResourceAttrSet("scaleway_webhosting.main", "updated_at"),
4848
resource.TestCheckResourceAttrSet("scaleway_webhosting.main", "created_at"),
4949
acctest.CheckResourceAttrUUID("scaleway_webhosting.main", "id"),
50+
resource.TestCheckResourceAttrSet("scaleway_webhosting.main", "records.0.name"),
51+
resource.TestCheckResourceAttrSet("scaleway_webhosting.main", "records.0.type"),
52+
resource.TestCheckResourceAttrSet("scaleway_webhosting.main", "records.0.ttl"),
53+
resource.TestCheckResourceAttrSet("scaleway_webhosting.main", "records.0.value"),
54+
resource.TestCheckResourceAttrSet("scaleway_webhosting.main", "records.0.priority"),
55+
resource.TestCheckResourceAttrSet("scaleway_webhosting.main", "records.0.status"),
56+
resource.TestCheckResourceAttrSet("scaleway_webhosting.main", "name_servers.0.hostname"),
57+
resource.TestCheckResourceAttrSet("scaleway_webhosting.main", "name_servers.0.status"),
58+
resource.TestCheckResourceAttrSet("scaleway_webhosting.main", "name_servers.0.is_default"),
5059
),
5160
},
5261
},

0 commit comments

Comments
 (0)