Skip to content

Commit

Permalink
improved the data source filter
Browse files Browse the repository at this point in the history
Added a new way to filter and sort the datasource
Update the documentation for the data source, instance_size, kubernetes_version, template
  • Loading branch information
alejandrojnm committed Apr 24, 2020
2 parents 2ba9c9e + ff4dbca commit 197425b
Show file tree
Hide file tree
Showing 15 changed files with 986 additions and 305 deletions.
2 changes: 1 addition & 1 deletion .goreleaser.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ changelog:
- Merge pull request
- Merge branch
archives:
- name_template: '{{ .ProjectName }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}'
- name_template: '{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}'
format_overrides:
- goos: windows
format: zip
32 changes: 0 additions & 32 deletions civo/datasource_common_schema.go

This file was deleted.

8 changes: 0 additions & 8 deletions civo/datasource_common_struct.go

This file was deleted.

157 changes: 42 additions & 115 deletions civo/datasource_intances_size.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,15 @@ package civo
import (
"fmt"
"github.com/civo/civogo"
"github.com/civo/terraform-provider-civo/internal/datalist"
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
"log"
"regexp"
"strconv"
)

// Data source to get and filter all instances size
// use to define the size in resourceInstance
func dataSourceInstancesSize() *schema.Resource {
return &schema.Resource{
Read: dataSourceInstancesSizeRead,
Schema: map[string]*schema.Schema{
"filter": dataSourceFiltersSchema(),
// computed attributes
dataListConfig := &datalist.ResourceConfig{
RecordSchema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Computed: true,
Expand Down Expand Up @@ -46,125 +41,57 @@ func dataSourceInstancesSize() *schema.Resource {
Computed: true,
},
},
FilterKeys: []string{
"name",
"nice_name",
"cpu_cores",
"ram_mb",
"disk_gb",
"selectable",
},
SortKeys: []string{
"cpu_cores",
"ram_mb",
"disk_gb",
"selectable",
},
ResultAttributeName: "sizes",
FlattenRecord: flattenInstancesSize,
GetRecords: getInstancesSizes,
}

return datalist.NewResource(dataListConfig)

}

func dataSourceInstancesSizeRead(d *schema.ResourceData, m interface{}) error {
func getInstancesSizes(m interface{}) ([]interface{}, error) {
apiClient := m.(*civogo.Client)

filters, filtersOk := d.GetOk("filter")

if !filtersOk {
return fmt.Errorf("one of filters must be assigned")
sizes := []interface{}{}
partialSizes, err := apiClient.ListInstanceSizes()
if err != nil {
return nil, fmt.Errorf("[ERR] error retrieving sizes: %s", err)
}

if filtersOk {
log.Printf("[INFO] Getting the instances size")
resp, err := apiClient.ListInstanceSizes()
if err != nil {
return fmt.Errorf("no instances size was found in the server")
}

log.Printf("[INFO] Finding the size of the instances")
size, err := findInstancesSizeByFilter(resp, filters.(*schema.Set))
if err != nil {
return fmt.Errorf("no instances size was found in the server, %s", err)
}

d.SetId(size.ID)
d.Set("name", size.Name)
d.Set("nice_name", size.NiceName)
d.Set("cpu_cores", size.CPUCores)
d.Set("ram_mb", size.RAMMegabytes)
d.Set("disk_gb", size.DiskGigabytes)
d.Set("description", size.Description)
d.Set("selectable", size.Selectable)
for _, partialSize := range partialSizes {
sizes = append(sizes, partialSize)
}

return nil
return sizes, nil
}

func findInstancesSizeByFilter(sizes []civogo.InstanceSize, set *schema.Set) (*civogo.InstanceSize, error) {
results := make([]civogo.InstanceSize, 0)
func flattenInstancesSize(size, m interface{}) (map[string]interface{}, error) {

var filters []Filter

for _, v := range set.List() {
m := v.(map[string]interface{})
var filterValues []string
for _, e := range m["values"].([]interface{}) {
filterValues = append(filterValues, e.(string))
}
filters = append(filters, Filter{Name: m["name"].(string), Values: filterValues, Regex: m["regex"].(bool)})
}
s := size.(civogo.InstanceSize)

for _, valueFilters := range filters {
for _, valueSize := range sizes {
flattenedSize := map[string]interface{}{}
flattenedSize["name"] = s.Name
flattenedSize["nice_name"] = s.NiceName
flattenedSize["cpu_cores"] = s.CPUCores
flattenedSize["ram_mb"] = s.RAMMegabytes
flattenedSize["disk_gb"] = s.DiskGigabytes
flattenedSize["description"] = s.Description
flattenedSize["selectable"] = s.Selectable

// filter for the name
if valueFilters.Name == "name" {
if valueFilters.Regex {
r, _ := regexp.Compile(valueFilters.Values[0])
if r.MatchString(valueSize.Name) {
results = append(results, valueSize)
}
} else {
if valueSize.Name == valueFilters.Values[0] {
results = append(results, valueSize)
}
}
}

// filter for the CPU
if valueFilters.Name == "cpu" {
if valueFilters.Regex {
r, _ := regexp.Compile(valueFilters.Values[0])
if r.MatchString(strconv.Itoa(valueSize.CPUCores)) {
results = append(results, valueSize)
}
} else {
if strconv.Itoa(valueSize.CPUCores) == valueFilters.Values[0] {
results = append(results, valueSize)
}
}
}

// filter for the RAM
if valueFilters.Name == "ram" {
if valueFilters.Regex {
r, _ := regexp.Compile(valueFilters.Values[0])
if r.MatchString(strconv.Itoa(valueSize.RAMMegabytes)) {
results = append(results, valueSize)
}
} else {
if strconv.Itoa(valueSize.RAMMegabytes) == valueFilters.Values[0] {
results = append(results, valueSize)
}
}
}

// filter for the Disk
if valueFilters.Name == "disk" {
if valueFilters.Regex {
r, _ := regexp.Compile(valueFilters.Values[0])
if r.MatchString(strconv.Itoa(valueSize.DiskGigabytes)) {
results = append(results, valueSize)
}
} else {
if strconv.Itoa(valueSize.DiskGigabytes) == valueFilters.Values[0] {
results = append(results, valueSize)
}
}
}

}
}

if len(results) == 1 {
return &results[0], nil
}
if len(results) == 0 {
return nil, fmt.Errorf("no instances sizes found for your search")
}
return nil, fmt.Errorf("too many instances sizes found (found %d, expected 1)", len(results))
return flattenedSize, nil
}
103 changes: 34 additions & 69 deletions civo/datasource_kubernetes_version.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,16 @@ package civo
import (
"fmt"
"github.com/civo/civogo"
"github.com/civo/terraform-provider-civo/internal/datalist"
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
"log"
)

// Data source to get and filter all kubernetes version
// available in the server, use to define the version at the
// moment of the cluster creation in resourceKubernetesCluster
func dataSourceKubernetesVersion() *schema.Resource {
return &schema.Resource{
Read: dataSourceKubernetesVersionRead,
Schema: map[string]*schema.Schema{
"filter": dataSourceFiltersSchema(),
// computed attributes
dataListConfig := &datalist.ResourceConfig{
RecordSchema: map[string]*schema.Schema{
"version": {
Type: schema.TypeString,
Computed: true,
Expand All @@ -29,83 +26,51 @@ func dataSourceKubernetesVersion() *schema.Resource {
Computed: true,
},
"default": {
Type: schema.TypeString,
Type: schema.TypeBool,
Computed: true,
},
},
FilterKeys: []string{
"version",
"label",
"type",
"default",
},
SortKeys: []string{
"version",
},
ResultAttributeName: "versions",
FlattenRecord: flattenKubernetesVersion,
GetRecords: getKubernetesVersions,
}

return datalist.NewResource(dataListConfig)
}

func dataSourceKubernetesVersionRead(d *schema.ResourceData, m interface{}) error {
func getKubernetesVersions(m interface{}) ([]interface{}, error) {
apiClient := m.(*civogo.Client)

filters, filtersOk := d.GetOk("filter")

if !filtersOk {
return fmt.Errorf("one of filters must be assigned")
versions := []interface{}{}
partialVersions, err := apiClient.ListAvailableKubernetesVersions()
if err != nil {
return nil, fmt.Errorf("[ERR] error retrieving all versions: %s", err)
}

if filtersOk {
log.Printf("[INFO] Getting all versions of kubernetes")
resp, err := apiClient.ListAvailableKubernetesVersions()
if err != nil {
return fmt.Errorf("no version was found in the server")
}

log.Printf("[INFO] Finding the version of kubernetes")
version, err := findKubernetesVersionByFilter(resp, filters.(*schema.Set))
if err != nil {
return fmt.Errorf("no version was found in the server, %s", err)
}

d.SetId(version.Version)
d.Set("version", version.Version)
d.Set("label", fmt.Sprintf("v%s", version.Version))
d.Set("type", version.Type)
d.Set("default", version.Default)
for _, partialSize := range partialVersions {
versions = append(versions, partialSize)
}

return nil
return versions, nil
}

func findKubernetesVersionByFilter(version []civogo.KubernetesVersion, set *schema.Set) (*civogo.KubernetesVersion, error) {
results := make([]civogo.KubernetesVersion, 0)
func flattenKubernetesVersion(version, m interface{}) (map[string]interface{}, error) {

var filters []Filter
s := version.(civogo.KubernetesVersion)

for _, v := range set.List() {
m := v.(map[string]interface{})
var filterValues []string
for _, e := range m["values"].([]interface{}) {
filterValues = append(filterValues, e.(string))
}
filters = append(filters, Filter{Name: m["name"].(string), Values: filterValues, Regex: m["regex"].(bool)})
}

for _, valueFilters := range filters {
for _, valueVersion := range version {

// Filter for version
if valueFilters.Name == "version" {
if valueVersion.Version == valueFilters.Values[0] {
results = append(results, valueVersion)
}
}

// Filter for type
if valueFilters.Name == "type" {
if valueVersion.Type == valueFilters.Values[0] {
results = append(results, valueVersion)
}
}
}
}

if len(results) == 1 {
return &results[0], nil
}
if len(results) == 0 {
return nil, fmt.Errorf("no kubernetes version found for your search")
}
return nil, fmt.Errorf("too many kubernetes version found (found %d, expected 1)", len(results))
flattenedVersion := map[string]interface{}{}
flattenedVersion["version"] = s.Version
flattenedVersion["label"] = fmt.Sprintf("v%s", s.Version)
flattenedVersion["type"] = s.Type
flattenedVersion["default"] = s.Default
return flattenedVersion, nil
}
Loading

0 comments on commit 197425b

Please sign in to comment.