Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Provisioner List Data read #379

Merged
merged 2 commits into from
Feb 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 23 additions & 12 deletions docs/data-sources/provisioner.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,35 +27,46 @@ Read provisioner in a management cluster using this Terraform module.
```terraform
# Read Tanzu Mission Control provisioner : fetch the given provisioner details
data "tanzu-mission-control_provisioner" "read_provisioner" {
name = "test-provisioner" # Optional
management_cluster = "eks" # Required
provisioners {
name = "test-provisioner" # Optional
management_cluster = "eks" # Required
}
}

# Read Tanzu Mission Control provisioner : fetch all the provisioner details for the given management cluster
data "tanzu-mission-control_provisioner" "read_provisioner" {
management_cluster = "eks" # Required
provisioners {
management_cluster = "eks" # Required
}
}
```

<!-- schema generated by tfplugindocs -->
## Schema

### Required

- `management_cluster` (String) Name of the management cluster

### Optional

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

### Read-Only

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

<a id="nestedblock--meta"></a>
### Nested Schema for `meta`
<a id="nestedblock--provisioners"></a>
### Nested Schema for `provisioners`

Required:

- `management_cluster` (String) Name of the management cluster

Optional:

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

<a id="nestedblock--provisioners--meta"></a>
### Nested Schema for `provisioners.meta`

Optional:

Expand Down
10 changes: 7 additions & 3 deletions examples/data-sources/provisioner/data_source_provisioner.tf
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
# Read Tanzu Mission Control provisioner : fetch the given provisioner details
data "tanzu-mission-control_provisioner" "read_provisioner" {
name = "test-provisioner" # Optional
management_cluster = "eks" # Required
provisioners {
name = "test-provisioner" # Optional
management_cluster = "eks" # Required
}
}

# Read Tanzu Mission Control provisioner : fetch all the provisioner details for the given management cluster
data "tanzu-mission-control_provisioner" "read_provisioner" {
management_cluster = "eks" # Required
provisioners {
management_cluster = "eks" # Required
}
}
1 change: 1 addition & 0 deletions internal/resources/provisioner/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,5 @@ const (
orgIDKey = "org_id"
managementClusterNameKey = "management_cluster"
eksManagementCluster = "eks"
provisionerKey = "provisioners"
)
16 changes: 16 additions & 0 deletions internal/resources/provisioner/converter_mapping.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,28 @@ import (
"github.com/vmware/terraform-provider-tanzu-mission-control/internal/resources/common"
)

var provisionerArrayField = tfModelConverterHelper.BuildArrayField("provisioners")

var tfModelMap = &tfModelConverterHelper.BlockToStruct{
nameKey: tfModelConverterHelper.BuildDefaultModelPath("fullName", "name"),
managementClusterNameKey: tfModelConverterHelper.BuildDefaultModelPath("fullName", "managementClusterName"),
common.MetaKey: common.GetMetaConverterMap(tfModelConverterHelper.DefaultModelPathSeparator),
}

var tfDataModelMap = &tfModelConverterHelper.BlockToStruct{
provisionerKey: &tfModelConverterHelper.BlockSliceToStructSlice{
{
managementClusterNameKey: tfModelConverterHelper.BuildDefaultModelPath(provisionerArrayField, "fullName", "managementClusterName"),
nameKey: tfModelConverterHelper.BuildDefaultModelPath(provisionerArrayField, "fullName", "name"),
common.MetaKey: common.GetMetaConverterMap(tfModelConverterHelper.DefaultModelPathSeparator),
},
},
}

var tfModelConverter = tfModelConverterHelper.TFSchemaModelConverter[*provisionermodels.VmwareTanzuManageV1alpha1ManagementclusterProvisionerProvisioner]{
TFModelMap: tfModelMap,
}

var tfModelDataConverter = tfModelConverterHelper.TFSchemaModelConverter[*provisionermodels.VmwareTanzuManageV1alpha1ManagementclusterProvisionerListprovisionersResponse]{
TFModelMap: tfDataModelMap,
}
98 changes: 66 additions & 32 deletions internal/resources/provisioner/data_source_provisioner.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ package provisioner

import (
"context"
"strings"

"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
Expand All @@ -15,6 +16,8 @@ import (
"github.com/vmware/terraform-provider-tanzu-mission-control/internal/authctx"
clienterrors "github.com/vmware/terraform-provider-tanzu-mission-control/internal/client/errors"
"github.com/vmware/terraform-provider-tanzu-mission-control/internal/helper"
objectmetamodel "github.com/vmware/terraform-provider-tanzu-mission-control/internal/models/objectmeta"
provisioner "github.com/vmware/terraform-provider-tanzu-mission-control/internal/models/provisioner"
"github.com/vmware/terraform-provider-tanzu-mission-control/internal/resources/common"
)

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

var provisionerListSchema = map[string]*schema.Schema{
nameKey: {
Type: schema.TypeString,
Description: "Name of the provisioner",
Optional: true,
},
managementClusterNameKey: {
Type: schema.TypeString,
Description: "Name of the management cluster",
Required: true,
ForceNew: true,
},
orgIDKey: {
Type: schema.TypeString,
Description: "ID of the organization",
provisionerKey: {
Type: schema.TypeList,
Description: "Provisioners info",
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
nameKey: {
Type: schema.TypeString,
Description: "Name of the provisioner",
Optional: true,
},
managementClusterNameKey: {
Type: schema.TypeString,
Description: "Name of the management cluster",
Required: true,
ForceNew: true,
},
orgIDKey: {
Type: schema.TypeString,
Description: "ID of the organization",
Optional: true,
},
common.MetaKey: common.Meta,
},
},
},
common.MetaKey: common.Meta,
}

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

