Skip to content

Commit aa47e00

Browse files
authored
Merge pull request #379 from vmware/mshobha/fix-provisioner-list
Fix Provisioner List Data read
2 parents 95cef99 + 2edb61c commit aa47e00

File tree

6 files changed

+129
-59
lines changed

6 files changed

+129
-59
lines changed

docs/data-sources/provisioner.md

+23-12
Original file line numberDiff line numberDiff line change
@@ -27,35 +27,46 @@ Read provisioner in a management cluster using this Terraform module.
2727
```terraform
2828
# Read Tanzu Mission Control provisioner : fetch the given provisioner details
2929
data "tanzu-mission-control_provisioner" "read_provisioner" {
30-
name = "test-provisioner" # Optional
31-
management_cluster = "eks" # Required
30+
provisioners {
31+
name = "test-provisioner" # Optional
32+
management_cluster = "eks" # Required
33+
}
3234
}
3335
3436
# Read Tanzu Mission Control provisioner : fetch all the provisioner details for the given management cluster
3537
data "tanzu-mission-control_provisioner" "read_provisioner" {
36-
management_cluster = "eks" # Required
38+
provisioners {
39+
management_cluster = "eks" # Required
40+
}
3741
}
3842
```
3943

4044
<!-- schema generated by tfplugindocs -->
4145
## Schema
4246

43-
### Required
44-
45-
- `management_cluster` (String) Name of the management cluster
46-
4747
### Optional
4848

