From 91e9c5dc3d046d8ad84e695b8c05a8cb71ea5379 Mon Sep 17 00:00:00 2001 From: Dainius Serplis Date: Thu, 21 Nov 2024 11:41:32 +0200 Subject: [PATCH] Recalibrate 'vcd_vcenter' data source to be backwards compatible Signed-off-by: Dainius Serplis --- .changes/v4.0.0/1343-features.md | 2 +- vcd/datasource_vcd_vcenter.go | 46 ++++++++++++++++++++++++++-- vcd/resource_vcd_vcenter.go | 23 +++++++++++--- website/docs/r/vcenter.html.markdown | 3 +- 4 files changed, 66 insertions(+), 8 deletions(-) diff --git a/.changes/v4.0.0/1343-features.md b/.changes/v4.0.0/1343-features.md index ffd5e9090..d7677ddeb 100644 --- a/.changes/v4.0.0/1343-features.md +++ b/.changes/v4.0.0/1343-features.md @@ -1,3 +1,3 @@ -* **New Resource:** `vcd_vcenter` to manage vCenter servers [GH-1343, GH-1348] +* **New Resource:** `vcd_vcenter` to manage vCenter servers [GH-1343, GH-1348, GH-1355] * **New Resource:** `vcd_tm_nsxt_manager` to manage NSX-T Managers [GH-1343, GH-1355] * **New Data Source:** `vcd_tm_nsxt_manager` to manage NSX-T Managers [GH-1343, GH-1355] diff --git a/vcd/datasource_vcd_vcenter.go b/vcd/datasource_vcd_vcenter.go index 11e22ea16..62ee1a1a8 100644 --- a/vcd/datasource_vcd_vcenter.go +++ b/vcd/datasource_vcd_vcenter.go @@ -3,6 +3,7 @@ package vcd import ( "context" "fmt" + "net/url" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" @@ -57,7 +58,7 @@ func datasourceVcdVcenter() *schema.Resource { Computed: true, Description: fmt.Sprintf("Mode of %s", labelVirtualCenter), }, - "listener_state": { + "connection_status": { Type: schema.TypeString, Computed: true, Description: fmt.Sprintf("Listener state of %s", labelVirtualCenter), @@ -67,7 +68,7 @@ func datasourceVcdVcenter() *schema.Resource { Computed: true, Description: fmt.Sprintf("Mode of %s", labelVirtualCenter), }, - "version": { + "vcenter_version": { Type: schema.TypeString, Computed: true, Description: fmt.Sprintf("Version of %s", labelVirtualCenter), @@ -77,12 +78,26 @@ func datasourceVcdVcenter() *schema.Resource { Computed: true, Description: fmt.Sprintf("%s UUID", labelVirtualCenter), }, + "vcenter_host": { + Type: schema.TypeString, + Computed: true, + Description: fmt.Sprintf("%s hostname", labelVirtualCenter), + }, + "status": { + Type: schema.TypeString, + Computed: true, + Description: "vCenter status", + }, }, } } func datasourceVcdVcenterRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { vcdClient := meta.(*VCDClient) + if err := classicVcdVcenterReadStatus(vcdClient, d); err != nil { + return err + } + c := crudConfig[*govcd.VCenter, types.VSphereVirtualCenter]{ entityLabel: labelVirtualCenter, getEntityFunc: vcdClient.GetVCenterByName, @@ -90,3 +105,30 @@ func datasourceVcdVcenterRead(ctx context.Context, d *schema.ResourceData, meta } return readDatasource(ctx, d, meta, c) } + +// classicVcdVcenterReadStatus +func classicVcdVcenterReadStatus(vcdClient *VCDClient, d *schema.ResourceData) diag.Diagnostics { + if vcdClient.Client.IsTm() { + return nil + } + vCenterName := d.Get("name").(string) + + vcs, err := govcd.QueryVirtualCenters(vcdClient.VCDClient, "name=="+url.QueryEscape(vCenterName)) + if err != nil { + return diag.Errorf("error occurred while querying vCenters: %s", err) + } + + if len(vcs) == 0 { + return diag.Errorf("%s: could not identify single vCenter. Got %d with name '%s'", + govcd.ErrorEntityNotFound, len(vcs), vCenterName) + } + + if len(vcs) > 1 { + return diag.Errorf("could not identify single vCenter. Got %d with name '%s'", + len(vcs), vCenterName) + } + + d.Set("status", vcs[0].Status) + + return nil +} diff --git a/vcd/resource_vcd_vcenter.go b/vcd/resource_vcd_vcenter.go index 9f52bb408..2432efc9a 100644 --- a/vcd/resource_vcd_vcenter.go +++ b/vcd/resource_vcd_vcenter.go @@ -88,7 +88,7 @@ func resourceVcdVcenter() *schema.Resource { Computed: true, Description: fmt.Sprintf("Mode of %s", labelVirtualCenter), }, - "listener_state": { + "connection_status": { Type: schema.TypeString, Computed: true, Description: fmt.Sprintf("Listener state of %s", labelVirtualCenter), @@ -98,7 +98,7 @@ func resourceVcdVcenter() *schema.Resource { Computed: true, Description: fmt.Sprintf("Mode of %s", labelVirtualCenter), }, - "version": { + "vcenter_version": { Type: schema.TypeString, Computed: true, Description: fmt.Sprintf("Version of %s", labelVirtualCenter), @@ -108,6 +108,16 @@ func resourceVcdVcenter() *schema.Resource { Computed: true, Description: fmt.Sprintf("%s UUID", labelVirtualCenter), }, + "vcenter_host": { + Type: schema.TypeString, + Computed: true, + Description: fmt.Sprintf("%s hostname", labelVirtualCenter), + }, + "status": { + Type: schema.TypeString, + Computed: true, + Description: "vCenter status", + }, }, } } @@ -140,10 +150,15 @@ func setTmVcenterData(d *schema.ResourceData, v *govcd.VCenter) error { dSet(d, "has_proxy", v.VSphereVCenter.HasProxy) dSet(d, "is_connected", v.VSphereVCenter.IsConnected) dSet(d, "mode", v.VSphereVCenter.Mode) - dSet(d, "listener_state", v.VSphereVCenter.ListenerState) + dSet(d, "connection_status", v.VSphereVCenter.ListenerState) dSet(d, "cluster_health_status", v.VSphereVCenter.ClusterHealthStatus) - dSet(d, "version", v.VSphereVCenter.VcVersion) + dSet(d, "vcenter_version", v.VSphereVCenter.VcVersion) dSet(d, "uuid", v.VSphereVCenter.Uuid) + host, err := url.Parse(v.VSphereVCenter.Url) + if err != nil { + return fmt.Errorf("error parsing URL for storing 'vcenter_host': %s", err) + } + dSet(d, "vcenter_host", host.Host) d.SetId(v.VSphereVCenter.VcId) diff --git a/website/docs/r/vcenter.html.markdown b/website/docs/r/vcenter.html.markdown index 7b4c64074..b07b1f5b8 100644 --- a/website/docs/r/vcenter.html.markdown +++ b/website/docs/r/vcenter.html.markdown @@ -61,11 +61,12 @@ The following attributes are exported on this resource: * `is_connected` - Defines if the vCenter server is connected. * `mode` - One of `NONE`, `IAAS` (scoped to the provider), `SDDC` (scoped to tenants), `MIXED` (both uses are possible) -* `listener_state` - `INITIAL`, `INVALID_SETTINGS`, `UNSUPPORTED`, `DISCONNECTED`, `CONNECTING`, +* `connection_status` - `INITIAL`, `INVALID_SETTINGS`, `UNSUPPORTED`, `DISCONNECTED`, `CONNECTING`, `CONNECTED_SYNCING`, `CONNECTED`, `STOP_REQ`, `STOP_AND_PURGE_REQ`, `STOP_ACK` * `cluster_health_status` - Cluster health status. One of `GRAY` , `RED` , `YELLOW` , `GREEN` * `version` - vCenter version * `uuid` - UUID of vCenter +* `vcenter_host` - Host of Vcenter server ## Importing