Skip to content

Commit

Permalink
Merge pull request #134 from aiven/savciuci-fix-user-config-bool
Browse files Browse the repository at this point in the history
fix <service>_user_config Boolean fields without default value

#134
  • Loading branch information
rikonen authored Jan 22, 2020
2 parents 2539a31 + 69d8f47 commit fc2cef4
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 16 deletions.
64 changes: 49 additions & 15 deletions aiven/resource_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -636,33 +636,67 @@ func copyServicePropertiesFromAPIResponseToTerraform(
service *aiven.Service,
project string,
) error {
d.Set("cloud_name", service.CloudName)
d.Set("service_name", service.Name)
d.Set("state", service.State)
d.Set("plan", service.Plan)
d.Set("service_type", service.Type)
d.Set("termination_protection", service.TerminationProtection)
d.Set("maintenance_window_dow", service.MaintenanceWindow.DayOfWeek)
d.Set("maintenance_window_time", service.MaintenanceWindow.TimeOfDay)
d.Set("service_uri", service.URI)
d.Set("project", project)
if err := d.Set("cloud_name", service.CloudName); err != nil {
return err
}
if err := d.Set("service_name", service.Name); err != nil {
return err
}
if err := d.Set("state", service.State); err != nil {
return err
}
if err := d.Set("plan", service.Plan); err != nil {
return err
}
if err := d.Set("service_type", service.Type); err != nil {
return err
}
if err := d.Set("termination_protection", service.TerminationProtection); err != nil {
return err
}
if err := d.Set("maintenance_window_dow", service.MaintenanceWindow.DayOfWeek); err != nil {
return err
}
if err := d.Set("maintenance_window_time", service.MaintenanceWindow.TimeOfDay); err != nil {
return err
}
if err := d.Set("service_uri", service.URI); err != nil {
return err
}
if err := d.Set("project", project); err != nil {
return err
}

if service.ProjectVPCID != nil {
d.Set("project_vpc_id", buildResourceID(project, *service.ProjectVPCID))
if err := d.Set("project_vpc_id", buildResourceID(project, *service.ProjectVPCID)); err != nil {
return err
}
}

userConfig := ConvertAPIUserConfigToTerraformCompatibleFormat("service", service.Type, service.UserConfig)
d.Set(service.Type+"_user_config", userConfig)

params := service.URIParams
d.Set("service_host", params["host"])
if err := d.Set("service_host", params["host"]); err != nil {
return err
}

port, _ := strconv.ParseInt(params["port"], 10, 32)
d.Set("service_port", port)
if err := d.Set("service_port", port); err != nil {
return err
}

password, passwordOK := params["password"]
username, usernameOK := params["user"]
if passwordOK {
d.Set("service_password", password)
if err := d.Set("service_password", password); err != nil {
return err
}
}
if usernameOK {
d.Set("service_username", username)
if err := d.Set("service_username", username); err != nil {
return err
}
}

if err := d.Set("components", flattenServiceComponents(service)); err != nil {
Expand Down
38 changes: 37 additions & 1 deletion aiven/user_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ package aiven
import (
"encoding/json"
"fmt"
"strconv"
"strings"

"github.com/gobuffalo/packr/v2"
Expand Down Expand Up @@ -51,10 +52,19 @@ func GetUserConfigSchema(resourceType string) map[string]interface{} {
func GenerateTerraformUserConfigSchema(data map[string]interface{}) map[string]*schema.Schema {
properties := data["properties"].(map[string]interface{})
terraformSchema := make(map[string]*schema.Schema)

for name, definitionRaw := range properties {
definition := definitionRaw.(map[string]interface{})

t, op := getAivenSchemaType(definition["type"])
if d, ok := definition["default"]; (!ok || op || d == nil) && t == "boolean" {
definition["type"] = "string"
definition["api_type"] = "boolean"
}

terraformSchema[encodeKeyName(name)] = generateTerraformUserConfigSchema(name, definition)
}

return terraformSchema
}

Expand Down Expand Up @@ -346,7 +356,14 @@ func convertTerraformUserConfigValueToAPICompatibleFormat(
) (interface{}, bool) {
convertedValue := value
omit := false
valueType, _ := getAivenSchemaType(definition["type"])

var valueType string
if t, ok := definition["api_type"]; ok {
valueType = t.(string)
} else {
valueType, _ = getAivenSchemaType(definition["type"])
}

switch valueType {
case "integer":
switch res := value.(type) {
Expand Down Expand Up @@ -381,6 +398,25 @@ func convertTerraformUserConfigValueToAPICompatibleFormat(
omit = true
}
case "boolean":
switch value.(type) {
case string:
if value == "<<value not set>>" {
omit = true
} else {
b, err := strconv.ParseBool(value.(string))
if err != nil {
panic(fmt.Sprintf("Invalid %v user config key type %T for %v, a string is expected "+
"that can be parsed as boolean, error : %s", serviceType, value, key, err.Error()))
}
convertedValue = b
}
case bool:
convertedValue = value
default:
panic(fmt.Sprintf("Invalid %v user config key type %T for %v, expected string or boolean",
serviceType, value, key))
}

case "string":
switch value.(type) {
case string:
Expand Down

0 comments on commit fc2cef4

Please sign in to comment.