github.com/nginxinc/kubernetes-ingress@v1.12.5/internal/configs/version1/templates_test.go (about) 1 package version1 2 3 import ( 4 "bytes" 5 "testing" 6 "text/template" 7 ) 8 9 const nginxIngressTmpl = "nginx.ingress.tmpl" 10 const nginxMainTmpl = "nginx.tmpl" 11 const nginxPlusIngressTmpl = "nginx-plus.ingress.tmpl" 12 const nginxPlusMainTmpl = "nginx-plus.tmpl" 13 14 var testUps = Upstream{ 15 Name: "test", 16 UpstreamZoneSize: "256k", 17 UpstreamServers: []UpstreamServer{ 18 { 19 Address: "127.0.0.1", 20 Port: "8181", 21 MaxFails: 0, 22 MaxConns: 0, 23 FailTimeout: "1s", 24 SlowStart: "5s", 25 }, 26 }, 27 } 28 29 var headers = map[string]string{"Test-Header": "test-header-value"} 30 var healthCheck = HealthCheck{ 31 UpstreamName: "test", 32 Fails: 1, 33 Interval: 1, 34 Passes: 1, 35 Headers: headers, 36 } 37 38 var ingCfg = IngressNginxConfig{ 39 40 Servers: []Server{ 41 { 42 Name: "test.example.com", 43 ServerTokens: "off", 44 StatusZone: "test.example.com", 45 JWTAuth: &JWTAuth{ 46 Key: "/etc/nginx/secrets/key.jwk", 47 Realm: "closed site", 48 Token: "$cookie_auth_token", 49 RedirectLocationName: "@login_url-default-cafe-ingres", 50 }, 51 SSL: true, 52 SSLCertificate: "secret.pem", 53 SSLCertificateKey: "secret.pem", 54 SSLPorts: []int{443}, 55 SSLRedirect: true, 56 Locations: []Location{ 57 { 58 Path: "/tea", 59 Upstream: testUps, 60 ProxyConnectTimeout: "10s", 61 ProxyReadTimeout: "10s", 62 ProxySendTimeout: "10s", 63 ClientMaxBodySize: "2m", 64 JWTAuth: &JWTAuth{ 65 Key: "/etc/nginx/secrets/location-key.jwk", 66 Realm: "closed site", 67 Token: "$cookie_auth_token", 68 }, 69 MinionIngress: &Ingress{ 70 Name: "tea-minion", 71 Namespace: "default", 72 }, 73 }, 74 }, 75 HealthChecks: map[string]HealthCheck{"test": healthCheck}, 76 JWTRedirectLocations: []JWTRedirectLocation{ 77 { 78 Name: "@login_url-default-cafe-ingress", 79 LoginURL: "https://test.example.com/login", 80 }, 81 }, 82 }, 83 }, 84 Upstreams: []Upstream{testUps}, 85 Keepalive: "16", 86 Ingress: Ingress{ 87 Name: "cafe-ingress", 88 Namespace: "default", 89 }, 90 } 91 92 var mainCfg = MainConfig{ 93 ServerNamesHashMaxSize: "512", 94 ServerTokens: "off", 95 WorkerProcesses: "auto", 96 WorkerCPUAffinity: "auto", 97 WorkerShutdownTimeout: "1m", 98 WorkerConnections: "1024", 99 WorkerRlimitNofile: "65536", 100 LogFormat: []string{"$remote_addr", "$remote_user"}, 101 LogFormatEscaping: "default", 102 StreamSnippets: []string{"# comment"}, 103 StreamLogFormat: []string{"$remote_addr", "$remote_user"}, 104 StreamLogFormatEscaping: "none", 105 ResolverAddresses: []string{"example.com", "127.0.0.1"}, 106 ResolverIPV6: false, 107 ResolverValid: "10s", 108 ResolverTimeout: "15s", 109 KeepaliveTimeout: "65s", 110 KeepaliveRequests: 100, 111 VariablesHashBucketSize: 256, 112 VariablesHashMaxSize: 1024, 113 TLSPassthrough: true, 114 } 115 116 func TestIngressForNGINXPlus(t *testing.T) { 117 tmpl, err := template.New(nginxPlusIngressTmpl).Funcs(helperFunctions).ParseFiles(nginxPlusIngressTmpl) 118 if err != nil { 119 t.Fatalf("Failed to parse template file: %v", err) 120 } 121 122 var buf bytes.Buffer 123 124 err = tmpl.Execute(&buf, ingCfg) 125 t.Log(buf.String()) 126 if err != nil { 127 t.Fatalf("Failed to write template %v", err) 128 } 129 } 130 131 func TestIngressForNGINX(t *testing.T) { 132 tmpl, err := template.New(nginxIngressTmpl).Funcs(helperFunctions).ParseFiles(nginxIngressTmpl) 133 if err != nil { 134 t.Fatalf("Failed to parse template file: %v", err) 135 } 136 137 var buf bytes.Buffer 138 139 err = tmpl.Execute(&buf, ingCfg) 140 t.Log(buf.String()) 141 if err != nil { 142 t.Fatalf("Failed to write template %v", err) 143 } 144 } 145 146 func TestMainForNGINXPlus(t *testing.T) { 147 tmpl, err := template.New(nginxPlusMainTmpl).ParseFiles(nginxPlusMainTmpl) 148 if err != nil { 149 t.Fatalf("Failed to parse template file: %v", err) 150 } 151 152 var buf bytes.Buffer 153 154 err = tmpl.Execute(&buf, mainCfg) 155 t.Log(buf.String()) 156 if err != nil { 157 t.Fatalf("Failed to write template %v", err) 158 } 159 } 160 161 func TestMainForNGINX(t *testing.T) { 162 tmpl, err := template.New(nginxMainTmpl).ParseFiles(nginxMainTmpl) 163 if err != nil { 164 t.Fatalf("Failed to parse template file: %v", err) 165 } 166 167 var buf bytes.Buffer 168 169 err = tmpl.Execute(&buf, mainCfg) 170 t.Log(buf.String()) 171 if err != nil { 172 t.Fatalf("Failed to write template %v", err) 173 } 174 } 175 176 func TestSplitHelperFunction(t *testing.T) { 177 const tpl = `{{range $n := split . ","}}{{$n}} {{end}}` 178 179 tmpl, err := template.New("testTemplate").Funcs(helperFunctions).Parse(tpl) 180 if err != nil { 181 t.Fatalf("Failed to parse template: %v", err) 182 } 183 184 var buf bytes.Buffer 185 186 input := "foo,bar" 187 expected := "foo bar " 188 189 err = tmpl.Execute(&buf, input) 190 if err != nil { 191 t.Fatalf("Failed to execute the template %v", err) 192 } 193 194 if buf.String() != expected { 195 t.Fatalf("Template generated wrong config, got %v but expected %v.", buf.String(), expected) 196 } 197 } 198 199 func TestTrimHelperFunction(t *testing.T) { 200 const tpl = `{{trim .}}` 201 202 tmpl, err := template.New("testTemplate").Funcs(helperFunctions).Parse(tpl) 203 if err != nil { 204 t.Fatalf("Failed to parse template: %v", err) 205 } 206 207 var buf bytes.Buffer 208 209 input := " foobar " 210 expected := "foobar" 211 212 err = tmpl.Execute(&buf, input) 213 if err != nil { 214 t.Fatalf("Failed to execute the template %v", err) 215 } 216 217 if buf.String() != expected { 218 t.Fatalf("Template generated wrong config, got %v but expected %v.", buf.String(), expected) 219 } 220 }