model, err := tfModelConverter.ConvertTFSchemaToAPIModel(d, []string{nameKey, managementClusterNameKey})
if err != nil {
id := make([]string, 0)

var resp *provisioner.VmwareTanzuManageV1alpha1ManagementclusterProvisionerListprovisionersResponse

model, err := tfModelDataConverter.ConvertTFSchemaToAPIModel(d, []string{provisionerKey, nameKey, managementClusterNameKey})
if err != nil || model == nil || model.Provisioners == nil {
return diag.FromErr(errors.Wrapf(err, "Couldn't read Tanzu Mission Control provisioner configurations."))
}

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

return
}

for i := range resp.Provisioners {
d.SetId(resp.Provisioners[i].Meta.UID)

if err := d.Set(common.MetaKey, common.FlattenMeta(resp.Provisioners[i].Meta)); err != nil {
return diag.FromErr(err)
}
}
} else {
resp, err := config.TMCConnection.ProvisionerResourceService.ProvisionerResourceServiceGet(model.FullName)
getResp, err := config.TMCConnection.ProvisionerResourceService.ProvisionerResourceServiceGet(model.Provisioners[0].FullName)
if err != nil {
if clienterrors.IsNotFoundError(err) && !helper.IsDataRead(ctx) {
_ = schema.RemoveFromState(d, m)
Expand All @@ -83,12 +91,38 @@ func dataSourceProvisionerRead(ctx context.Context, d *schema.ResourceData, m in
return
}

d.SetId(resp.Provisioner.Meta.UID)

if err := d.Set(common.MetaKey, common.FlattenMeta(resp.Provisioner.Meta)); err != nil {
return diag.FromErr(err)
p := &provisioner.VmwareTanzuManageV1alpha1ManagementclusterProvisionerListprovisionersResponse{
Provisioners: []*provisioner.VmwareTanzuManageV1alpha1ManagementclusterProvisionerProvisioner{
{
FullName: &provisioner.VmwareTanzuManageV1alpha1ManagementclusterProvisionerFullName{
ManagementClusterName: getResp.Provisioner.FullName.ManagementClusterName,
Name: getResp.Provisioner.FullName.Name,
OrgID: getResp.Provisioner.FullName.OrgID,
},
Meta: &objectmetamodel.VmwareTanzuCoreV1alpha1ObjectMeta{
Description: getResp.Provisioner.Meta.Description,
Labels: getResp.Provisioner.Meta.Labels,
UID: getResp.Provisioner.Meta.UID,
ResourceVersion: getResp.Provisioner.Meta.ResourceVersion,
},
},
},
}

resp = p
}

err = tfModelDataConverter.FillTFSchema(resp, d)

if err != nil {
return diag.FromErr(errors.Wrapf(err, "Unable to populate tf schema"))
}

for _, prov := range resp.Provisioners {
id = append(id, prov.Meta.UID)
}

d.SetId(strings.Join(id, "_"))

return diags
}
28 changes: 16 additions & 12 deletions internal/resources/provisioner/provisioner_data_source_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,20 +52,23 @@ func getTestProvisionerWithDataSourceConfigValue(prvName string) string {
}

data "%s" "%s" {
name = tanzu-mission-control_provisioner.provisioner_resource.name
management_cluster = tanzu-mission-control_provisioner.provisioner_resource.management_cluster
provisioners {
name = tanzu-mission-control_provisioner.provisioner_resource.name
management_cluster = tanzu-mission-control_provisioner.provisioner_resource.management_cluster
}
}
`, ResourceName, resourceVar, prvName, eksManagementCluster, testhelper.MetaTemplate, ResourceName, dataSourceVar)
}

func checkDataSourceAttributes(dataSourceName, resourceName string) resource.TestCheckFunc {
var check = []resource.TestCheckFunc{
verifyProvisionerDataSource(dataSourceName),
resource.TestCheckResourceAttrPair(dataSourceName, "name", resourceName, "name"),
resource.TestCheckResourceAttrPair(dataSourceName, "provisioners.0.name", resourceName, "name"),
resource.TestCheckResourceAttrSet(dataSourceName, "id"),
}

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

return resource.ComposeTestCheckFunc(check...)
}
Expand All @@ -81,11 +84,12 @@ func verifyProvisionerDataSource(name string) resource.TestCheckFunc {
}
}

func metaDataSourceAttributeCheck(dataSourceName, resourceName string) []resource.TestCheckFunc {
return []resource.TestCheckFunc{
resource.TestCheckResourceAttrPair(dataSourceName, "meta.0.description", resourceName, "meta.0.description"),
resource.TestCheckResourceAttrPair(dataSourceName, "meta.0.labels.key1", resourceName, "meta.0.labels.key1"),
resource.TestCheckResourceAttrPair(dataSourceName, "meta.0.labels.key2", resourceName, "meta.0.labels.key2"),
resource.TestCheckResourceAttrSet(dataSourceName, "meta.0.uid"),
}
}
// TODO: Add the meta check after TMC-54016 fix.
// func metaDataSourceAttributeCheck(dataSourceName, resourceName string) []resource.TestCheckFunc {
// return []resource.TestCheckFunc{
// resource.TestCheckResourceAttrPair(dataSourceName, "meta.0.description", resourceName, "meta.0.description"),
// resource.TestCheckResourceAttrPair(dataSourceName, "meta.0.labels.key1", resourceName, "meta.0.labels.key1"),
// resource.TestCheckResourceAttrPair(dataSourceName, "meta.0.labels.key2", resourceName, "meta.0.labels.key2"),
// resource.TestCheckResourceAttrSet(dataSourceName, "meta.0.uid"),
// }
//}
Loading