Skip to content

Commit f2819d0

Browse files
committed
WIP
Signed-off-by: Dainius Serplis <dserplis@vmware.com>
1 parent 73e8f6d commit f2819d0

12 files changed

+521
-16
lines changed

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,4 @@ require (
7171
)
7272

7373
//replace github.com/vmware/go-vcloud-director/v3 => github.com/Didainius/go-vcloud-director/v3 v2.12.1-0.20211018060826-c7f8ab32330e
74-
replace github.com/vmware/go-vcloud-director/v3 => github.com/Didainius/go-vcloud-director/v3 v3.0.0-alpha.4.0.20241216141442-23cd0e170aae
74+
replace github.com/vmware/go-vcloud-director/v3 => ../go-vcloud-director

vcd/datasource_vcd_tm_edge_cluster.go

+24-10
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ const labelTmEdgeClusterSync = "TM Edge Cluster Sync"
1515

1616
func datasourceVcdTmEdgeCluster() *schema.Resource {
1717
return &schema.Resource{
18-
ReadContext: resourceVcdTmEdgeClusterRead,
18+
ReadContext: datasourceVcdTmEdgeClusterRead,
1919

2020
Schema: map[string]*schema.Schema{
2121
"name": {
@@ -25,7 +25,7 @@ func datasourceVcdTmEdgeCluster() *schema.Resource {
2525
},
2626
"region_id": {
2727
Type: schema.TypeString,
28-
Computed: true,
28+
Required: true,
2929
Description: fmt.Sprintf("Region ID of %s", labelTmEdgeCluster),
3030
},
3131
"sync_before_read": {
@@ -78,19 +78,19 @@ func datasourceVcdTmEdgeCluster() *schema.Resource {
7878
}
7979
}
8080

81-
func resourceVcdTmEdgeClusterRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
81+
func datasourceVcdTmEdgeClusterRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
8282
vcdClient := meta.(*VCDClient)
83-
if d.Get("sync_before_read").(bool) {
84-
err := vcdClient.TmSyncEdgeClusters()
85-
if err != nil {
86-
return diag.Errorf("error syncing %s before lookup: %s", labelTmEdgeClusterSync, err)
87-
}
83+
84+
regionId := d.Get("region_id").(string)
85+
getByName := func(name string) (*govcd.TmEdgeCluster, error) {
86+
return vcdClient.GetTmEdgeClusterByNameAndRegionId(name, regionId)
8887
}
8988

9089
c := dsReadConfig[*govcd.TmEdgeCluster, types.TmEdgeCluster]{
9190
entityLabel: labelTmEdgeCluster,
92-
getEntityFunc: vcdClient.GetTmEdgeClusterByName,
91+
getEntityFunc: getByName,
9392
stateStoreFunc: setTmEdgeClusterData,
93+
preReadHooks: []schemaHook{syncTmEdgeClustersBeforeReadHook},
9494
}
9595
return readDatasource(ctx, d, meta, c)
9696
}
@@ -103,7 +103,11 @@ func setTmEdgeClusterData(_ *VCDClient, d *schema.ResourceData, t *govcd.TmEdgeC
103103
d.SetId(t.TmEdgeCluster.ID)
104104
dSet(d, "status", t.TmEdgeCluster.Status)
105105
dSet(d, "health_status", t.TmEdgeCluster.HealthStatus)
106-
dSet(d, "region_id", t.TmEdgeCluster.RegionRef.ID)
106+
107+
dSet(d, "region_id", "")
108+
if t.TmEdgeCluster.RegionRef != nil {
109+
dSet(d, "region_id", t.TmEdgeCluster.RegionRef.ID)
110+
}
107111
dSet(d, "deployment_type", t.TmEdgeCluster.DeploymentType)
108112
dSet(d, "node_count", t.TmEdgeCluster.NodeCount)
109113
dSet(d, "org_count", t.TmEdgeCluster.OrgCount)
@@ -113,3 +117,13 @@ func setTmEdgeClusterData(_ *VCDClient, d *schema.ResourceData, t *govcd.TmEdgeC
113117

114118
return nil
115119
}
120+
121+
func syncTmEdgeClustersBeforeReadHook(vcdClient *VCDClient, d *schema.ResourceData) error {
122+
if d.Get("sync_before_read").(bool) {
123+
err := vcdClient.TmSyncEdgeClusters()
124+
if err != nil {
125+
return fmt.Errorf("error syncing %s before lookup: %s", labelTmEdgeClusterSync, err)
126+
}
127+
}
128+
return nil
129+
}
+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package vcd
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+
"github.com/vmware/go-vcloud-director/v3/govcd"
10+
"github.com/vmware/go-vcloud-director/v3/types/v56"
11+
)
12+
13+
func datasourceVcdTmEdgeClusterQos() *schema.Resource {
14+
return &schema.Resource{
15+
ReadContext: datasourceVcdTmEdgeClusterQosRead,
16+
17+
Schema: map[string]*schema.Schema{
18+
"edge_cluster_id": {
19+
Type: schema.TypeString,
20+
Required: true,
21+
ForceNew: true,
22+
Description: fmt.Sprintf("ID of %s", labelTmEdgeCluster),
23+
},
24+
"region_id": {
25+
Type: schema.TypeString,
26+
Computed: true,
27+
Description: fmt.Sprintf("Region ID of %s", labelTmEdgeCluster),
28+
},
29+
"ingress_committed_bandwidth_mbps": {
30+
Type: schema.TypeString,
31+
Computed: true,
32+
Description: fmt.Sprintf("Ingress committed bandwidth in Mbps for %s", labelTmEdgeCluster),
33+
},
34+
"ingress_burst_size_bytes": {
35+
Type: schema.TypeString,
36+
Computed: true,
37+
Description: fmt.Sprintf("Ingress burst size bytes for %s", labelTmEdgeCluster),
38+
},
39+
"egress_committed_bandwidth_mbps": {
40+
Type: schema.TypeString,
41+
Computed: true,
42+
Description: fmt.Sprintf("Egress committed bandwidth in Mbps for %s", labelTmEdgeCluster),
43+
},
44+
"egress_burst_size_bytes": {
45+
Type: schema.TypeString,
46+
Computed: true,
47+
Description: fmt.Sprintf("Ingress burst size bytes for %s", labelTmEdgeCluster),
48+
},
49+
},
50+
}
51+
}
52+
53+
func datasourceVcdTmEdgeClusterQosRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
54+
vcdClient := meta.(*VCDClient)
55+
c := dsReadConfig[*govcd.TmEdgeCluster, types.TmEdgeCluster]{
56+
entityLabel: labelTmEdgeClusterQos,
57+
stateStoreFunc: setTmEdgeClusterQosData,
58+
overrideDefaultNameField: "edge_cluster_id", // pass the value of this field to getEntityFunc
59+
getEntityFunc: vcdClient.GetTmEdgeClusterById,
60+
}
61+
return readDatasource(ctx, d, meta, c)
62+
}

vcd/provider.go

+2
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ var globalDataSourceMap = map[string]*schema.Resource{
188188
"vcd_tm_content_library_item": datasourceVcdTmContentLibraryItem(), // 4.0
189189
"vcd_tm_ip_space": datasourceVcdTmIpSpace(), // 4.0
190190
"vcd_tm_edge_cluster": datasourceVcdTmEdgeCluster(), // 4.0
191+
"vcd_tm_edge_cluster_qos": datasourceVcdTmEdgeClusterQos(), // 4.0
191192
}
192193

193194
var globalResourceMap = map[string]*schema.Resource{
@@ -322,6 +323,7 @@ var globalResourceMap = map[string]*schema.Resource{
322323
"vcd_tm_region": resourceVcdTmRegion(), // 4.0
323324
"vcd_tm_org_vdc": resourceTmOrgVdc(), // 4.0
324325
"vcd_tm_ip_space": resourceVcdTmIpSpace(), // 4.0
326+
"vcd_tm_edge_cluster_qos": resourceVcdTmEdgeClusterQos(), // 4.0
325327
}
326328

327329
// Provider returns a terraform.ResourceProvider.

vcd/resource_generic_crud.go

+24-2
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,10 @@ func updateResource[O updateDeleter[O, I], I any](ctx context.Context, d *schema
9595
return diag.Errorf("error getting %s type on update: %s", c.entityLabel, err)
9696
}
9797

98+
if d.Id() == "" {
99+
return diag.Errorf("empty id for updating %s", c.entityLabel)
100+
}
101+
98102
retrievedEntity, err := c.getEntityFunc(d.Id())
99103
if err != nil {
100104
return diag.Errorf("error getting %s for update: %s", c.entityLabel, err)
@@ -225,17 +229,35 @@ type dsReadConfig[O any, I any] struct {
225229
// getEntityFunc is a function that retrieves the entity
226230
// It will use ID for resources and Name for data sources
227231
getEntityFunc func(idOrName string) (O, error)
232+
233+
// preReadHooks will be executed before the entity is created
234+
preReadHooks []schemaHook
235+
236+
// overrideDefaultNameField permits to override default field ('name') that passed to
237+
// getEntityFunc. The field must be a string (schema.TypeString)
238+
overrideDefaultNameField string
228239
}
229240

230241
// readDatasource will read a data source by a 'name' field in Terraform schema
231242
func readDatasource[O any, I any](_ context.Context, d *schema.ResourceData, meta interface{}, c dsReadConfig[O, I]) diag.Diagnostics {
232-
entityName := d.Get("name").(string)
243+
vcdClient := meta.(*VCDClient)
244+
err := execSchemaHook(vcdClient, d, c.preReadHooks)
245+
if err != nil {
246+
return diag.Errorf("error executing pre-read %s hooks: %s", c.entityLabel, err)
247+
}
248+
249+
fieldName := "name"
250+
if c.overrideDefaultNameField != "" {
251+
fieldName = c.overrideDefaultNameField
252+
util.Logger.Printf("[DEBUG] Overriding %s field 'name' to '%s' for datasource lookup", c.entityLabel, c.overrideDefaultNameField)
253+
}
254+
entityName := d.Get(fieldName).(string)
255+
233256
retrievedEntity, err := c.getEntityFunc(entityName)
234257
if err != nil {
235258
return diag.Errorf("error getting %s by Name '%s': %s", c.entityLabel, entityName, err)
236259
}
237260

238-
vcdClient := meta.(*VCDClient)
239261
err = c.stateStoreFunc(vcdClient, d, retrievedEntity)
240262
if err != nil {
241263
return diag.Errorf("error storing %s to state during data source read: %s", c.entityLabel, err)

0 commit comments

Comments
 (0)