mirror of
https://github.com/kreuzwerker/terraform-provider-docker.git
synced 2025-12-20 22:59:42 -05:00
* chore: runs v2 upgrade cmd * chore: moves all files into the internal provider dir * feat: migrates main and provider * fix: migrates tests to provider factories * fix: replace import state passthrough ctx func * chore: bump tf-sdk to v2.4.4 * fix: acc test by adding stop grace period * fix: move to validate diag functions * test: switch from ctx TODO to Background * feat: add state upgrade for restart_policy and auth Co-authored-by: Shunsuke Suzuki <suzuki-shunsuke@users.noreply.github.com>
160 lines
4.5 KiB
Go
160 lines
4.5 KiB
Go
package provider
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"fmt"
|
|
"regexp"
|
|
"strconv"
|
|
"time"
|
|
|
|
"github.com/hashicorp/go-cty/cty"
|
|
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
|
|
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
|
|
)
|
|
|
|
func validateIntegerGeqThan(threshold int) schema.SchemaValidateDiagFunc {
|
|
return func(v interface{}, p cty.Path) diag.Diagnostics {
|
|
value := v.(int)
|
|
var diags diag.Diagnostics
|
|
if value < threshold {
|
|
diag := diag.Diagnostic{
|
|
Severity: diag.Error,
|
|
Summary: fmt.Sprintf("'%v' cannot be lower than %d", value, threshold),
|
|
Detail: fmt.Sprintf("'%v' cannot be lower than %d", value, threshold),
|
|
}
|
|
diags = append(diags, diag)
|
|
}
|
|
return diags
|
|
}
|
|
}
|
|
|
|
func validateStringIsFloatRatio() schema.SchemaValidateDiagFunc {
|
|
return func(v interface{}, p cty.Path) diag.Diagnostics {
|
|
var diags diag.Diagnostics
|
|
switch t := v.(type) {
|
|
case string:
|
|
stringValue := t
|
|
value, err := strconv.ParseFloat(stringValue, 64)
|
|
if err != nil {
|
|
diag := diag.Diagnostic{
|
|
Severity: diag.Error,
|
|
Summary: fmt.Sprintf("'%v' is not a float", v),
|
|
Detail: fmt.Sprintf("'%v' is not a float", v),
|
|
}
|
|
diags = append(diags, diag)
|
|
}
|
|
if value < 0.0 || value > 1.0 {
|
|
diag := diag.Diagnostic{
|
|
Severity: diag.Error,
|
|
Summary: fmt.Sprintf("'%v' has to be between 0.0 and 1.0", v),
|
|
Detail: fmt.Sprintf("'%v' has to be between 0.0 and 1.0", v),
|
|
}
|
|
diags = append(diags, diag)
|
|
}
|
|
case int:
|
|
value := float64(t)
|
|
if value < 0.0 || value > 1.0 {
|
|
diag := diag.Diagnostic{
|
|
Severity: diag.Error,
|
|
Summary: fmt.Sprintf("'%v' has to be between 0.0 and 1.0", v),
|
|
Detail: fmt.Sprintf("'%v' has to be between 0.0 and 1.0", v),
|
|
}
|
|
diags = append(diags, diag)
|
|
}
|
|
default:
|
|
diag := diag.Diagnostic{
|
|
Severity: diag.Error,
|
|
Summary: fmt.Sprintf("'%v' is not a string", v),
|
|
Detail: fmt.Sprintf("'%v' is not a string", v),
|
|
}
|
|
diags = append(diags, diag)
|
|
}
|
|
return diags
|
|
}
|
|
}
|
|
|
|
func validateDurationGeq0() schema.SchemaValidateDiagFunc {
|
|
return func(v interface{}, p cty.Path) diag.Diagnostics {
|
|
value := v.(string)
|
|
var diags diag.Diagnostics
|
|
dur, err := time.ParseDuration(value)
|
|
if err != nil {
|
|
diag := diag.Diagnostic{
|
|
Severity: diag.Error,
|
|
Summary: fmt.Sprintf("'%v' is not a valid duration", value),
|
|
Detail: fmt.Sprintf("'%v' is not a valid duration", value),
|
|
}
|
|
diags = append(diags, diag)
|
|
}
|
|
if dur < 0 {
|
|
diag := diag.Diagnostic{
|
|
Severity: diag.Error,
|
|
Summary: fmt.Sprintf("'%v' duration must not be negative", value),
|
|
Detail: fmt.Sprintf("'%v' duration must not be negative", value),
|
|
}
|
|
diags = append(diags, diag)
|
|
}
|
|
return diags
|
|
}
|
|
}
|
|
|
|
func validateStringMatchesPattern(pattern string) schema.SchemaValidateDiagFunc {
|
|
return func(v interface{}, p cty.Path) diag.Diagnostics {
|
|
compiledRegex, err := regexp.Compile(pattern)
|
|
var diags diag.Diagnostics
|
|
if err != nil {
|
|
diag := diag.Diagnostic{
|
|
Severity: diag.Error,
|
|
Summary: fmt.Sprintf("regex does not compile for pattern '%s'", pattern),
|
|
Detail: fmt.Sprintf("regex does not compile for pattern '%s'", pattern),
|
|
}
|
|
diags = append(diags, diag)
|
|
return diags
|
|
}
|
|
|
|
value := v.(string)
|
|
if !compiledRegex.MatchString(value) {
|
|
diag := diag.Diagnostic{
|
|
Severity: diag.Error,
|
|
Summary: fmt.Sprintf("'%v' doesn't match the pattern '%s'", value, pattern),
|
|
Detail: fmt.Sprintf("'%v' doesn't match the pattern '%s'", value, pattern),
|
|
}
|
|
diags = append(diags, diag)
|
|
}
|
|
|
|
return diags
|
|
}
|
|
}
|
|
|
|
func validateStringIsBase64Encoded() schema.SchemaValidateDiagFunc {
|
|
return func(v interface{}, p cty.Path) diag.Diagnostics {
|
|
value := v.(string)
|
|
var diags diag.Diagnostics
|
|
if _, err := base64.StdEncoding.DecodeString(value); err != nil {
|
|
diag := diag.Diagnostic{
|
|
Severity: diag.Error,
|
|
Summary: fmt.Sprintf("'%v' is not base64 decodeable", value),
|
|
Detail: fmt.Sprintf("'%v' is not base64 decodeable", value),
|
|
}
|
|
diags = append(diags, diag)
|
|
}
|
|
return diags
|
|
}
|
|
}
|
|
|
|
func validateDockerContainerPath() schema.SchemaValidateDiagFunc {
|
|
return func(v interface{}, p cty.Path) diag.Diagnostics {
|
|
value := v.(string)
|
|
var diags diag.Diagnostics
|
|
if !regexp.MustCompile(`^[a-zA-Z]:\\|^/`).MatchString(value) {
|
|
diag := diag.Diagnostic{
|
|
Severity: diag.Error,
|
|
Summary: fmt.Sprintf("'%v' must be an absolute path", value),
|
|
Detail: fmt.Sprintf("'%v' must be an absolute path", value),
|
|
}
|
|
diags = append(diags, diag)
|
|
}
|
|
|
|
return diags
|
|
}
|
|
}
|