This repository has been archived by the owner on Apr 19, 2020. It is now read-only.
/
util.go
146 lines (129 loc) · 3.41 KB
/
util.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package brightbox
import (
"crypto/sha1"
"encoding/base64"
"encoding/hex"
"fmt"
"github.com/brightbox/gobrightbox"
"github.com/hashicorp/terraform/helper/schema"
)
func hash_string(
v interface{},
) string {
switch v.(type) {
case string:
return userDataHashSum(v.(string))
default:
return ""
}
}
func userDataHashSum(user_data string) string {
// Check whether the user_data is not Base64 encoded.
// Always calculate hash of base64 decoded value since we
// check against double-encoding when setting it
v, base64DecodeError := base64Decode(user_data)
if base64DecodeError != nil {
v = user_data
}
hash := sha1.Sum([]byte(v))
return hex.EncodeToString(hash[:])
}
func assign_string(d *schema.ResourceData, target **string, index string) {
if d.HasChange(index) {
if *target == nil {
var temp string
*target = &temp
}
if attr, ok := d.GetOk(index); ok {
**target = attr.(string)
}
}
}
func assign_string_set(d *schema.ResourceData, target **[]string, index string) {
if d.HasChange(index) {
*target = map_from_string_set(d, index)
}
}
func map_from_string_set(d *schema.ResourceData, index string) *[]string {
var temp []string
if attr := d.Get(index).(*schema.Set); attr.Len() > 0 {
temp = make([]string, attr.Len())
for i, v := range attr.List() {
temp[i] = v.(string)
}
}
return &temp
}
func flatten_string_slice(list []string) []interface{} {
temp := make([]interface{}, len(list))
for i, v := range list {
temp[i] = v
}
return temp
}
func assign_int(d *schema.ResourceData, target **int, index string) {
if d.HasChange(index) {
var temp int
if attr, ok := d.GetOk(index); ok {
temp = attr.(int)
}
*target = &temp
}
}
func assign_bool(d *schema.ResourceData, target **bool, index string) {
if d.HasChange(index) {
var temp bool
if attr, ok := d.GetOk(index); ok {
temp = attr.(bool)
}
*target = &temp
}
}
func setPrimaryCloudIp(d *schema.ResourceData, cloud_ip *brightbox.CloudIP) {
d.Set("ipv4_address", cloud_ip.PublicIP)
d.SetPartial("ipv4_address")
d.Set("public_hostname", cloud_ip.Fqdn)
d.SetPartial("public_hostname")
}
// Base64Encode encodes data if the input isn't already encoded
// using base64.StdEncoding.EncodeToString. If the input is already base64
// encoded, return the original input unchanged.
func base64Encode(data string) string {
// Check whether the data is already Base64 encoded; don't double-encode
if isBase64Encoded(data) {
return data
}
// data has not been encoded encode and return
return base64.StdEncoding.EncodeToString([]byte(data))
}
func isBase64Encoded(data string) bool {
_, err := base64Decode(data)
return err == nil
}
func base64Decode(data string) (string, error) {
result, err := base64.StdEncoding.DecodeString(data)
return string(result), err
}
func stringValidateFunc(v interface{}, name string, failureTest func(string) bool, formatString string) (warns []string, errors []error) {
value := v.(string)
if failureTest(value) {
errors = append(errors, fmt.Errorf(formatString, name))
}
return
}
func mustNotBeEmptyString(v interface{}, name string) ([]string, []error) {
return stringValidateFunc(
v,
name,
func(value string) bool { return value == "" },
"%q cannot be empty",
)
}
func mustBeBase64Encoded(v interface{}, name string) ([]string, []error) {
return stringValidateFunc(
v,
name,
func(value string) bool { return !isBase64Encoded(value) },
"%q must be base64-encoded",
)
}