-
Notifications
You must be signed in to change notification settings - Fork 56
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: Add other data resource, k8s version, instances size
- Add kubernetes version like data source - Add Instances size like data source - Add datasource_common_schema.go and datasource_common_struct.go to support kubernetes version and instances size data source BREAKING CHANGE: No Signed-off-by: Alejandro JNM <alejandrojnm@gmail.com>
- Loading branch information
1 parent
0892984
commit 77c3d35
Showing
6 changed files
with
330 additions
and
13 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
package civo | ||
|
||
import ( | ||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema" | ||
) | ||
|
||
func dataSourceFiltersSchema() *schema.Schema { | ||
return &schema.Schema{ | ||
Type: schema.TypeSet, | ||
Optional: true, | ||
ForceNew: true, | ||
Elem: &schema.Resource{ | ||
Schema: map[string]*schema.Schema{ | ||
"name": { | ||
Type: schema.TypeString, | ||
Required: true, | ||
}, | ||
"values": { | ||
Type: schema.TypeList, | ||
Required: true, | ||
Elem: &schema.Schema{Type: schema.TypeString}, | ||
}, | ||
"regex": { | ||
Type: schema.TypeBool, | ||
Optional: true, | ||
Default: false, | ||
}, | ||
}, | ||
}, | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
package civo | ||
|
||
type Filter struct { | ||
Name string | ||
Values []string | ||
Regex bool | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,165 @@ | ||
package civo | ||
|
||
import ( | ||
"fmt" | ||
"github.com/civo/civogo" | ||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema" | ||
"regexp" | ||
"strconv" | ||
) | ||
|
||
func dataSourceInstancesSize() *schema.Resource { | ||
return &schema.Resource{ | ||
Read: dataSourceInstancesSizeRead, | ||
Schema: map[string]*schema.Schema{ | ||
"filter": dataSourceFiltersSchema(), | ||
// computed attributes | ||
"name": { | ||
Type: schema.TypeString, | ||
Computed: true, | ||
}, | ||
"nice_name": { | ||
Type: schema.TypeString, | ||
Computed: true, | ||
}, | ||
"cpu_cores": { | ||
Type: schema.TypeInt, | ||
Computed: true, | ||
}, | ||
"ram_mb": { | ||
Type: schema.TypeInt, | ||
Computed: true, | ||
}, | ||
"disk_gb": { | ||
Type: schema.TypeInt, | ||
Computed: true, | ||
}, | ||
"description": { | ||
Type: schema.TypeString, | ||
Computed: true, | ||
}, | ||
"selectable": { | ||
Type: schema.TypeBool, | ||
Computed: true, | ||
}, | ||
}, | ||
} | ||
} | ||
|
||
func dataSourceInstancesSizeRead(d *schema.ResourceData, m interface{}) error { | ||
apiClient := m.(*civogo.Client) | ||
|
||
filters, filtersOk := d.GetOk("filter") | ||
|
||
if !filtersOk { | ||
return fmt.Errorf("one of filters must be assigned") | ||
} | ||
|
||
if filtersOk { | ||
resp, err := apiClient.ListInstanceSizes() | ||
if err != nil { | ||
return fmt.Errorf("no instances size was found in the server") | ||
} | ||
|
||
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) | ||
} | ||
|
||
return nil | ||
} | ||
|
||
func findInstancesSizeByFilter(sizes []civogo.InstanceSize, set *schema.Set) (*civogo.InstanceSize, error) { | ||
results := make([]civogo.InstanceSize, 0) | ||
|
||
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)}) | ||
} | ||
|
||
for _, valueFilters := range filters { | ||
for _, valueSize := range sizes { | ||
|
||
// 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 sizes found for your search") | ||
} | ||
return nil, fmt.Errorf("too many sizes found (found %d, expected 1)", len(results)) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
package civo | ||
|
||
import ( | ||
"fmt" | ||
"github.com/civo/civogo" | ||
"github.com/hashicorp/terraform-plugin-sdk/helper/schema" | ||
) | ||
|
||
func dataSourceKubernetesVersion() *schema.Resource { | ||
return &schema.Resource{ | ||
Read: dataSourceKubernetesVersionRead, | ||
Schema: map[string]*schema.Schema{ | ||
"filter": dataSourceFiltersSchema(), | ||
// computed attributes | ||
"version": { | ||
Type: schema.TypeString, | ||
Computed: true, | ||
}, | ||
"label": { | ||
Type: schema.TypeString, | ||
Computed: true, | ||
}, | ||
"type": { | ||
Type: schema.TypeString, | ||
Computed: true, | ||
}, | ||
"default": { | ||
Type: schema.TypeString, | ||
Computed: true, | ||
}, | ||
}, | ||
} | ||
} | ||
|
||
func dataSourceKubernetesVersionRead(d *schema.ResourceData, m interface{}) error { | ||
apiClient := m.(*civogo.Client) | ||
|
||
filters, filtersOk := d.GetOk("filter") | ||
|
||
if !filtersOk { | ||
return fmt.Errorf("one of filters must be assigned") | ||
} | ||
|
||
if filtersOk { | ||
resp, err := apiClient.ListAvailableKubernetesVersions() | ||
if err != nil { | ||
return fmt.Errorf("no version was found in the server") | ||
} | ||
|
||
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) | ||
} | ||
|
||
return nil | ||
} | ||
|
||
func findKubernetesVersionByFilter(version []civogo.KubernetesVersion, set *schema.Set) (*civogo.KubernetesVersion, error) { | ||
results := make([]civogo.KubernetesVersion, 0) | ||
|
||
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)}) | ||
} | ||
|
||
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 version found for your search") | ||
} | ||
return nil, fmt.Errorf("too many version found (found %d, expected 1)", len(results)) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters