Skip to content

Commit

Permalink
Switch data sources to new API
Browse files Browse the repository at this point in the history
Signed-off-by: Stoyan Zhelyazkov <[email protected]>
  • Loading branch information
spacegospod committed Jul 30, 2024
1 parent ff6afa5 commit 3b1f159
Show file tree
Hide file tree
Showing 20 changed files with 223 additions and 188 deletions.
98 changes: 56 additions & 42 deletions internal/cluster/cluster_operations.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,16 @@ import (
"fmt"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/vmware/terraform-provider-vcf/internal/api_client"
"github.com/vmware/terraform-provider-vcf/internal/constants"
"github.com/vmware/terraform-provider-vcf/internal/datastores"
"github.com/vmware/terraform-provider-vcf/internal/network"
"github.com/vmware/terraform-provider-vcf/internal/resource_utils"
validationUtils "github.com/vmware/terraform-provider-vcf/internal/validation"
"github.com/vmware/vcf-sdk-go/client"
"github.com/vmware/vcf-sdk-go/client/clusters"
"github.com/vmware/vcf-sdk-go/client/domains"
"github.com/vmware/vcf-sdk-go/client/hosts"
"github.com/vmware/vcf-sdk-go/models"
"github.com/vmware/vcf-sdk-go/vcf"
"sort"
)

Expand Down Expand Up @@ -356,70 +356,83 @@ func tryConvertToClusterDatastoreSpec(object map[string]interface{}, clusterName
return result, nil
}

