// Write populates a buffer using a template with NGINX configuration // and the servers and upstreams created by Ingress rules func (t *Template) Write(cfg config.Configuration, ingressCfg ingress.Configuration) ([]byte, error) { var longestName int var serverNames int for _, srv := range ingressCfg.Servers { serverNames += len([]byte(srv.Name)) if longestName < len(srv.Name) { longestName = len(srv.Name) } } // NGINX cannot resize the has tables used to store server names. // For this reason we check if the defined size defined is correct // for the FQDN defined in the ingress rules adjusting the value // if is required. // https://trac.nginx.org/nginx/ticket/352 // https://trac.nginx.org/nginx/ticket/631 nameHashBucketSize := nextPowerOf2(longestName) if nameHashBucketSize > cfg.ServerNameHashBucketSize { glog.V(3).Infof("adjusting ServerNameHashBucketSize variable from %v to %v", cfg.ServerNameHashBucketSize, nameHashBucketSize) cfg.ServerNameHashBucketSize = nameHashBucketSize } serverNameHashMaxSize := nextPowerOf2(serverNames) if serverNameHashMaxSize > cfg.ServerNameHashMaxSize { glog.V(3).Infof("adjusting ServerNameHashMaxSize variable from %v to %v", cfg.ServerNameHashMaxSize, serverNameHashMaxSize) cfg.ServerNameHashMaxSize = serverNameHashMaxSize } conf := make(map[string]interface{}) conf["backlogSize"] = sysctlSomaxconn() conf["upstreams"] = ingressCfg.Upstreams conf["servers"] = ingressCfg.Servers conf["tcpUpstreams"] = ingressCfg.TCPUpstreams conf["udpUpstreams"] = ingressCfg.UDPUpstreams conf["defResolver"] = cfg.Resolver conf["sslDHParam"] = cfg.SSLDHParam conf["customErrors"] = len(cfg.CustomHTTPErrors) > 0 conf["cfg"] = fixKeyNames(structs.Map(cfg)) if glog.V(3) { b, err := json.Marshal(conf) if err != nil { glog.Errorf("unexpected error: %v", err) } glog.Infof("NGINX configuration: %v", string(b)) } buffer := new(bytes.Buffer) err := t.tmpl.Execute(buffer, conf) if err != nil { glog.V(3).Infof("%v", string(buffer.Bytes())) } return buffer.Bytes(), err }
func TestIngressHealthCheck(t *testing.T) { ing := buildIngress() data := map[string]string{} data[upsMaxFails] = "2" ing.SetAnnotations(data) cfg := config.Configuration{} cfg.UpstreamFailTimeout = 1 nginxHz := ParseAnnotations(cfg, ing) if nginxHz.MaxFails != 2 { t.Errorf("Expected 2 as max-fails but returned %v", nginxHz.MaxFails) } if nginxHz.FailTimeout != 1 { t.Errorf("Expected 0 as fail-timeout but returned %v", nginxHz.FailTimeout) } }