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

Add retrieving of clusters by name #91

Closed
wants to merge 1 commit into from
Closed
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
2 changes: 1 addition & 1 deletion client/v3/v3_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -1004,7 +1004,7 @@ func (op Operations) ListAllImage() (*ImageListIntentResponse, error) {

// ListAllCluster ...
func (op Operations) ListAllCluster() (*ClusterListIntentResponse, error) {
entities := make([]*ClusterIntentResource, 0)
entities := make([]*ClusterIntentResponse, 0)

resp, err := op.ListCluster(&DSMetadata{
Kind: utils.StringPtr("cluster"),
Expand Down
4 changes: 2 additions & 2 deletions client/v3/v3_service_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1350,8 +1350,8 @@ func TestOperations_ListCluster(t *testing.T) {
})

list := &ClusterListIntentResponse{}
list.Entities = make([]*ClusterIntentResource, 1)
list.Entities[0] = &ClusterIntentResource{}
list.Entities = make([]*ClusterIntentResponse, 1)
list.Entities[0] = &ClusterIntentResponse{}
list.Entities[0].Metadata = &Metadata{
UUID: utils.StringPtr("cfde831a-4e87-4a75-960f-89b0148aa2cc"),
Kind: utils.StringPtr("cluster"),
Expand Down
10 changes: 1 addition & 9 deletions client/v3/v3_structs.go
Original file line number Diff line number Diff line change
Expand Up @@ -1022,18 +1022,10 @@ type ImageListIntentResponse struct {
// ClusterListIntentResponse ...
type ClusterListIntentResponse struct {
APIVersion *string `json:"api_version"`
Entities []*ClusterIntentResource `json:"entities,omitempty"`
Entities []*ClusterIntentResponse `json:"entities,omitempty"`
Metadata *ListMetadataOutput `json:"metadata"`
}

// ClusterIntentResource ...
type ClusterIntentResource struct {
APIVersion *string `json:"api_version,omitempty"`
Metadata *Metadata `json:"metadata"`
Spec *Cluster `json:"spec,omitempty"`
Status *ClusterDefStatus `json:"status,omitempty"`
}

// ClusterIntentResponse ...
type ClusterIntentResponse struct {
APIVersion *string `json:"api_version,omitempty"`
Expand Down
97 changes: 67 additions & 30 deletions nutanix/data_source_nutanix_cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import (
"fmt"
"strconv"

"github.com/terraform-providers/terraform-provider-nutanix/utils"

"github.com/hashicorp/terraform/helper/schema"
v3 "github.com/terraform-providers/terraform-provider-nutanix/client/v3"
"github.com/terraform-providers/terraform-provider-nutanix/utils"
)

func dataSourceNutanixCluster() *schema.Resource {
Expand All @@ -15,7 +15,7 @@ func dataSourceNutanixCluster() *schema.Resource {
Schema: map[string]*schema.Schema{
"cluster_id": {
Type: schema.TypeString,
Required: true,
Optional: true,
},
"metadata": {
Type: schema.TypeMap,
Expand Down Expand Up @@ -100,7 +100,7 @@ func dataSourceNutanixCluster() *schema.Resource {
},
"name": {
Type: schema.TypeString,
Computed: true,
Optional: true,
},

// COMPUTED
Expand Down Expand Up @@ -584,23 +584,60 @@ func dataSourceNutanixCluster() *schema.Resource {
}
}

func findClusterByUUID(conn *v3.Client, uuid string) (*v3.ClusterIntentResponse, error) {
return conn.V3.GetCluster(uuid)
}

func findClusterByName(conn *v3.Client, name string) (*v3.ClusterIntentResponse, error) {
resp, err := conn.V3.ListAllCluster()
if err != nil {
return nil, err
}

entities := resp.Entities

found := make([]*v3.ClusterIntentResponse, 0)
for _, v := range entities {
if *v.Spec.Name == name {
found = append(found, v)
}
}

if len(found) > 1 {
return nil, fmt.Errorf("your query returned more than one result. Please use image_id argument instead")
}

if len(found) == 0 {
return nil, fmt.Errorf("image with the given name not found")
}

return found[0], nil
}

func dataSourceNutanixClusterRead(d *schema.ResourceData, meta interface{}) error {
// Get client connection
conn := meta.(*Client).API

c, ok := d.GetOk("cluster_id")
cID, cok := d.GetOk("cluster_id")
cName, nok := d.GetOk("name")

if !ok {
return fmt.Errorf("please provide the cluster_id attribute")
if !cok && !nok {
return fmt.Errorf("please provide one of cluster_id or metadata.name attribute")
}

// Make request to the API
v, err := conn.V3.GetCluster(c.(string))
if err != nil {
return err
var reqErr error
var resp *v3.ClusterIntentResponse
if cok {
resp, reqErr = findClusterByUUID(conn, cID.(string))
} else {
resp, reqErr = findClusterByName(conn, cName.(string))
}

if reqErr != nil {
return reqErr
}

m, c := setRSEntityMetadata(v.Metadata)
m, c := setRSEntityMetadata(resp.Metadata)

if err := d.Set("metadata", m); err != nil {
return err
Expand All @@ -609,30 +646,30 @@ func dataSourceNutanixClusterRead(d *schema.ResourceData, meta interface{}) erro
return err
}

if err := d.Set("api_version", utils.StringValue(v.APIVersion)); err != nil {
if err := d.Set("api_version", utils.StringValue(resp.APIVersion)); err != nil {
return err
}

if err := d.Set("project_reference", flattenReferenceValues(v.Metadata.ProjectReference)); err != nil {
if err := d.Set("project_reference", flattenReferenceValues(resp.Metadata.ProjectReference)); err != nil {
return err
}

if err := d.Set("owner_reference", flattenReferenceValues(v.Metadata.OwnerReference)); err != nil {
if err := d.Set("owner_reference", flattenReferenceValues(resp.Metadata.OwnerReference)); err != nil {
return err
}

if err := d.Set("name", utils.StringValue(v.Status.Name)); err != nil {
if err := d.Set("name", utils.StringValue(resp.Status.Name)); err != nil {
return err
}
if err := d.Set("state", utils.StringValue(v.Status.State)); err != nil {
if err := d.Set("state", utils.StringValue(resp.Status.State)); err != nil {
return err
}

nodes := make([]map[string]interface{}, 0)
if v.Status.Resources.Nodes != nil {
if v.Status.Resources.Nodes.HypervisorServerList != nil {
nodes = make([]map[string]interface{}, len(v.Status.Resources.Nodes.HypervisorServerList))
for k, v := range v.Status.Resources.Nodes.HypervisorServerList {
if resp.Status.Resources.Nodes != nil {
if resp.Status.Resources.Nodes.HypervisorServerList != nil {
nodes = make([]map[string]interface{}, len(resp.Status.Resources.Nodes.HypervisorServerList))
for k, v := range resp.Status.Resources.Nodes.HypervisorServerList {
node := make(map[string]interface{})
node["ip"] = utils.StringValue(v.IP)
node["version"] = utils.StringValue(v.Version)
Expand All @@ -645,7 +682,7 @@ func dataSourceNutanixClusterRead(d *schema.ResourceData, meta interface{}) erro
return err
}

config := v.Status.Resources.Config
config := resp.Status.Resources.Config
if err := d.Set("gpu_driver_version", utils.StringValue(config.GpuDriverVersion)); err != nil {
return err
}
Expand Down Expand Up @@ -821,7 +858,7 @@ func dataSourceNutanixClusterRead(d *schema.ResourceData, meta interface{}) erro
return err
}

network := v.Status.Resources.Network
network := resp.Status.Resources.Network
if err := d.Set("masquerading_port", utils.Int64Value(network.MasqueradingPort)); err != nil {
return err
}
Expand Down Expand Up @@ -972,18 +1009,18 @@ func dataSourceNutanixClusterRead(d *schema.ResourceData, meta interface{}) erro
}

analysis := make(map[string]interface{})
if v.Status.Resources.Analysis != nil {
analysis["bully_vm_num"] = utils.StringValue(v.Status.Resources.Analysis.VMEfficiencyMap.BullyVMNum)
analysis["constrained_vm_num"] = utils.StringValue(v.Status.Resources.Analysis.VMEfficiencyMap.ConstrainedVMNum)
analysis["dead_vm_num"] = utils.StringValue(v.Status.Resources.Analysis.VMEfficiencyMap.DeadVMNum)
analysis["inefficient_vm_num"] = utils.StringValue(v.Status.Resources.Analysis.VMEfficiencyMap.InefficientVMNum)
analysis["overprovisioned_vm_num"] = utils.StringValue(v.Status.Resources.Analysis.VMEfficiencyMap.OverprovisionedVMNum)
if resp.Status.Resources.Analysis != nil {
analysis["bully_vm_num"] = utils.StringValue(resp.Status.Resources.Analysis.VMEfficiencyMap.BullyVMNum)
analysis["constrained_vm_num"] = utils.StringValue(resp.Status.Resources.Analysis.VMEfficiencyMap.ConstrainedVMNum)
analysis["dead_vm_num"] = utils.StringValue(resp.Status.Resources.Analysis.VMEfficiencyMap.DeadVMNum)
analysis["inefficient_vm_num"] = utils.StringValue(resp.Status.Resources.Analysis.VMEfficiencyMap.InefficientVMNum)
analysis["overprovisioned_vm_num"] = utils.StringValue(resp.Status.Resources.Analysis.VMEfficiencyMap.OverprovisionedVMNum)
}
if err := d.Set("analysis_vm_efficiency_map", analysis); err != nil {
return err
}

d.SetId(utils.StringValue(v.Metadata.UUID))
d.SetId(utils.StringValue(resp.Metadata.UUID))

return nil
}