diff --git a/aiven/resource_service.go b/aiven/resource_service.go index ed358f461..0b32f95ba 100644 --- a/aiven/resource_service.go +++ b/aiven/resource_service.go @@ -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 { diff --git a/aiven/user_config.go b/aiven/user_config.go index 3cd85559d..2f8d0e000 100644 --- a/aiven/user_config.go +++ b/aiven/user_config.go @@ -4,6 +4,7 @@ package aiven import ( "encoding/json" "fmt" + "strconv" "strings" "github.com/gobuffalo/packr/v2" @@ -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 } @@ -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) { @@ -381,6 +398,25 @@ func convertTerraformUserConfigValueToAPICompatibleFormat( omit = true } case "boolean": + switch value.(type) { + case string: + if value == "<>" { + 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: