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  }