From 69073b9ddf5550ca2e964584ef058d0dfb9e83bb Mon Sep 17 00:00:00 2001 From: warroyo Date: Mon, 11 Nov 2024 20:25:41 -0700 Subject: [PATCH 1/2] adding data source for utkg clusters Signed-off-by: warroyo --- docs/data-sources/tanzu_kubernetes_cluster.md | 206 ++++++++++++++++++ .../tanzukubernetescluster/data-source.tf | 5 + internal/provider/provider.go | 1 + .../tanzukubernetescluster/data_source.go | 64 ++++++ .../tanzukubernetescluster/schema.go | 2 +- .../tanzu_kubernetes_cluster.md.tmpl | 17 ++ 6 files changed, 294 insertions(+), 1 deletion(-) create mode 100644 docs/data-sources/tanzu_kubernetes_cluster.md create mode 100644 examples/data-sources/tanzukubernetescluster/data-source.tf create mode 100644 internal/resources/tanzukubernetescluster/data_source.go create mode 100644 templates/data-sources/tanzu_kubernetes_cluster.md.tmpl 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..62a92421e --- /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(ctx 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 }} From 45d51f94985e71247b069b69b6219bae5b47edd5 Mon Sep 17 00:00:00 2001 From: warroyo Date: Mon, 11 Nov 2024 20:34:08 -0700 Subject: [PATCH 2/2] fixing golint and removing unused var Signed-off-by: warroyo --- internal/resources/tanzukubernetescluster/data_source.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/resources/tanzukubernetescluster/data_source.go b/internal/resources/tanzukubernetescluster/data_source.go index 62a92421e..236e9c14a 100644 --- a/internal/resources/tanzukubernetescluster/data_source.go +++ b/internal/resources/tanzukubernetescluster/data_source.go @@ -27,7 +27,7 @@ func DataSourceTanzuKubernetesCluster() *schema.Resource { } } -func dataSourceTanzuKubernetesClusterRead(ctx context.Context, data *schema.ResourceData, m interface{}) (diags diag.Diagnostics) { +func dataSourceTanzuKubernetesClusterRead(_ context.Context, data *schema.ResourceData, m interface{}) (diags diag.Diagnostics) { var ( resp *tanzukubernetesclustermodels.VmwareTanzuManageV1alpha1ManagementClusterProvisionerTanzukubernetesClusterData )