49-
- `meta` (Block List, Max: 1) Metadata for the resource (see [below for nested schema](#nestedblock--meta))
50-
- `name` (String) Name of the provisioner
51-
- `org_id` (String) ID of the organization
49+
- `provisioners` (Block List) Provisioners info (see [below for nested schema](#nestedblock--provisioners))
5250

5351
### Read-Only
5452

5553
- `id` (String) The ID of this resource.
5654

57-
<a id="nestedblock--meta"></a>
58-
### Nested Schema for `meta`
55+
<a id="nestedblock--provisioners"></a>
56+
### Nested Schema for `provisioners`
57+
58+
Required:
59+
60+
- `management_cluster` (String) Name of the management cluster
61+
62+
Optional:
63+
64+
- `meta` (Block List, Max: 1) Metadata for the resource (see [below for nested schema](#nestedblock--provisioners--meta))
65+
- `name` (String) Name of the provisioner
66+
- `org_id` (String) ID of the organization
67+
68+
<a id="nestedblock--provisioners--meta"></a>
69+
### Nested Schema for `provisioners.meta`
5970

6071
Optional:
6172

Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
# Read Tanzu Mission Control provisioner : fetch the given provisioner details
22
data "tanzu-mission-control_provisioner" "read_provisioner" {
3-
name = "test-provisioner" # Optional
4-
management_cluster = "eks" # Required
3+
provisioners {
4+
name = "test-provisioner" # Optional
5+
management_cluster = "eks" # Required
6+
}
57
}
68

79
# Read Tanzu Mission Control provisioner : fetch all the provisioner details for the given management cluster
810
data "tanzu-mission-control_provisioner" "read_provisioner" {
9-
management_cluster = "eks" # Required
11+
provisioners {
12+
management_cluster = "eks" # Required
13+
}
1014
}

internal/resources/provisioner/constants.go

+1
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,5 @@ const (
1414
orgIDKey = "org_id"
1515
managementClusterNameKey = "management_cluster"
1616
eksManagementCluster = "eks"
17+
provisionerKey = "provisioners"
1718
)

internal/resources/provisioner/converter_mapping.go

+16
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,28 @@ import (
1111
"github.com/vmware/terraform-provider-tanzu-mission-control/internal/resources/common"
1212
)
1313

14+
var provisionerArrayField = tfModelConverterHelper.BuildArrayField("provisioners")
15+
1416
var tfModelMap = &tfModelConverterHelper.BlockToStruct{
1517
nameKey: tfModelConverterHelper.BuildDefaultModelPath("fullName", "name"),
1618
managementClusterNameKey: tfModelConverterHelper.BuildDefaultModelPath("fullName", "managementClusterName"),
1719
common.MetaKey: common.GetMetaConverterMap(tfModelConverterHelper.DefaultModelPathSeparator),
1820
}
1921

22+
var tfDataModelMap = &tfModelConverterHelper.BlockToStruct{
23+
provisionerKey: &tfModelConverterHelper.BlockSliceToStructSlice{
24+
{
25+
managementClusterNameKey: tfModelConverterHelper.BuildDefaultModelPath(provisionerArrayField, "fullName", "managementClusterName"),
26+
nameKey: tfModelConverterHelper.BuildDefaultModelPath(provisionerArrayField, "fullName", "name"),
27+
common.MetaKey: common.GetMetaConverterMap(tfModelConverterHelper.DefaultModelPathSeparator),
28+
},
29+
},
30+
}
31+
2032
var tfModelConverter = tfModelConverterHelper.TFSchemaModelConverter[*provisionermodels.VmwareTanzuManageV1alpha1ManagementclusterProvisionerProvisioner]{
2133
TFModelMap: tfModelMap,
2234
}
35+
36+
var tfModelDataConverter = tfModelConverterHelper.TFSchemaModelConverter[*provisionermodels.VmwareTanzuManageV1alpha1ManagementclusterProvisionerListprovisionersResponse]{
37+
TFModelMap: tfDataModelMap,
38+
}

internal/resources/provisioner/data_source_provisioner.go

+66-32
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package provisioner
77

88
import (
99
"context"
10+
"strings"
1011

1112
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
1213
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -15,6 +16,8 @@ import (
1516
"github.com/vmware/terraform-provider-tanzu-mission-control/internal/authctx"
1617
clienterrors "github.com/vmware/terraform-provider-tanzu-mission-control/internal/client/errors"
1718
"github.com/vmware/terraform-provider-tanzu-mission-control/internal/helper"
19+
objectmetamodel "github.com/vmware/terraform-provider-tanzu-mission-control/internal/models/objectmeta"
20+
provisioner "github.com/vmware/terraform-provider-tanzu-mission-control/internal/models/provisioner"
1821
"github.com/vmware/terraform-provider-tanzu-mission-control/internal/resources/common"
1922
)
2023

@@ -28,35 +31,48 @@ func DataSourceProvisioner() *schema.Resource {
2831
}
2932

3033
var provisionerListSchema = map[string]*schema.Schema{
31-
nameKey: {
32-
Type: schema.TypeString,
33-
Description: "Name of the provisioner",
34-
Optional: true,
35-
},
36-
managementClusterNameKey: {
37-
Type: schema.TypeString,
38-
Description: "Name of the management cluster",
39-
Required: true,
40-
ForceNew: true,
41-
},
42-
orgIDKey: {
43-
Type: schema.TypeString,
44-
Description: "ID of the organization",
34+
provisionerKey: {
35+
Type: schema.TypeList,
36+
Description: "Provisioners info",
4537
Optional: true,
38+
Elem: &schema.Resource{
39+
Schema: map[string]*schema.Schema{
40+
nameKey: {
41+
Type: schema.TypeString,
42+
Description: "Name of the provisioner",
43+
Optional: true,
44+
},
45+
managementClusterNameKey: {
46+
Type: schema.TypeString,
47+
Description: "Name of the management cluster",
48+
Required: true,
49+
ForceNew: true,
50+
},
51+
orgIDKey: {
52+
Type: schema.TypeString,
53+
Description: "ID of the organization",
54+
Optional: true,
55+
},
56+
common.MetaKey: common.Meta,
57+
},
58+
},
4659
},
47-
common.MetaKey: common.Meta,
4860
}
4961

5062
func dataSourceProvisionerRead(ctx context.Context, d *schema.ResourceData, m interface{}) (diags diag.Diagnostics) {
5163
config := m.(authctx.TanzuContext)
5264

53-
model, err := tfModelConverter.ConvertTFSchemaToAPIModel(d, []string{nameKey, managementClusterNameKey})
54-
if err != nil {
65+
id := make([]string, 0)
66+
67+
var resp *provisioner.VmwareTanzuManageV1alpha1ManagementclusterProvisionerListprovisionersResponse
68+
69+
model, err := tfModelDataConverter.ConvertTFSchemaToAPIModel(d, []string{provisionerKey, nameKey, managementClusterNameKey})
70+
if err != nil || model == nil || model.Provisioners == nil {
5571
return diag.FromErr(errors.Wrapf(err, "Couldn't read Tanzu Mission Control provisioner configurations."))
5672
}
5773

58-
if model.FullName.Name == "" {
59-
resp, err := config.TMCConnection.ProvisionerResourceService.ProvisionerResourceServiceList(model.FullName)
74+
if model.Provisioners[0].FullName.Name == "" {
75+
resp, err = config.TMCConnection.ProvisionerResourceService.ProvisionerResourceServiceList(model.Provisioners[0].FullName)
6076
if err != nil {
6177
if clienterrors.IsNotFoundError(err) && !helper.IsDataRead(ctx) {
6278
_ = schema.RemoveFromState(d, m)
@@ -65,16 +81,8 @@ func dataSourceProvisionerRead(ctx context.Context, d *schema.ResourceData, m in
6581

6682
return
6783
}
68-
69-
for i := range resp.Provisioners {
70-
d.SetId(resp.Provisioners[i].Meta.UID)
71-
72-
if err := d.Set(common.MetaKey, common.FlattenMeta(resp.Provisioners[i].Meta)); err != nil {
73-
return diag.FromErr(err)
74-
}
75-
}
7684
} else {
77-
resp, err := config.TMCConnection.ProvisionerResourceService.ProvisionerResourceServiceGet(model.FullName)
85+
getResp, err := config.TMCConnection.ProvisionerResourceService.ProvisionerResourceServiceGet(model.Provisioners[0].FullName)
7886
if err != nil {
7987
if clienterrors.IsNotFoundError(err) && !helper.IsDataRead(ctx) {
8088
_ = schema.RemoveFromState(d, m)
@@ -83,12 +91,38 @@ func dataSourceProvisionerRead(ctx context.Context, d *schema.ResourceData, m in
8391
return
8492
}
8593

86-
d.SetId(resp.Provisioner.Meta.UID)
87-
88-
if err := d.Set(common.MetaKey, common.FlattenMeta(resp.Provisioner.Meta)); err != nil {
89-
return diag.FromErr(err)
94+
p := &provisioner.VmwareTanzuManageV1alpha1ManagementclusterProvisionerListprovisionersResponse{
95+
Provisioners: []*provisioner.VmwareTanzuManageV1alpha1ManagementclusterProvisionerProvisioner{
96+
{
97+
FullName: &provisioner.VmwareTanzuManageV1alpha1ManagementclusterProvisionerFullName{
98+
ManagementClusterName: getResp.Provisioner.FullName.ManagementClusterName,
99+
Name: getResp.Provisioner.FullName.Name,
100+
OrgID: getResp.Provisioner.FullName.OrgID,
101+
},
102+
Meta: &objectmetamodel.VmwareTanzuCoreV1alpha1ObjectMeta{
103+
Description: getResp.Provisioner.Meta.Description,
104+
Labels: getResp.Provisioner.Meta.Labels,
105+
UID: getResp.Provisioner.Meta.UID,
106+
ResourceVersion: getResp.Provisioner.Meta.ResourceVersion,
107+
},
108+
},
109+
},
90110
}
111+
112+
resp = p
113+
}
114+
115+
err = tfModelDataConverter.FillTFSchema(resp, d)
116+
117+
if err != nil {
118+
return diag.FromErr(errors.Wrapf(err, "Unable to populate tf schema"))
91119
}
92120

121+
for _, prov := range resp.Provisioners {
122+
id = append(id, prov.Meta.UID)
123+
}
124+
125+
d.SetId(strings.Join(id, "_"))
126+
93127
return diags
94128
}

internal/resources/provisioner/provisioner_data_source_test.go

+16-12
Original file line numberDiff line numberDiff line change
@@ -52,20 +52,23 @@ func getTestProvisionerWithDataSourceConfigValue(prvName string) string {
5252
}
5353
5454
data "%s" "%s" {
55-
name = tanzu-mission-control_provisioner.provisioner_resource.name
56-
management_cluster = tanzu-mission-control_provisioner.provisioner_resource.management_cluster
55+
provisioners {
56+
name = tanzu-mission-control_provisioner.provisioner_resource.name
57+
management_cluster = tanzu-mission-control_provisioner.provisioner_resource.management_cluster
58+
}
5759
}
5860
`, ResourceName, resourceVar, prvName, eksManagementCluster, testhelper.MetaTemplate, ResourceName, dataSourceVar)
5961
}
6062

6163
func checkDataSourceAttributes(dataSourceName, resourceName string) resource.TestCheckFunc {
6264
var check = []resource.TestCheckFunc{
6365
verifyProvisionerDataSource(dataSourceName),
64-
resource.TestCheckResourceAttrPair(dataSourceName, "name", resourceName, "name"),
66+
resource.TestCheckResourceAttrPair(dataSourceName, "provisioners.0.name", resourceName, "name"),
6567
resource.TestCheckResourceAttrSet(dataSourceName, "id"),
6668
}
6769

68-
check = append(check, metaDataSourceAttributeCheck(dataSourceName, resourceName)...)
70+
// TODO: Add the meta check after TMC-54016 fix.
71+
// check = append(check, metaDataSourceAttributeCheck(dataSourceName, resourceName)...)
6972

7073
return resource.ComposeTestCheckFunc(check...)
7174
}
@@ -81,11 +84,12 @@ func verifyProvisionerDataSource(name string) resource.TestCheckFunc {
8184
}
8285
}
8386

84-
func metaDataSourceAttributeCheck(dataSourceName, resourceName string) []resource.TestCheckFunc {
85-
return []resource.TestCheckFunc{
86-
resource.TestCheckResourceAttrPair(dataSourceName, "meta.0.description", resourceName, "meta.0.description"),
87-
resource.TestCheckResourceAttrPair(dataSourceName, "meta.0.labels.key1", resourceName, "meta.0.labels.key1"),
88-
resource.TestCheckResourceAttrPair(dataSourceName, "meta.0.labels.key2", resourceName, "meta.0.labels.key2"),
89-
resource.TestCheckResourceAttrSet(dataSourceName, "meta.0.uid"),
90-
}
91-
}
87+
// TODO: Add the meta check after TMC-54016 fix.
88+
// func metaDataSourceAttributeCheck(dataSourceName, resourceName string) []resource.TestCheckFunc {
89+
// return []resource.TestCheckFunc{
90+
// resource.TestCheckResourceAttrPair(dataSourceName, "meta.0.description", resourceName, "meta.0.description"),
91+
// resource.TestCheckResourceAttrPair(dataSourceName, "meta.0.labels.key1", resourceName, "meta.0.labels.key1"),
92+
// resource.TestCheckResourceAttrPair(dataSourceName, "meta.0.labels.key2", resourceName, "meta.0.labels.key2"),
93+
// resource.TestCheckResourceAttrSet(dataSourceName, "meta.0.uid"),
94+
// }
95+
//}

0 commit comments

Comments
 (0)