func FlattenCluster(ctx context.Context, clusterObj *models.Cluster, apiClient *client.VcfClient) (*map[string]interface{}, error) {
func FlattenCluster(ctx context.Context, clusterObj *vcf.Cluster, apiClient *vcf.ClientWithResponses) (*map[string]interface{}, error) {
result := make(map[string]interface{})
if clusterObj == nil {
return &result, nil
}

result["id"] = clusterObj.ID
result["id"] = clusterObj.Id
result["name"] = clusterObj.Name
result["primary_datastore_name"] = clusterObj.PrimaryDatastoreName
result["primary_datastore_type"] = clusterObj.PrimaryDatastoreType
result["is_default"] = clusterObj.IsDefault
result["is_stretched"] = clusterObj.IsStretched

flattenedVdsSpecs := getFlattenedVdsSpecsForRefs(clusterObj.VdsSpecs)
result["vds"] = flattenedVdsSpecs
if clusterObj.VdsSpecs != nil {
flattenedVdsSpecs := getFlattenedVdsSpecsForRefs(*clusterObj.VdsSpecs)
result["vds"] = flattenedVdsSpecs
}

flattenedHostSpecs, err := getFlattenedHostSpecsForRefs(ctx, clusterObj.Hosts, apiClient)
if err != nil {
return nil, err
if clusterObj.Hosts != nil {
flattenedHostSpecs, err := getFlattenedHostSpecsForRefs(ctx, *clusterObj.Hosts, apiClient)
if err != nil {
return nil, err
}
result["host"] = flattenedHostSpecs
}
result["host"] = flattenedHostSpecs

return &result, nil
}

func ImportCluster(ctx context.Context, data *schema.ResourceData, apiClient *client.VcfClient,
func ImportCluster(ctx context.Context, data *schema.ResourceData, apiClient *vcf.ClientWithResponses,
clusterId string) ([]*schema.ResourceData, error) {
getClusterParams := clusters.NewGetClusterParamsWithContext(ctx).
WithTimeout(constants.DefaultVcfApiCallTimeout)
getClusterParams.ID = clusterId
clusterResult, err := apiClient.Clusters.GetCluster(getClusterParams)
clusterRes, err := apiClient.GetClusterWithResponse(ctx, clusterId)
if err != nil {
return nil, err
}
clusterObj := clusterResult.Payload
if clusterRes.StatusCode() != 200 {
vcfError := api_client.GetError(clusterRes.Body)
return nil, fmt.Errorf(*vcfError.Message)
}

clusterObj := clusterRes.JSON200

data.SetId(clusterObj.ID)
data.SetId(*clusterObj.Id)
_ = data.Set("name", clusterObj.Name)
_ = data.Set("primary_datastore_name", clusterObj.PrimaryDatastoreName)
_ = data.Set("primary_datastore_type", clusterObj.PrimaryDatastoreType)
_ = data.Set("is_default", clusterObj.IsDefault)
_ = data.Set("is_stretched", clusterObj.IsStretched)
flattenedVdsSpecs := getFlattenedVdsSpecsForRefs(clusterObj.VdsSpecs)
_ = data.Set("vds", flattenedVdsSpecs)
if clusterObj.VdsSpecs != nil {
flattenedVdsSpecs := getFlattenedVdsSpecsForRefs(*clusterObj.VdsSpecs)
_ = data.Set("vds", flattenedVdsSpecs)
}

flattenedHostSpecs, err := getFlattenedHostSpecsForRefs(ctx, clusterObj.Hosts, apiClient)
if err != nil {
return nil, err
if clusterObj.Hosts != nil {
flattenedHostSpecs, err := getFlattenedHostSpecsForRefs(ctx, *clusterObj.Hosts, apiClient)
if err != nil {
return nil, err
}
_ = data.Set("host", flattenedHostSpecs)
}
_ = data.Set("host", flattenedHostSpecs)

//get all domains and find our cluster to set the "domain_id" attribute, because
// get all domains and find our cluster to set the "domain_id" attribute, because
// cluster API doesn't provide parent domain ID.
getDomainsParams := domains.NewGetDomainsParamsWithTimeout(constants.DefaultVcfApiCallTimeout).
WithContext(ctx)
domainsResult, err := apiClient.Domains.GetDomains(getDomainsParams)
getDomainsParams := &vcf.GetDomainsParams{}
domainsRes, err := apiClient.GetDomainsWithResponse(ctx, getDomainsParams)
if err != nil {
return nil, err
}
allDomains := domainsResult.Payload.Elements
if domainsRes.StatusCode() != 200 {
vcfError := api_client.GetError(domainsRes.Body)
return nil, fmt.Errorf(*vcfError.Message)
}
allDomains := *domainsRes.JSON200.Elements
for _, domain := range allDomains {
for _, clusterRef := range domain.Clusters {
if *clusterRef.ID == clusterId {
_ = data.Set("domain_id", domain.ID)
for _, clusterRef := range *domain.Clusters {
if clusterRef.Id == clusterId {
_ = data.Set("domain_id", domain.Id)
}
}
}
Expand All @@ -430,33 +443,34 @@ func ImportCluster(ctx context.Context, data *schema.ResourceData, apiClient *cl
// getFlattenedHostSpecsForRefs The HostRef is supposed to have all the relevant information,
// but the backend returns everything as nil except the host ID which forces us to make a separate request
// to get some useful info about the hosts in the cluster.
func getFlattenedHostSpecsForRefs(ctx context.Context, hostRefs []*models.HostReference,
apiClient *client.VcfClient) ([]map[string]interface{}, error) {
func getFlattenedHostSpecsForRefs(ctx context.Context, hostRefs []vcf.HostReference,
apiClient *vcf.ClientWithResponses) ([]map[string]interface{}, error) {
flattenedHostSpecs := *new([]map[string]interface{})
// Sort for reproducibility
sort.SliceStable(hostRefs, func(i, j int) bool {
return hostRefs[i].ID < hostRefs[j].ID
return *hostRefs[i].Id < *hostRefs[j].Id
})
for _, hostRef := range hostRefs {
getHostParams := hosts.NewGetHostParamsWithContext(ctx).
WithTimeout(constants.DefaultVcfApiCallTimeout)
getHostParams.ID = hostRef.ID
getHostResult, err := apiClient.Hosts.GetHost(getHostParams)
res, err := apiClient.GetHostWithResponse(ctx, *hostRef.Id)
if err != nil {
return nil, err
}
hostObj := getHostResult.Payload
flattenedHostSpecs = append(flattenedHostSpecs, *FlattenHost(hostObj))
if res.StatusCode() != 200 {
vcfError := api_client.GetError(res.Body)
return nil, fmt.Errorf(*vcfError.Message)
}
hostObj := res.JSON200
flattenedHostSpecs = append(flattenedHostSpecs, *FlattenHost(*hostObj))
}
return flattenedHostSpecs, nil
}

func getFlattenedVdsSpecsForRefs(vdsSpecs []*models.VdsSpec) []map[string]interface{} {
func getFlattenedVdsSpecsForRefs(vdsSpecs []vcf.VdsSpec) []map[string]interface{} {
flattenedVdsSpecs := *new([]map[string]interface{})
// Since backend API returns objects in random order sort VDSSpec list to ensure
// import is reproducible
sort.SliceStable(vdsSpecs, func(i, j int) bool {
return *vdsSpecs[i].Name < *vdsSpecs[j].Name
return vdsSpecs[i].Name < vdsSpecs[j].Name
})
for _, vdsSpec := range vdsSpecs {
flattenedVdsSpecs = append(flattenedVdsSpecs, network.FlattenVdsSpec(vdsSpec))
Expand Down
13 changes: 6 additions & 7 deletions internal/cluster/host_spec_subresource.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"github.com/vmware/terraform-provider-vcf/internal/network"
validationutils "github.com/vmware/terraform-provider-vcf/internal/validation"
"github.com/vmware/vcf-sdk-go/models"
"github.com/vmware/vcf-sdk-go/vcf"
)

// HostSpecSchema this helper function extracts the Host
Expand Down Expand Up @@ -97,15 +98,13 @@ func FlattenHostReference(host *models.HostReference) *map[string]interface{} {
return &result
}

func FlattenHost(host *models.Host) *map[string]interface{} {
func FlattenHost(host vcf.Host) *map[string]interface{} {
result := make(map[string]interface{})
if host == nil {
return &result
}
result["id"] = host.ID
result["id"] = host.Id
result["host_name"] = host.Fqdn
if len(host.IPAddresses) > 0 && host.IPAddresses[0] != nil {
result["ip_address"] = host.IPAddresses[0].IPAddress
ipAddresses := *host.IpAddresses
if len(ipAddresses) > 0 {
result["ip_address"] = ipAddresses[0].IpAddress
}

return &result
Expand Down
41 changes: 22 additions & 19 deletions internal/credentials/credential_operations.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,82 +9,85 @@ import (
"github.com/go-openapi/strfmt"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/vmware/terraform-provider-vcf/internal/api_client"
"github.com/vmware/vcf-sdk-go/client"
"github.com/vmware/vcf-sdk-go/client/credentials"
"github.com/vmware/vcf-sdk-go/models"
"github.com/vmware/vcf-sdk-go/vcf"
"io"
"log"
"strconv"
"strings"
)

func ReadCredentials(ctx context.Context, data *schema.ResourceData, apiClient *client.VcfClient) ([]*models.Credential, error) {
getCredentialsParam := credentials.NewGetCredentialsParamsWithContext(ctx)
func ReadCredentials(ctx context.Context, data *schema.ResourceData, apiClient *vcf.ClientWithResponses) ([]vcf.Credential, error) {
getCredentialsParam := &vcf.GetCredentialsParams{}
resourceName, nameOk := data.Get("resource_name").(string)
if nameOk && len(resourceName) > 0 {
getCredentialsParam.WithResourceName(&resourceName)
getCredentialsParam.ResourceName = &resourceName
}

ip, ipOk := data.Get("resource_ip").(string)
if ipOk && len(ip) > 0 {
getCredentialsParam.WithResourceIP(&ip)
getCredentialsParam.ResourceIp = &ip
}

resType, resTypeOK := data.Get("resource_type").(string)
if resTypeOK && len(resType) > 0 {
getCredentialsParam.WithResourceType(&resType)
getCredentialsParam.ResourceType = &resType
}

domainName, domainNameOk := data.Get("domain_name").(string)
if domainNameOk && len(domainName) > 0 {
getCredentialsParam.WithDomainName(&domainName)
getCredentialsParam.DomainName = &domainName
}

accountType, accountTypeOk := data.Get("account_type").(string)
if accountTypeOk && len(accountType) > 0 {
getCredentialsParam.WithAccountType(&accountType)
getCredentialsParam.AccountType = &accountType
}

page, pageOk := data.Get("page").(int)
if pageOk && page > 0 {
pageNum := strconv.Itoa(page)
getCredentialsParam.WithPageNumber(&pageNum)
getCredentialsParam.PageNumber = &pageNum
}

pageSize, pageSizeOk := data.Get("page_size").(int)
if pageSizeOk && pageSize > 0 {
pageSizeNum := strconv.Itoa(pageSize)
getCredentialsParam.WithPageSize(&pageSizeNum)
getCredentialsParam.PageSize = &pageSizeNum
}

creds, err := apiClient.Credentials.GetCredentials(getCredentialsParam)
res, err := apiClient.GetCredentialsWithResponse(ctx, getCredentialsParam)
if err != nil {
return nil, err
}

result := creds.Payload.Elements
if res.StatusCode() != 200 {
vcfError := api_client.GetError(res.Body)
return nil, fmt.Errorf(*vcfError.Message)
}

return result, nil
return *res.JSON200.Elements, nil
}

func FlattenCredentials(creds []*models.Credential) []map[string]interface{} {
func FlattenCredentials(creds []vcf.Credential) []map[string]interface{} {
credsArray := make([]map[string]interface{}, 0)

for _, entry := range creds {
entryMap := map[string]interface{}{
"id": entry.ID,
"id": entry.Id,
"account_type": entry.AccountType,
"creation_time": entry.CreationTimestamp,
"credential_type": entry.CredentialType,
"modification_time": entry.ModificationTimestamp,
"user_name": entry.Username,
"password": entry.Password,
"resource": []map[string]string{{
"id": *entry.Resource.ResourceID,
"id": entry.Resource.ResourceId,
"domain": *entry.Resource.DomainName,
"ip": *entry.Resource.ResourceIP,
"name": *entry.Resource.ResourceName,
"type": *entry.Resource.ResourceType,
"ip": entry.Resource.ResourceIp,
"name": entry.Resource.ResourceName,
"type": entry.Resource.ResourceType,
}},
}

Expand Down
Loading

0 comments on commit 3b1f159

Please sign in to comment.