diff --git a/docs/data-sources/provisioner.md b/docs/data-sources/provisioner.md index 34e0ee92b..19db4b877 100644 --- a/docs/data-sources/provisioner.md +++ b/docs/data-sources/provisioner.md @@ -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 -### 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. - -### Nested Schema for `meta` + +### 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 + + +### Nested Schema for `provisioners.meta` Optional: diff --git a/examples/data-sources/provisioner/data_source_provisioner.tf b/examples/data-sources/provisioner/data_source_provisioner.tf index d6a0610dc..929791af1 100644 --- a/examples/data-sources/provisioner/data_source_provisioner.tf +++ b/examples/data-sources/provisioner/data_source_provisioner.tf @@ -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 + } } diff --git a/internal/resources/provisioner/constants.go b/internal/resources/provisioner/constants.go index 5e20f805f..ff925a6b6 100644 --- a/internal/resources/provisioner/constants.go +++ b/internal/resources/provisioner/constants.go @@ -14,4 +14,5 @@ const ( orgIDKey = "org_id" managementClusterNameKey = "management_cluster" eksManagementCluster = "eks" + provisionerKey = "provisioners" ) diff --git a/internal/resources/provisioner/converter_mapping.go b/internal/resources/provisioner/converter_mapping.go index 33569d96e..97ee5339b 100644 --- a/internal/resources/provisioner/converter_mapping.go +++ b/internal/resources/provisioner/converter_mapping.go @@ -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, +} diff --git a/internal/resources/provisioner/data_source_provisioner.go b/internal/resources/provisioner/data_source_provisioner.go index d1fffc435..96d314c69 100644 --- a/internal/resources/provisioner/data_source_provisioner.go +++ b/internal/resources/provisioner/data_source_provisioner.go @@ -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" @@ -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" ) @@ -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) @@ -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) @@ -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 } diff --git a/internal/resources/provisioner/provisioner_data_source_test.go b/internal/resources/provisioner/provisioner_data_source_test.go index 6724ad8c3..9d3c46abe 100644 --- a/internal/resources/provisioner/provisioner_data_source_test.go +++ b/internal/resources/provisioner/provisioner_data_source_test.go @@ -52,8 +52,10 @@ 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) } @@ -61,11 +63,12 @@ func getTestProvisionerWithDataSourceConfigValue(prvName string) string { 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...) } @@ -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"), +// } +//}