Skip to content

Commit 78dc7f1

Browse files
yfodilremyleone
andauthored
feat(lb): add backend datasource (#1784)
* feat(lb): add backend datasource * typo --------- Co-authored-by: Rémy Léone <[email protected]>
1 parent 255b63a commit 78dc7f1

File tree

5 files changed

+1830
-0
lines changed

5 files changed

+1830
-0
lines changed

docs/data-sources/lb_backend.md

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
---
2+
page_title: "Scaleway: scaleway_lb_backend"
3+
description: |-
4+
Manages Scaleway Load-Balancer Backends.
5+
---
6+
7+
# scaleway_lb_backend
8+
9+
Get information about Scaleway Load-Balancer Backends.
10+
For more information, see [the documentation](https://developers.scaleway.com/en/products/lb/zoned_api/#backends-cbf4eb).
11+
12+
## Example Usage
13+
14+
```hcl
15+
resource "scaleway_lb_ip" "main" {
16+
}
17+
18+
resource "scaleway_lb" "main" {
19+
ip_id = scaleway_lb_ip.main.id
20+
name = "data-test-lb-backend"
21+
type = "LB-S"
22+
}
23+
24+
resource "scaleway_lb_backend" "main" {
25+
lb_id = scaleway_lb.main.id
26+
name = "backend01"
27+
forward_protocol = "http"
28+
forward_port = "80"
29+
}
30+
31+
data "scaleway_lb_backend" "byID" {
32+
backend_id = scaleway_lb_backend.main.id
33+
}
34+
35+
data "scaleway_lb_backend" "byName" {
36+
name = scaleway_lb_backend.main.name
37+
lb_id = scaleway_lb.main.id
38+
}
39+
```
40+
41+
## Arguments Reference
42+
43+
The following arguments are supported:
44+
45+
- `backend_id` - (Optional) The backend id.
46+
- Only one of `name` and `backend_id` should be specified.
47+
48+
- `name` - (Optional) The name of the backend.
49+
- When using the `name` you should specify the `lb-id`
50+
51+
- `lb_id` - (Required) The load-balancer ID this backend is attached to.
52+
53+
## Attributes Reference
54+
55+
See the [LB Backend Resource](../resources/lb_backend.md) for details on the returned attributes - they are identical.

scaleway/data_source_lb_backend.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package scaleway
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
lbSDK "github.com/scaleway/scaleway-sdk-go/api/lb/v1"
10+
"github.com/scaleway/scaleway-sdk-go/scw"
11+
)
12+
13+
func dataSourceScalewayLbBackend() *schema.Resource {
14+
// Generate datasource schema from resource
15+
dsSchema := datasourceSchemaFromResourceSchema(resourceScalewayLbBackend().Schema)
16+
17+
// Set 'Optional' schema elements
18+
addOptionalFieldsToSchema(dsSchema, "name", "lb_id")
19+
20+
dsSchema["name"].ConflictsWith = []string{"backend_id"}
21+
dsSchema["backend_id"] = &schema.Schema{
22+
Type: schema.TypeString,
23+
Optional: true,
24+
Description: "The ID of the backend",
25+
ValidateFunc: validationUUIDorUUIDWithLocality(),
26+
ConflictsWith: []string{"name"},
27+
}
28+
29+
return &schema.Resource{
30+
ReadContext: dataSourceScalewayLbBackendRead,
31+
Schema: dsSchema,
32+
}
33+
}
34+
35+
func dataSourceScalewayLbBackendRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
36+
api, zone, err := lbAPIWithZone(d, meta)
37+
if err != nil {
38+
return diag.FromErr(err)
39+
}
40+
41+
backID, ok := d.GetOk("backend_id")
42+
if !ok { // Get LB by name.
43+
res, err := api.ListBackends(&lbSDK.ZonedAPIListBackendsRequest{
44+
Zone: zone,
45+
Name: expandStringPtr(d.Get("name")),
46+
LBID: expandID(d.Get("lb_id")),
47+
}, scw.WithContext(ctx))
48+
if err != nil {
49+
return diag.FromErr(err)
50+
}
51+
if len(res.Backends) == 0 {
52+
return diag.FromErr(fmt.Errorf("no backends found with the name %s", d.Get("name")))
53+
}
54+
if len(res.Backends) > 1 {
55+
return diag.FromErr(fmt.Errorf("%d backend found with the same name %s", len(res.Backends), d.Get("name")))
56+
}
57+
backID = res.Backends[0].ID
58+
}
59+
zonedID := datasourceNewZonedID(backID, zone)
60+
d.SetId(zonedID)
61+
err = d.Set("backend_id", zonedID)
62+
if err != nil {
63+
return diag.FromErr(err)
64+
}
65+
return resourceScalewayLbBackendRead(ctx, d, meta)
66+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package scaleway
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
7+
)
8+
9+
func TestAccScalewayDataSourceLbBackend_Basic(t *testing.T) {
10+
tt := NewTestTools(t)
11+
defer tt.Cleanup()
12+
resource.ParallelTest(t, resource.TestCase{
13+
PreCheck: func() { testAccPreCheck(t) },
14+
ProviderFactories: tt.ProviderFactories,
15+
CheckDestroy: testAccCheckScalewayLbIPDestroy(tt),
16+
Steps: []resource.TestStep{
17+
{
18+
Config: `
19+
resource scaleway_lb_ip main {
20+
}
21+
22+
resource scaleway_lb main {
23+
ip_id = scaleway_lb_ip.main.id
24+
name = "data-test-lb-backend"
25+
type = "LB-S"
26+
}
27+
28+
resource "scaleway_lb_backend" "main" {
29+
lb_id = scaleway_lb.main.id
30+
name = "backend01"
31+
forward_protocol = "http"
32+
forward_port = "80"
33+
}
34+
35+
data "scaleway_lb_backend" "byID" {
36+
backend_id = "${scaleway_lb_backend.main.id}"
37+
}
38+
39+
data "scaleway_lb_backend" "byName" {
40+
name = "${scaleway_lb_backend.main.name}"
41+
lb_id = "${scaleway_lb.main.id}"
42+
}
43+
`,
44+
Check: resource.ComposeTestCheckFunc(
45+
resource.TestCheckResourceAttrPair(
46+
"data.scaleway_lb_backend.byID", "name",
47+
"scaleway_lb_backend.main", "name"),
48+
resource.TestCheckResourceAttrPair(
49+
"data.scaleway_lb_backend.byName", "id",
50+
"scaleway_lb_backend.main", "id"),
51+
),
52+
},
53+
},
54+
})
55+
}

scaleway/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@ func Provider(config *ProviderConfig) plugin.ProviderFunc {
192192
"scaleway_k8s_pool": dataSourceScalewayK8SPool(),
193193
"scaleway_k8s_version": dataSourceScalewayK8SVersion(),
194194
"scaleway_lb": dataSourceScalewayLb(),
195+
"scaleway_lb_backend": dataSourceScalewayLbBackend(),
195196
"scaleway_lb_certificate": dataSourceScalewayLbCertificate(),
196197
"scaleway_lb_frontend": dataSourceScalewayLbFrontend(),
197198
"scaleway_lb_ip": dataSourceScalewayLbIP(),

0 commit comments

Comments
 (0)