Refactoring of nginx configuration deserialization
This commit is contained in:
parent
5cdb8fe4fb
commit
c0b5be6ff7
4 changed files with 78 additions and 129 deletions
|
|
@ -21,17 +21,11 @@ import (
|
|||
"strings"
|
||||
|
||||
"github.com/golang/glog"
|
||||
"github.com/imdario/mergo"
|
||||
|
||||
"github.com/fatih/structs"
|
||||
"github.com/mitchellh/mapstructure"
|
||||
go_camelcase "github.com/segmentio/go-camelcase"
|
||||
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
|
||||
"k8s.io/ingress/controllers/nginx/pkg/config"
|
||||
"k8s.io/ingress/core/pkg/ingress/defaults"
|
||||
"k8s.io/ingress/core/pkg/net/dns"
|
||||
)
|
||||
|
||||
const (
|
||||
|
|
@ -40,11 +34,6 @@ const (
|
|||
whitelistSourceRange = "whitelist-source-range"
|
||||
)
|
||||
|
||||
// StandarizeKeyNames ...
|
||||
func StandarizeKeyNames(data interface{}) map[string]interface{} {
|
||||
return fixKeyNames(structs.Map(data))
|
||||
}
|
||||
|
||||
// ReadConfig obtains the configuration defined by the user merged with the defaults.
|
||||
func ReadConfig(conf *api.ConfigMap) config.Configuration {
|
||||
if len(conf.Data) == 0 {
|
||||
|
|
@ -75,36 +64,27 @@ func ReadConfig(conf *api.ConfigMap) config.Configuration {
|
|||
whitelist = append(whitelist, strings.Split(val, ",")...)
|
||||
}
|
||||
|
||||
to := config.Configuration{}
|
||||
to.Backend = defaults.Backend{
|
||||
CustomHTTPErrors: filterErrors(errors),
|
||||
SkipAccessLogURLs: skipUrls,
|
||||
WhitelistSourceRange: whitelist,
|
||||
to := config.NewDefault()
|
||||
to.CustomHTTPErrors = filterErrors(errors)
|
||||
to.SkipAccessLogURLs = skipUrls
|
||||
to.WhitelistSourceRange = whitelist
|
||||
|
||||
config := &mapstructure.DecoderConfig{
|
||||
Metadata: nil,
|
||||
WeaklyTypedInput: true,
|
||||
Result: &to,
|
||||
TagName: "json",
|
||||
}
|
||||
def := config.NewDefault()
|
||||
if err := mergo.Merge(&to, def); err != nil {
|
||||
|
||||
decoder, err := mapstructure.NewDecoder(config)
|
||||
if err != nil {
|
||||
glog.Warningf("unexpected error merging defaults: %v", err)
|
||||
}
|
||||
|
||||
metadata := &mapstructure.Metadata{}
|
||||
decoder, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
|
||||
TagName: "structs",
|
||||
Result: &to,
|
||||
WeaklyTypedInput: true,
|
||||
Metadata: metadata,
|
||||
})
|
||||
|
||||
err = decoder.Decode(conf.Data)
|
||||
if err != nil {
|
||||
glog.Infof("%v", err)
|
||||
glog.Warningf("unexpected error merging defaults: %v", err)
|
||||
}
|
||||
|
||||
nss, err := dns.GetSystemNameServers()
|
||||
if err != nil {
|
||||
glog.Infof("unexpected error reading /etc/resolv.conf file: %v", err)
|
||||
}
|
||||
to.Resolver = nss
|
||||
|
||||
return to
|
||||
}
|
||||
|
||||
|
|
@ -120,11 +100,3 @@ func filterErrors(codes []int) []int {
|
|||
|
||||
return fa
|
||||
}
|
||||
|
||||
func fixKeyNames(data map[string]interface{}) map[string]interface{} {
|
||||
fixed := make(map[string]interface{})
|
||||
for k, v := range data {
|
||||
fixed[go_camelcase.Camelcase(k)] = v
|
||||
}
|
||||
return fixed
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,14 +17,13 @@ limitations under the License.
|
|||
package template
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"k8s.io/ingress/controllers/nginx/pkg/config"
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
)
|
||||
|
||||
func TestStandarizeKeyNames(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestFilterErrors(t *testing.T) {
|
||||
e := filterErrors([]int{200, 300, 345, 500, 555, 999})
|
||||
if len(e) != 4 {
|
||||
|
|
@ -32,52 +31,30 @@ func TestFilterErrors(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestFixKeyNames(t *testing.T) {
|
||||
d := map[string]interface{}{
|
||||
"one": "one",
|
||||
"one-example": "oneExample",
|
||||
"aMore-complex_example": "aMoreComplexExample",
|
||||
"a": "a",
|
||||
}
|
||||
|
||||
fixed := fixKeyNames(d)
|
||||
for k, v := range fixed {
|
||||
if k != v {
|
||||
t.Errorf("expected %v but retuned %v", v, k)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
type testStruct struct {
|
||||
ProxyReadTimeout int `structs:"proxy-read-timeout,omitempty"`
|
||||
ProxySendTimeout int `structs:"proxy-send-timeout,omitempty"`
|
||||
CustomHTTPErrors []int `structs:"custom-http-errors"`
|
||||
SkipAccessLogURLs []string `structs:"skip-access-log-urls,-"`
|
||||
NoTag string
|
||||
}
|
||||
|
||||
var decodedData = &testStruct{
|
||||
1,
|
||||
2,
|
||||
[]int{300, 400},
|
||||
[]string{"/log"},
|
||||
"",
|
||||
}
|
||||
|
||||
func TestMergeConfigMapToStruct(t *testing.T) {
|
||||
/*conf := &api.ConfigMap{
|
||||
conf := &api.ConfigMap{
|
||||
Data: map[string]string{
|
||||
"custom-http-errors": "300,400",
|
||||
"proxy-read-timeout": "1",
|
||||
"proxy-send-timeout": "2",
|
||||
"skip-access-log-urls": "/log",
|
||||
"custom-http-errors": "300,400",
|
||||
"proxy-read-timeout": "1",
|
||||
"proxy-send-timeout": "2",
|
||||
"skip-access-log-urls": "/log,/demo,/test",
|
||||
"use-proxy-protocol": "true",
|
||||
"use-gzip": "true",
|
||||
"enable-dynamic-tls-records": "false",
|
||||
"gzip-types": "text/html",
|
||||
},
|
||||
}*/
|
||||
}
|
||||
def := config.NewDefault()
|
||||
def.CustomHTTPErrors = []int{300, 400}
|
||||
def.SkipAccessLogURLs = []string{"/log"}
|
||||
//to := ReadConfig(conf)
|
||||
//if !reflect.DeepEqual(def, to) {
|
||||
// t.Errorf("expected %v but retuned %v", def, to)
|
||||
//}
|
||||
def.SkipAccessLogURLs = []string{"/log", "/demo", "/test"}
|
||||
def.ProxyReadTimeout = 1
|
||||
def.ProxySendTimeout = 2
|
||||
def.EnableDynamicTLSRecords = false
|
||||
def.UseProxyProtocol = true
|
||||
def.GzipTypes = "text/html"
|
||||
|
||||
to := ReadConfig(conf)
|
||||
if !reflect.DeepEqual(def, to) {
|
||||
t.Errorf("expected %v but retuned %v", def, to)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue