Skip to content
This repository was archived by the owner on Mar 1, 2023. It is now read-only.

Commit 0a65df1

Browse files
Vadim Chinyaevalexk53
authored andcommitted
lb metadata support
1 parent f710698 commit 0a65df1

8 files changed

+327
-17
lines changed

gcore/data_source_gcore_loadbalancer.go

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package gcore
33
import (
44
"context"
55
"fmt"
6+
"github.com/G-Core/gcorelabscloud-go/gcore/utils"
67
"log"
78

89
"github.com/G-Core/gcorelabscloud-go/gcore/loadbalancer/v1/listeners"
@@ -86,6 +87,37 @@ func dataSourceLoadBalancer() *schema.Resource {
8687
},
8788
},
8889
},
90+
"metadata_k": &schema.Schema{
91+
Type: schema.TypeString,
92+
Optional: true,
93+
},
94+
"metadata_kv": &schema.Schema{
95+
Type: schema.TypeMap,
96+
Optional: true,
97+
Elem: &schema.Schema{
98+
Type: schema.TypeString,
99+
},
100+
},
101+
"metadata_read_only": &schema.Schema{
102+
Type: schema.TypeList,
103+
Computed: true,
104+
Elem: &schema.Resource{
105+
Schema: map[string]*schema.Schema{
106+
"key": {
107+
Type: schema.TypeString,
108+
Computed: true,
109+
},
110+
"value": {
111+
Type: schema.TypeString,
112+
Computed: true,
113+
},
114+
"read_only": {
115+
Type: schema.TypeBool,
116+
Computed: true,
117+
},
118+
},
119+
},
120+
},
89121
},
90122
}
91123
}
@@ -102,7 +134,22 @@ func dataSourceLoadBalancerRead(ctx context.Context, d *schema.ResourceData, m i
102134
}
103135

104136
name := d.Get("name").(string)
105-
lbs, err := loadbalancers.ListAll(client, nil)
137+
138+
metaOpts := &loadbalancers.ListOpts{}
139+
140+
if metadataK, ok := d.GetOk("metadata_k"); ok {
141+
metaOpts.MetadataK = metadataK.(string)
142+
}
143+
144+
if metadataRaw, ok := d.GetOk("metadata_kv"); ok {
145+
meta, err := utils.MapInterfaceToMapString(metadataRaw)
146+
if err != nil {
147+
return diag.FromErr(err)
148+
}
149+
metaOpts.MetadataKV = meta
150+
}
151+
lbs, err := loadbalancers.ListAll(client, *metaOpts)
152+
106153
if err != nil {
107154
return diag.FromErr(err)
108155
}
@@ -128,6 +175,21 @@ func dataSourceLoadBalancerRead(ctx context.Context, d *schema.ResourceData, m i
128175
d.Set("vip_address", lb.VipAddress.String())
129176
d.Set("vip_port_id", lb.VipPortID)
130177

178+
metadataReadOnly := make([]map[string]interface{}, 0, len(lb.Metadata))
179+
if len(lb.Metadata) > 0 {
180+
for _, metadataItem := range lb.Metadata {
181+
metadataReadOnly = append(metadataReadOnly, map[string]interface{}{
182+
"key": metadataItem.Key,
183+
"value": metadataItem.Value,
184+
"read_only": metadataItem.ReadOnly,
185+
})
186+
}
187+
}
188+
189+
if err := d.Set("metadata_read_only", metadataReadOnly); err != nil {
190+
return diag.FromErr(err)
191+
}
192+
131193
listenersClient, err := CreateClient(provider, d, LBListenersPoint, versionPointV1)
132194
if err != nil {
133195
return diag.FromErr(err)

gcore/data_source_gcore_loadbalancer_test.go

Lines changed: 46 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ import (
1717
const (
1818
lbTestName = "test-lb"
1919
lbListenerTestName = "test-listener"
20+
21+
lb1TestName = "test-lb1"
22+
lb2TestName = "test-lb2"
23+
24+
lb1ListenerTestName = "test-listener1"
25+
lb2ListenerTestName = "test-listener2"
2026
)
2127

2228
func TestAccLoadBalancerDataSource(t *testing.T) {
@@ -30,43 +36,73 @@ func TestAccLoadBalancerDataSource(t *testing.T) {
3036
t.Fatal(err)
3137
}
3238

33-
opts := loadbalancers.CreateOpts{
34-
Name: lbTestName,
39+
opts1 := loadbalancers.CreateOpts{
40+
Name: lb1TestName,
3541
Listeners: []loadbalancers.CreateListenerOpts{{
36-
Name: lbListenerTestName,
42+
Name: lb1ListenerTestName,
3743
ProtocolPort: 80,
3844
Protocol: types.ProtocolTypeHTTP,
3945
}},
46+
Metadata: map[string]string{"key1": "val1", "key2": "val2"},
47+
}
48+
49+
opts2 := loadbalancers.CreateOpts{
50+
Name: lb2TestName,
51+
Listeners: []loadbalancers.CreateListenerOpts{{
52+
Name: lb2ListenerTestName,
53+
ProtocolPort: 80,
54+
Protocol: types.ProtocolTypeHTTP,
55+
}},
56+
Metadata: map[string]string{"key1": "val1", "key3": "val3"},
57+
}
58+
59+
lb1ID, err := createTestLoadBalancerWithListener(client, opts1)
60+
if err != nil {
61+
t.Fatal(err)
4062
}
4163

42-
lbID, err := createTestLoadBalancerWithListener(client, opts)
64+
lb2ID, err := createTestLoadBalancerWithListener(client, opts2)
4365
if err != nil {
4466
t.Fatal(err)
4567
}
4668

47-
defer loadbalancers.Delete(client, lbID)
69+
defer loadbalancers.Delete(client, lb1ID)
70+
defer loadbalancers.Delete(client, lb2ID)
4871

4972
fullName := "data.gcore_loadbalancer.acctest"
50-
tpl := func(name string) string {
73+
tpl := func(name string, metaQuery string) string {
5174
return fmt.Sprintf(`
5275
data "gcore_loadbalancer" "acctest" {
5376
%s
5477
%s
5578
name = "%s"
79+
%s
5680
}
57-
`, projectInfo(), regionInfo(), name)
81+
`, projectInfo(), regionInfo(), name, metaQuery)
5882
}
5983

6084
resource.Test(t, resource.TestCase{
6185
PreCheck: func() { testAccPreCheck(t) },
6286
ProviderFactories: testAccProviders,
6387
Steps: []resource.TestStep{
6488
{
65-
Config: tpl(opts.Name),
89+
Config: tpl(opts1.Name, `metadata_k="key1"`),
90+
Check: resource.ComposeTestCheckFunc(
91+
testAccCheckResourceExists(fullName),
92+
resource.TestCheckResourceAttr(fullName, "name", opts1.Name),
93+
resource.TestCheckResourceAttr(fullName, "id", lb1ID),
94+
testAccCheckMetadata(fullName, true, map[string]string{
95+
"key1": "val1", "key2": "val2"}),
96+
),
97+
},
98+
{
99+
Config: tpl(opts2.Name, `metadata_kv={key3 = "val3"}`),
66100
Check: resource.ComposeTestCheckFunc(
67101
testAccCheckResourceExists(fullName),
68-
resource.TestCheckResourceAttr(fullName, "name", opts.Name),
69-
resource.TestCheckResourceAttr(fullName, "id", lbID),
102+
resource.TestCheckResourceAttr(fullName, "name", opts2.Name),
103+
resource.TestCheckResourceAttr(fullName, "id", lb2ID),
104+
testAccCheckMetadata(fullName, true, map[string]string{
105+
"key3": "val3"}),
70106
),
71107
},
72108
},

gcore/data_source_gcore_loadbalancerv2.go

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package gcore
22

33
import (
44
"context"
5+
"github.com/G-Core/gcorelabscloud-go/gcore/utils"
56
"log"
67

78
"github.com/G-Core/gcorelabscloud-go/gcore/loadbalancer/v1/loadbalancers"
@@ -57,6 +58,37 @@ func dataSourceLoadBalancerV2() *schema.Resource {
5758
Type: schema.TypeString,
5859
Computed: true,
5960
},
61+
"metadata_k": &schema.Schema{
62+
Type: schema.TypeString,
63+
Optional: true,
64+
},
65+
"metadata_kv": &schema.Schema{
66+
Type: schema.TypeMap,
67+
Optional: true,
68+
Elem: &schema.Schema{
69+
Type: schema.TypeString,
70+
},
71+
},
72+
"metadata_read_only": &schema.Schema{
73+
Type: schema.TypeList,
74+
Computed: true,
75+
Elem: &schema.Resource{
76+
Schema: map[string]*schema.Schema{
77+
"key": {
78+
Type: schema.TypeString,
79+
Computed: true,
80+
},
81+
"value": {
82+
Type: schema.TypeString,
83+
Computed: true,
84+
},
85+
"read_only": {
86+
Type: schema.TypeBool,
87+
Computed: true,
88+
},
89+
},
90+
},
91+
},
6092
},
6193
}
6294
}
@@ -73,7 +105,23 @@ func dataSourceLoadBalancerV2Read(ctx context.Context, d *schema.ResourceData, m
73105
}
74106

75107
name := d.Get("name").(string)
76-
lbs, err := loadbalancers.ListAll(client, nil)
108+
109+
metaOpts := &loadbalancers.ListOpts{}
110+
111+
if metadataK, ok := d.GetOk("metadata_k"); ok {
112+
metaOpts.MetadataK = metadataK.(string)
113+
}
114+
115+
if metadataRaw, ok := d.GetOk("metadata_kv"); ok {
116+
meta, err := utils.MapInterfaceToMapString(metadataRaw)
117+
if err != nil {
118+
return diag.FromErr(err)
119+
}
120+
metaOpts.MetadataKV = meta
121+
}
122+
123+
lbs, err := loadbalancers.ListAll(client, *metaOpts)
124+
77125
if err != nil {
78126
return diag.FromErr(err)
79127
}

gcore/resource_gcore_loadbalancer.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package gcore
33
import (
44
"context"
55
"fmt"
6+
"github.com/G-Core/gcorelabscloud-go/gcore/utils"
7+
"github.com/G-Core/gcorelabscloud-go/gcore/utils/metadata"
68
"log"
79
"time"
810

@@ -191,6 +193,33 @@ func resourceLoadBalancer() *schema.Resource {
191193
Optional: true,
192194
Computed: true,
193195
},
196+
"metadata_map": &schema.Schema{
197+
Type: schema.TypeMap,
198+
Optional: true,
199+
Elem: &schema.Schema{
200+
Type: schema.TypeString,
201+
},
202+
},
203+
"metadata_read_only": &schema.Schema{
204+
Type: schema.TypeList,
205+
Computed: true,
206+
Elem: &schema.Resource{
207+
Schema: map[string]*schema.Schema{
208+
"key": {
209+
Type: schema.TypeString,
210+
Computed: true,
211+
},
212+
"value": {
213+
Type: schema.TypeString,
214+
Computed: true,
215+
},
216+
"read_only": {
217+
Type: schema.TypeBool,
218+
Computed: true,
219+
},
220+
},
221+
},
222+
},
194223
},
195224
}
196225
}
@@ -257,6 +286,29 @@ func resourceLoadBalancerRead(ctx context.Context, d *schema.ResourceData, m int
257286
diag.FromErr(err)
258287
}
259288

289+
metadataMap := make(map[string]string)
290+
metadataReadOnly := make([]map[string]interface{}, 0, len(lb.Metadata))
291+
292+
if len(lb.Metadata) > 0 {
293+
for _, metadataItem := range lb.Metadata {
294+
if !metadataItem.ReadOnly {
295+
metadataMap[metadataItem.Key] = metadataItem.Value
296+
}
297+
metadataReadOnly = append(metadataReadOnly, map[string]interface{}{
298+
"key": metadataItem.Key,
299+
"value": metadataItem.Value,
300+
"read_only": metadataItem.ReadOnly,
301+
})
302+
}
303+
}
304+
305+
if err := d.Set("metadata_map", metadataMap); err != nil {
306+
return diag.FromErr(err)
307+
}
308+
if err := d.Set("metadata_read_only", metadataReadOnly); err != nil {
309+
return diag.FromErr(err)
310+
}
311+
260312
log.Println("[DEBUG] Finish LoadBalancer reading")
261313
return diags
262314
}
@@ -374,6 +426,20 @@ func resourceLoadBalancerUpdate(ctx context.Context, d *schema.ResourceData, m i
374426
}
375427
}
376428

429+
if d.HasChange("metadata_map") {
430+
_, nmd := d.GetChange("metadata_map")
431+
432+
meta, err := utils.MapInterfaceToMapString(nmd.(map[string]interface{}))
433+
if err != nil {
434+
return diag.Errorf("cannot get metadata. Error: %s", err)
435+
}
436+
437+
err = metadata.MetadataReplace(client, d.Id(), meta).Err
438+
if err != nil {
439+
return diag.Errorf("cannot update metadata. Error: %s", err)
440+
}
441+
}
442+
377443
log.Println("[DEBUG] Finish LoadBalancer updating")
378444
return resourceLoadBalancerRead(ctx, d, m)
379445
}

0 commit comments

Comments
 (0)