Remove blank lines from template rendering

This commit is contained in:
Manuel de Brito Fontes 2016-05-30 13:39:10 -04:00
parent ccaf15cdd4
commit e603976721
6 changed files with 95 additions and 28 deletions

View file

@ -17,6 +17,7 @@ limitations under the License.
package nginx
import (
"k8s.io/contrib/ingress/controllers/nginx/nginx/ratelimit"
"k8s.io/contrib/ingress/controllers/nginx/nginx/rewrite"
)
@ -93,6 +94,7 @@ type Location struct {
IsDefBackend bool
Upstream Upstream
Redirect rewrite.Redirect
RateLimit ratelimit.RateLimit
}
// LocationByPath sorts location by path

View file

@ -25,8 +25,8 @@ import (
)
const (
limitIp = "ingress-nginx.kubernetes.io/limit-connections"
limitRps = "ingress-nginx.kubernetes.io/limit-rps"
limitIp = "ingress.kubernetes.io/limit-connections"
limitRps = "ingress.kubernetes.io/limit-rps"
// allow 5 times the specified limit as burst
defBurst = 5
@ -39,18 +39,12 @@ const (
var (
// ErrInvalidRateLimit is returned when the annotation caontains invalid values
ErrInvalidRateLimit = errors.New("invalid rate limit value. Must be > 0")
// ErrMissingAnnotations is returned when the ingress rule
// does not contains annotations related with rate limit
ErrMissingAnnotations = errors.New("no annotations present")
)
// ErrMissingAnnotations is returned when the ingress rule
// does not contains annotations related with rate limit
type ErrMissingAnnotations struct {
msg string
}
func (e ErrMissingAnnotations) Error() string {
return e.msg
}
// RateLimit returns rate limit configuration for an Ingress rule
// Is possible to limit the number of connections per IP address or
// connections per second.
@ -62,7 +56,8 @@ type RateLimit struct {
RPS Zone
}
// Zone returns information about the rate limit
// Zone returns information about the NGINX rate limit (limit_req_zone)
// http://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req_zone
type Zone struct {
Name string
Limit int
@ -81,7 +76,7 @@ func (a ingAnnotations) limitIp() int {
}
}
return -1
return 0
}
func (a ingAnnotations) limitRps() int {
@ -92,14 +87,14 @@ func (a ingAnnotations) limitRps() int {
}
}
return -1
return 0
}
// ParseAnnotations parses the annotations contained in the ingress
// rule used to rewrite the defined paths
func ParseAnnotations(ing *extensions.Ingress) (*RateLimit, error) {
if ing.GetAnnotations() == nil {
return &RateLimit{}, ErrMissingAnnotations{"no annotations present"}
return &RateLimit{}, ErrMissingAnnotations
}
rps := ingAnnotations(ing.GetAnnotations()).limitRps()
@ -107,8 +102,8 @@ func ParseAnnotations(ing *extensions.Ingress) (*RateLimit, error) {
if rps == 0 && conn == 0 {
return &RateLimit{
Connections: Zone{"", -1, -1, 1},
RPS: Zone{"", -1, -1, 1},
Connections: Zone{},
RPS: Zone{},
}, ErrInvalidRateLimit
}

View file

@ -63,13 +63,13 @@ func TestAnnotations(t *testing.T) {
ing := buildIngress()
lip := ingAnnotations(ing.GetAnnotations()).limitIp()
if lip != -1 {
t.Error("Expected -1 in limit by ip but %v was returned", lip)
if lip != 0 {
t.Error("Expected 0 in limit by ip but %v was returned", lip)
}
lrps := ingAnnotations(ing.GetAnnotations()).limitRps()
if lrps != -1 {
t.Error("Expected -1 in limit by rps but %v was returend", lrps)
if lrps != 0 {
t.Error("Expected 0 in limit by rps but %v was returend", lrps)
}
data := map[string]string{}

View file

@ -45,8 +45,10 @@ var (
return true
},
"buildLocation": buildLocation,
"buildProxyPass": buildProxyPass,
"buildLocation": buildLocation,
"buildProxyPass": buildProxyPass,
"buildRateLimitZones": buildRateLimitZones,
"buildRateLimit": buildRateLimit,
}
)
@ -180,3 +182,59 @@ func buildProxyPass(input interface{}) string {
// default proxy_pass
return defProxyPass
}
// buildRateLimitZones produces an array of limit_conn_zone in order to allow
// rate limiting of request. Each Ingress rule could have up to two zones, one
// for connection limit by IP address and other for limiting request per second
func buildRateLimitZones(input interface{}) []string {
zones := []string{}
servers, ok := input.([]*Server)
if !ok {
return zones
}
for _, server := range servers {
for _, loc := range server.Locations {
if loc.RateLimit.Connections.Limit != -1 {
zone := fmt.Sprintf("limit_conn_zone $binary_remote_addr zone=%v:%v;",
loc.RateLimit.Connections.Name, loc.RateLimit.Connections.SharedSize)
zones = append(zones, zone)
}
if loc.RateLimit.RPS.Limit != -1 {
zone := fmt.Sprintf("limit_conn_zone $binary_remote_addr zone=%v:%v rate=%vr/s;",
loc.RateLimit.Connections.Name, loc.RateLimit.Connections.SharedSize, loc.RateLimit.Connections.Limit)
zones = append(zones, zone)
}
}
}
return zones
}
// buildRateLimit produces an array of limit_req to be used inside the Path of
// Ingress rules. The order: connections by IP first and RPS next.
func buildRateLimit(input interface{}) []string {
limits := []string{}
loc, ok := input.(*Location)
if !ok {
return limits
}
if loc.RateLimit.Connections.Limit != -1 {
limit := fmt.Sprintf("limit_conn %v %v;",
loc.RateLimit.Connections.Name, loc.RateLimit.Connections.Limit)
limits = append(limits, limit)
}
if loc.RateLimit.RPS.Limit != -1 {
limit := fmt.Sprintf("limit_req zone=%v burst=%v nodelay;",
loc.RateLimit.Connections.Name, loc.RateLimit.Connections.Burst)
limits = append(limits, limit)
}
return limits
}