Skip to content

Commit 4d00cf9

Browse files
committed
Refactor.
1 parent 9d4e771 commit 4d00cf9

28 files changed

+420
-344
lines changed

codefresh/data_idps.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55

66
"github.com/codefresh-io/terraform-provider-codefresh/codefresh/cfclient"
7+
"github.com/codefresh-io/terraform-provider-codefresh/codefresh/internal/datautil"
78
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
89
)
910

@@ -132,7 +133,7 @@ func mapDataIdpToResource(idp cfclient.IDP, d *schema.ResourceData) error {
132133

133134
d.Set("access_token", idp.Access_token) // string `json:"access_token,omitempty"`
134135

135-
d.Set("accounts", flattenStringArr(idp.Accounts)) //
136+
d.Set("accounts", datautil.FlattenStringArr(idp.Accounts)) //
136137
//d.Set("apiHost", idp.ApiHost) // string `json:"apiHost,omitempty"`
137138
//d.Set("apiPathPrefix", idp.ApiPathPrefix) // string `json:"apiPathPrefix,omitempty"`
138139
//d.Set("apiURL", idp.ApiURL) // string `json:"apiURL,omitempty"`
@@ -152,7 +153,7 @@ func mapDataIdpToResource(idp cfclient.IDP, d *schema.ResourceData) error {
152153
//d.Set("redirectUiUrl", idp.RedirectUiUrl) // string `json:"redirectUiUrl,omitempty"`
153154
//d.Set("redirectUrl", idp.RedirectUrl) // string `json:"redirectUrl,omitempty"`
154155
//d.Set("refreshTokenURL", idp.RefreshTokenURL) // string `json:"refreshTokenURL,omitempty"`
155-
d.Set("scopes", flattenStringArr(idp.Scopes)) // []string `json:"scopes,omitempty"`
156+
d.Set("scopes", datautil.FlattenStringArr(idp.Scopes)) // []string `json:"scopes,omitempty"`
156157
d.Set("tenant", idp.Tenant) // string `json:"tenant,omitempty"`
157158
//d.Set("tokenSecret", idp.TokenSecret) // string `json:"tokenSecret,omitempty"`
158159
//d.Set("tokenURL", idp.TokenURL) // string `json:"tokenURL,omitempty"`

codefresh/helper/validation/strings.go

Lines changed: 0 additions & 63 deletions
This file was deleted.

codefresh/helper/validation/validationopts/cron.go

Lines changed: 0 additions & 16 deletions
This file was deleted.

codefresh/helper/validation/validationopts/strings.go

Lines changed: 0 additions & 16 deletions
This file was deleted.

codefresh/internal/datautil/doc.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
// Package datautil provides utilities for working with data types.
2+
package datautil
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package datautil
2+
3+
import (
4+
"github.com/codefresh-io/terraform-provider-codefresh/codefresh/cfclient"
5+
)
6+
7+
// ConvertStringArr converts an array of interfaces to an array of strings.
8+
func ConvertStringArr(ifaceArr []interface{}) []string {
9+
return ConvertAndMapStringArr(ifaceArr, func(s string) string { return s })
10+
}
11+
12+
// ConvertAndMapStringArr converts an array of interfaces to an array of strings,
13+
// applying the supplied function to each element.
14+
func ConvertAndMapStringArr(ifaceArr []interface{}, f func(string) string) []string {
15+
var arr []string
16+
for _, v := range ifaceArr {
17+
if v == nil {
18+
continue
19+
}
20+
arr = append(arr, f(v.(string)))
21+
}
22+
return arr
23+
}
24+
25+
// ConvertVariables converts an array of cfclient.Variables to a map of key/value pairs.
26+
func ConvertVariables(vars []cfclient.Variable) map[string]string {
27+
res := make(map[string]string, len(vars))
28+
for _, v := range vars {
29+
res[v.Key] = v.Value
30+
}
31+
return res
32+
}
33+
34+
// FlattenStringArr flattens an array of strings.
35+
func FlattenStringArr(sArr []string) []interface{} {
36+
iArr := []interface{}{}
37+
for _, s := range sArr {
38+
iArr = append(iArr, s)
39+
}
40+
return iArr
41+
}

codefresh/internal/datautil/yaml.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package datautil
2+
3+
import (
4+
"bytes"
5+
"io/ioutil"
6+
"strings"
7+
8+
"github.com/mikefarah/yq/v4/pkg/yqlib"
9+
"github.com/sclevine/yj/convert"
10+
"gopkg.in/op/go-logging.v1"
11+
)
12+
13+
// Yq gets a value from a YAML string using yq
14+
func Yq(yamlString string, expression string) (string, error) {
15+
yqEncoder := yqlib.NewYamlEncoder(0, false, yqlib.NewDefaultYamlPreferences())
16+
yqDecoder := yqlib.NewYamlDecoder(yqlib.NewDefaultYamlPreferences())
17+
yqEvaluator := yqlib.NewStringEvaluator()
18+
19+
// Disable yq logging
20+
yqLogBackend := logging.AddModuleLevel(logging.NewLogBackend(ioutil.Discard, "", 0))
21+
yqlib.GetLogger().SetBackend(yqLogBackend)
22+
23+
yamlString, err := yqEvaluator.Evaluate(yamlString, expression, yqEncoder, yqDecoder)
24+
yamlString = strings.TrimSpace(yamlString)
25+
26+
if yamlString == "null" { // yq's Evaluate() returns "null" if the expression does not match anything
27+
return "", err
28+
}
29+
return yamlString, err
30+
}
31+
32+
// YamlToJson converts a YAML string to JSON
33+
//
34+
// This function preserves the order of map keys (courtesy of yj package).
35+
// If this were to use yaml.Unmarshal() and json.Marshal() instead, the order of map keys would be lost.
36+
func YamlToJson(yamlString string) (string, error) {
37+
yamlConverter := convert.YAML{}
38+
jsonConverter := convert.JSON{}
39+
40+
yamlDecoded, err := yamlConverter.Decode(strings.NewReader(yamlString))
41+
if err != nil {
42+
return "", err
43+
}
44+
45+
jsonBuffer := new(bytes.Buffer)
46+
err = jsonConverter.Encode(jsonBuffer, yamlDecoded)
47+
if err != nil {
48+
return "", err
49+
}
50+
51+
return jsonBuffer.String(), nil
52+
}

codefresh/internal/schemautil/doc.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
// Package schemautil provides utilities for working with Terraform resource schemas.
2+
package schemautil
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package schemautil
2+
3+
import (
4+
"log"
5+
"regexp"
6+
7+
"gopkg.in/yaml.v2"
8+
)
9+
10+
const (
11+
NormalizedFieldNameRegex string = `[^a-z0-9_]+`
12+
)
13+
14+
// NormalizeFieldName normalizes a field name to be lowercase and contain only alphanumeric characters and dashes.
15+
func NormalizeFieldName(fieldName string) (string, error) {
16+
reg, err := regexp.Compile(NormalizedFieldNameRegex)
17+
if err != nil {
18+
return "", err
19+
}
20+
return reg.ReplaceAllString(fieldName, ""), nil
21+
}
22+
23+
// MustNormalizeFieldName is the same as NormalizeFieldName, but will log an error (legacy logging) instead of returning it.
24+
func MustNormalizeFieldName(fieldName string) string {
25+
normalizedFieldName, err := NormalizeFieldName(fieldName)
26+
if err != nil {
27+
log.Printf("[ERROR] Failed to normalize field name %q: %s", fieldName, err)
28+
}
29+
return normalizedFieldName
30+
}
31+
32+
// NormalizeYAMLString normalizes a YAML string to a standardized order, format and indentation.
33+
func NormalizeYamlString(yamlString interface{}) (string, error) {
34+
var j map[string]interface{}
35+
36+
if yamlString == nil || yamlString.(string) == "" {
37+
return "", nil
38+
}
39+
40+
s := yamlString.(string)
41+
err := yaml.Unmarshal([]byte(s), &j)
42+
if err != nil {
43+
return s, err
44+
}
45+
46+
bytes, _ := yaml.Marshal(j)
47+
return string(bytes[:]), nil
48+
}
49+
50+
51+
// MustNormalizeYamlString is the same as NormalizeYamlString, but will log an error (legacy logging) instead of returning it.
52+
func MustNormalizeYamlString(yamlString interface{}) string {
53+
normalizedYamlString, err := NormalizeYamlString(yamlString)
54+
if err != nil {
55+
log.Printf("[ERROR] Failed to normalize YAML string %q: %s", yamlString, err)
56+
}
57+
return normalizedYamlString
58+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Package schemautil provides utilities for working with Terraform resource schemas.
2+
//
3+
// Note that this package uses legacy logging because the provider context is not available
4+
package schemautil
5+
6+
import (
7+
"log"
8+
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
10+
)
11+
12+
const (
13+
normalizationFailedErrorFormat = "[ERROR] Unable to normalize data body: %s"
14+
)
15+
16+
// SuppressEquivalentYamlDiffs returns SchemaDiffSuppressFunc that suppresses diffs between
17+
// equivalent YAML strings.
18+
func SuppressEquivalentYamlDiffs() schema.SchemaDiffSuppressFunc {
19+
return func(k, old, new string, d *schema.ResourceData) bool {
20+
normalizedOld, err := NormalizeYamlString(old)
21+
if err != nil {
22+
log.Printf(normalizationFailedErrorFormat, err)
23+
return false
24+
}
25+
26+
normalizedNew, err := NormalizeYamlString(new)
27+
if err != nil {
28+
log.Printf(normalizationFailedErrorFormat, err)
29+
return false
30+
}
31+
32+
return normalizedOld == normalizedNew
33+
}
34+
}

codefresh/helper/validation/validationopts/base.go renamed to codefresh/internal/schemautil/validation.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package validationopts
1+
package schemautil
22

33
import (
44
"github.com/dlclark/regexp2"
@@ -14,7 +14,7 @@ type ValidationOptions struct {
1414
StringValidationOptions *StringValidationOptions
1515
}
1616

17-
type OptionSetter func(*ValidationOptions)
17+
type ValidationOptionSetter func(*ValidationOptions)
1818

1919
func NewValidationOptions() *ValidationOptions {
2020
return &ValidationOptions{
@@ -30,25 +30,25 @@ func NewValidationOptions() *ValidationOptions {
3030
}
3131
}
3232

33-
func WithSeverity(severity diag.Severity) OptionSetter {
33+
func WithSeverity(severity diag.Severity) ValidationOptionSetter {
3434
return func(o *ValidationOptions) {
3535
o.SetSeverity(severity)
3636
}
3737
}
3838

39-
func WithSummary(summary string) OptionSetter {
39+
func WithSummary(summary string) ValidationOptionSetter {
4040
return func(o *ValidationOptions) {
4141
o.SetSummary(summary)
4242
}
4343
}
4444

45-
func WithDetailFormat(detailFormat string) OptionSetter {
45+
func WithDetailFormat(detailFormat string) ValidationOptionSetter {
4646
return func(o *ValidationOptions) {
4747
o.SetDetailFormat(detailFormat)
4848
}
4949
}
5050

51-
func (o *ValidationOptions) Apply(setters []OptionSetter) *ValidationOptions {
51+
func (o *ValidationOptions) Apply(setters []ValidationOptionSetter) *ValidationOptions {
5252
for _, opt := range setters {
5353
opt(o)
5454
}

0 commit comments

Comments
 (0)