diff --git a/docs/data-sources/tanzu_kubernetes_cluster.md b/docs/data-sources/tanzu_kubernetes_cluster.md
new file mode 100644
index 000000000..e0bbdb433
--- /dev/null
+++ b/docs/data-sources/tanzu_kubernetes_cluster.md
@@ -0,0 +1,206 @@
+---
+Title: "Tanzu Kubernetes Cluster (Class-based Cluster) Data Source"
+Description: |-
+ Reading a unified Tanzu Kubernetes Grid cluster.
+---
+
+# Tanzu Kubernetes Cluster (Class-based Cluster) Data Source
+
+This data source "tanzu-mission-control_tanzu_kubernetes_cluster" enables users get the details for a TMC managed Tanzu Kubernetes Grid cluster for both Tanzu Kubernetes Grid Vsphere 2.x & Tanzu Kubernetes Grid Service 2.x.
+
+
+## Example Usage
+
+```terraform
+data "tanzu-mission-control_tanzu_kubernetes_cluster" "read_tanzu_cluster" {
+ name = "tanzu-cluster"
+ management_cluster_name = "tanzu-mgmt-cluster"
+ provisioner_name = "tanzu-provisioner"
+}
+```
+
+
+
+## Schema
+
+### Required
+
+- `management_cluster_name` (String) Management cluster name
+- `name` (String) Cluster name
+- `provisioner_name` (String) Cluster provisioner name
+
+### Optional
+
+- `meta` (Block List, Max: 1) Metadata for the resource (see [below for nested schema](#nestedblock--meta))
+- `spec` (Block List, Max: 1) Spec of tanzu kubernetes cluster. (see [below for nested schema](#nestedblock--spec))
+- `timeout_policy` (Block List, Max: 1) Timeout policy for Tanzu Kubernetes cluster. (see [below for nested schema](#nestedblock--timeout_policy))
+
+### Read-Only
+
+- `id` (String) The ID of this resource.
+
+
+### Nested Schema for `meta`
+
+Optional:
+
+- `annotations` (Map of String) Annotations for the resource
+- `description` (String) Description of the resource
+- `labels` (Map of String) Labels for the resource
+
+Read-Only:
+
+- `resource_version` (String) Resource version of the resource
+- `uid` (String) UID of the resource
+
+
+
+### Nested Schema for `spec`
+
+Required:
+
+- `topology` (Block List, Min: 1, Max: 1) The cluster topology. (see [below for nested schema](#nestedblock--spec--topology))
+
+Optional:
+
+- `cluster_group_name` (String) Name of the cluster group to which this cluster belongs.
+- `image_registry` (String) Name of the image registry configuration to use.
+- `proxy_name` (String) Name of the proxy configuration to use.
+
+Read-Only:
+
+- `kubeconfig` (String) Cluster's kubeconfig.
+- `tmc_managed` (Boolean) TMC-managed flag indicates if the cluster is managed by tmc.
+(Default: False)
+
+
+### Nested Schema for `spec.topology`
+
+Required:
+
+- `cluster_variables` (String) Variables configuration for the cluster.
+- `control_plane` (Block List, Min: 1, Max: 1) Control plane specific configuration. (see [below for nested schema](#nestedblock--spec--topology--control_plane))
+- `nodepool` (Block List, Min: 1) (Repeatable Block) Node pool definition for the cluster. (see [below for nested schema](#nestedblock--spec--topology--nodepool))
+- `version` (String) Kubernetes version of the cluster.
+
+Optional:
+
+- `cluster_class` (String) The name of the cluster class for the cluster.
+- `core_addon` (Block List) (Repeatable Block) The core addons. (see [below for nested schema](#nestedblock--spec--topology--core_addon))
+- `network` (Block List, Max: 1) Network specific configuration. (see [below for nested schema](#nestedblock--spec--topology--network))
+
+
+### Nested Schema for `spec.topology.control_plane`
+
+Required:
+
+- `replicas` (Number) Number of replicas
+
+Optional:
+
+- `meta` (Block List, Max: 1) Metadata for the resource (see [below for nested schema](#nestedblock--spec--topology--control_plane--meta))
+- `os_image` (Block List, Max: 1) OS image block (see [below for nested schema](#nestedblock--spec--topology--control_plane--os_image))
+
+
+### Nested Schema for `spec.topology.control_plane.meta`
+
+Optional:
+
+- `annotations` (Map of String) Annotations for the resource
+- `description` (String) Description of the resource
+- `labels` (Map of String) Labels for the resource
+
+Read-Only:
+
+- `resource_version` (String) Resource version of the resource
+- `uid` (String) UID of the resource
+
+
+
+### Nested Schema for `spec.topology.control_plane.os_image`
+
+Required:
+
+- `arch` (String) The architecture of the OS image.
+- `name` (String) The name of the OS image.
+- `version` (String) The version of the OS image.
+
+
+
+
+### Nested Schema for `spec.topology.nodepool`
+
+Required:
+
+- `name` (String) Name of the node pool.
+- `spec` (Block List, Min: 1) Spec for the node pool. (see [below for nested schema](#nestedblock--spec--topology--nodepool--spec))
+
+Optional:
+
+- `description` (String) Description of the node pool.
+
+
+### Nested Schema for `spec.topology.nodepool.spec`
+
+Required:
+
+- `replicas` (Number) Number of replicas
+- `worker_class` (String) The name of the machine deployment class used to create the node pool.
+
+Optional:
+
+- `failure_domain` (String) The failure domain the machines will be created in.
+- `meta` (Block List, Max: 1) Metadata for the resource (see [below for nested schema](#nestedblock--spec--topology--nodepool--spec--meta))
+- `os_image` (Block List, Max: 1) OS image block (see [below for nested schema](#nestedblock--spec--topology--nodepool--spec--os_image))
+- `overrides` (String) Overrides can be used to override cluster level variables.
+
+
+### Nested Schema for `spec.topology.nodepool.spec.meta`
+
+Optional:
+
+- `annotations` (Map of String) Annotations for the resource
+- `labels` (Map of String) Labels for the resource
+
+
+
+### Nested Schema for `spec.topology.nodepool.spec.os_image`
+
+Required:
+
+- `arch` (String) The architecture of the OS image.
+- `name` (String) The name of the OS image.
+- `version` (String) The version of the OS image.
+
+
+
+
+
+### Nested Schema for `spec.topology.core_addon`
+
+Required:
+
+- `provider` (String) Provider of core add on
+- `type` (String) Type of core add on
+
+
+
+### Nested Schema for `spec.topology.network`
+
+Optional:
+
+- `pod_cidr_blocks` (List of String) Pod CIDR for Kubernetes pods defaults to 192.168.0.0/16.
+- `service_cidr_blocks` (List of String) Service CIDR for kubernetes services defaults to 10.96.0.0/12.
+- `service_domain` (String) Domain name for services.
+
+
+
+
+
+### Nested Schema for `timeout_policy`
+
+Optional:
+
+- `fail_on_timeout` (Boolean) Fail on timeout if timeout is reached and cluster is not ready. (Default = true)
+- `timeout` (Number) Timeout in minutes for tanzu kubernetes creation process. A value of 0 means that no timeout is set. (Default: 60)
+- `wait_for_kubeconfig` (Boolean) Wait for kubeconfig. (Default = true)
diff --git a/examples/data-sources/tanzukubernetescluster/data-source.tf b/examples/data-sources/tanzukubernetescluster/data-source.tf
new file mode 100644
index 000000000..b915044d5
--- /dev/null
+++ b/examples/data-sources/tanzukubernetescluster/data-source.tf
@@ -0,0 +1,5 @@
+data "tanzu-mission-control_tanzu_kubernetes_cluster" "read_tanzu_cluster" {
+ name = "tanzu-cluster"
+ management_cluster_name = "tanzu-mgmt-cluster"
+ provisioner_name = "tanzu-provisioner"
+}
diff --git a/internal/provider/provider.go b/internal/provider/provider.go
index c8a3de918..57266ea94 100644
--- a/internal/provider/provider.go
+++ b/internal/provider/provider.go
@@ -95,6 +95,7 @@ func Provider() *schema.Provider {
customiamrole.ResourceName: customiamrole.ResourceCustomIAMRole(),
},
DataSourcesMap: map[string]*schema.Resource{
+ utkgresource.ResourceName: utkgresource.DataSourceTanzuKubernetesCluster(),
cluster.ResourceName: cluster.DataSourceTMCCluster(),
ekscluster.ResourceName: ekscluster.DataSourceTMCEKSCluster(),
akscluster.ResourceName: akscluster.DataSourceTMCAKSCluster(),
diff --git a/internal/resources/tanzukubernetescluster/data_source.go b/internal/resources/tanzukubernetescluster/data_source.go
new file mode 100644
index 000000000..236e9c14a
--- /dev/null
+++ b/internal/resources/tanzukubernetescluster/data_source.go
@@ -0,0 +1,64 @@
+/*
+Copyright 2022 VMware, Inc. All Rights Reserved.
+SPDX-License-Identifier: MPL-2.0
+*/
+
+package tanzukubernetescluster
+
+import (
+ "context"
+ "strings"
+
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ "github.com/pkg/errors"
+
+ "github.com/vmware/terraform-provider-tanzu-mission-control/internal/authctx"
+ "github.com/vmware/terraform-provider-tanzu-mission-control/internal/helper"
+ tanzukubernetesclustermodels "github.com/vmware/terraform-provider-tanzu-mission-control/internal/models/tanzukubernetescluster"
+)
+
+func DataSourceTanzuKubernetesCluster() *schema.Resource {
+ return &schema.Resource{
+ ReadContext: func(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ return dataSourceTanzuKubernetesClusterRead(helper.GetContextWithCaller(ctx, helper.DataRead), d, m)
+ },
+ Schema: tanzuKubernetesClusterSchema,
+ }
+}
+
+func dataSourceTanzuKubernetesClusterRead(_ context.Context, data *schema.ResourceData, m interface{}) (diags diag.Diagnostics) {
+ var (
+ resp *tanzukubernetesclustermodels.VmwareTanzuManageV1alpha1ManagementClusterProvisionerTanzukubernetesClusterData
+ )
+
+ config := m.(authctx.TanzuContext)
+ model, err := tfModelResourceConverter.ConvertTFSchemaToAPIModel(data, []string{NameKey, ProvisionerNameKey, ManagementClusterNameKey, TimeoutPolicyKey})
+
+ if err != nil {
+ return diag.FromErr(errors.Wrapf(err, "Couldn't read TKG Cluster."))
+ }
+
+ clusterFn := model.FullName
+
+ resp, err = readFullClusterResource(&config, clusterFn)
+
+ if err != nil {
+ return diag.FromErr(errors.Wrapf(err, "Couldn't read TKG cluster.\nManagement Cluster Name: %s, Provisioner: %s, Cluster Name: %s",
+ clusterFn.ManagementClusterName, clusterFn.ProvisionerName, clusterFn.Name))
+ } else if resp != nil {
+ kubernetesClusterModel := resp.TanzuKubernetesCluster
+
+ err = tfModelResourceConverter.FillTFSchema(kubernetesClusterModel, data)
+
+ if err != nil {
+ diags = diag.FromErr(err)
+ }
+
+ fullNameList := []string{kubernetesClusterModel.FullName.ManagementClusterName, kubernetesClusterModel.FullName.ProvisionerName, kubernetesClusterModel.FullName.Name}
+
+ data.SetId(strings.Join(fullNameList, "/"))
+ }
+
+ return diags
+}
diff --git a/internal/resources/tanzukubernetescluster/schema.go b/internal/resources/tanzukubernetescluster/schema.go
index 2a24b9d12..2090426e4 100644
--- a/internal/resources/tanzukubernetescluster/schema.go
+++ b/internal/resources/tanzukubernetescluster/schema.go
@@ -108,7 +108,7 @@ var provisionerNameSchema = &schema.Schema{
var specSchema = &schema.Schema{
Type: schema.TypeList,
Description: "Spec of tanzu kubernetes cluster.",
- Required: true,
+ Optional: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
diff --git a/templates/data-sources/tanzu_kubernetes_cluster.md.tmpl b/templates/data-sources/tanzu_kubernetes_cluster.md.tmpl
new file mode 100644
index 000000000..8001cf105
--- /dev/null
+++ b/templates/data-sources/tanzu_kubernetes_cluster.md.tmpl
@@ -0,0 +1,17 @@
+---
+Title: "Tanzu Kubernetes Cluster (Class-based Cluster) Data Source"
+Description: |-
+ Reading a unified Tanzu Kubernetes Grid cluster.
+---
+
+# Tanzu Kubernetes Cluster (Class-based Cluster) Data Source
+
+This data source "tanzu-mission-control_tanzu_kubernetes_cluster" enables users get the details for a TMC managed Tanzu Kubernetes Grid cluster for both Tanzu Kubernetes Grid Vsphere 2.x & Tanzu Kubernetes Grid Service 2.x.
+
+
+## Example Usage
+
+{{ tffile "examples/data-sources/tanzukubernetescluster/data-source.tf" }}
+
+
+{{ .SchemaMarkdown | trimspace }}