forked from cloudflare/cf-terraforming
/
zone_settings_override.go
116 lines (97 loc) · 2.44 KB
/
zone_settings_override.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
package cmd
import (
"os"
"sort"
"strings"
"text/template"
cloudflare "github.com/cloudflare/cloudflare-go"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
const zoneSettingOverrideTemplate = `
resource "cloudflare_zone_settings_override" "zone_settings_override_{{.Zone.ID}}" {
zone_id = "{{.Zone.ID -}}"
settings {
{{- range .Settings}}
{{if isMap .Value }}
{{- .ID }} {
{{- range $k, $v := .Value}}
{{- if isMap $v }}
{{- range $k, $v := $v }}
{{ $k }} = {{ quoteIfString $v }}
{{- end}}
{{- else }}
{{ $k }} = {{ quoteIfString $v }}
{{- end}}
{{- end}}
}
{{ else if isSlice .Value}}
{{- .ID }} = [{{ range .Value }}"{{.}}", {{ end }}]
{{ else }}
{{- .ID}} = {{ quoteIfString .Value -}}
{{- end }}
{{- end }}
}
}
`
var zoneSettingsToRemove = []string{
"advanced_ddos",
}
func init() {
rootCmd.AddCommand(zoneSettingsOverrideCmd)
}
var zoneSettingsOverrideCmd = &cobra.Command{
Use: "zone_settings_override",
Short: "Import Zone Settings Override data into Terraform",
Run: func(cmd *cobra.Command, args []string) {
log.Debug("Importing zone settings data")
for _, zone := range zones {
// Fetch all settings for a zone
settingsResponse, err := api.ZoneSettings(zone.ID)
if err != nil {
log.Error(err)
return
}
if settingsResponse.Success {
i := 0
for _, s := range settingsResponse.Result {
if contains(zoneSettingsToRemove, s.ID) {
continue
}
// Remap the 0rtt zone setting to zero_rtt
if s.ID == "0rtt" {
s.ID = "zero_rtt"
}
settingsResponse.Result[i] = s
i++
}
settingsResponse.Result = settingsResponse.Result[:i]
}
sort.Slice(settingsResponse.Result, func(i, j int) bool {
return strings.Compare(settingsResponse.Result[i].ID, settingsResponse.Result[j].ID) <= 0
})
log.WithFields(logrus.Fields{
"Result": settingsResponse.Result,
}).Debug("Processing zone settings")
if tfstate {
// TODO: Implement state dump
} else {
zoneSettingsOverrideParse(settingsResponse.Result, zone)
}
}
},
}
func zoneSettingsOverrideParse(s []cloudflare.ZoneSetting, zone cloudflare.Zone) {
tmpl := template.Must(template.New("script").Funcs(templateFuncMap).Parse(zoneSettingOverrideTemplate))
err := tmpl.Execute(os.Stdout,
struct {
Settings []cloudflare.ZoneSetting
Zone cloudflare.Zone
}{
Settings: s,
Zone: zone,
})
if err != nil {
log.Error(err)
}
}