Add roundtrip test
This commit is contained in:
parent
62522a3d49
commit
fce3efdb94
7 changed files with 1340 additions and 13 deletions
|
@ -20,7 +20,7 @@ import (
|
||||||
ngx_crossplane "github.com/nginxinc/nginx-go-crossplane"
|
ngx_crossplane "github.com/nginxinc/nginx-go-crossplane"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (c *crossplaneTemplate) buildConfig() {
|
func (c *CrossplaneTemplate) buildConfig() {
|
||||||
// Write basic directives
|
// Write basic directives
|
||||||
config := &ngx_crossplane.Config{
|
config := &ngx_crossplane.Config{
|
||||||
Parsed: ngx_crossplane.Directives{
|
Parsed: ngx_crossplane.Directives{
|
||||||
|
|
|
@ -34,15 +34,17 @@ Unsupported directives:
|
||||||
|
|
||||||
// On this case we will try to use the go ngx_crossplane to write the template instead of the template renderer
|
// On this case we will try to use the go ngx_crossplane to write the template instead of the template renderer
|
||||||
|
|
||||||
type crossplaneTemplate struct {
|
type CrossplaneTemplate struct {
|
||||||
options *ngx_crossplane.BuildOptions
|
options *ngx_crossplane.BuildOptions
|
||||||
config *ngx_crossplane.Config
|
config *ngx_crossplane.Config
|
||||||
tplConfig *config.TemplateConfig
|
tplConfig *config.TemplateConfig
|
||||||
|
mimeFile string
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewCrossplaneTemplate() *crossplaneTemplate {
|
func NewCrossplaneTemplate() *CrossplaneTemplate {
|
||||||
lua := ngx_crossplane.Lua{}
|
lua := ngx_crossplane.Lua{}
|
||||||
return &crossplaneTemplate{
|
return &CrossplaneTemplate{
|
||||||
|
mimeFile: "/etc/nginx/mime.types",
|
||||||
options: &ngx_crossplane.BuildOptions{
|
options: &ngx_crossplane.BuildOptions{
|
||||||
Builders: []ngx_crossplane.RegisterBuilder{
|
Builders: []ngx_crossplane.RegisterBuilder{
|
||||||
lua.RegisterBuilder(),
|
lua.RegisterBuilder(),
|
||||||
|
@ -51,7 +53,11 @@ func NewCrossplaneTemplate() *crossplaneTemplate {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *crossplaneTemplate) Write(conf *config.TemplateConfig) ([]byte, error) {
|
func (c *CrossplaneTemplate) SetMimeFile(file string) {
|
||||||
|
c.mimeFile = file
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *CrossplaneTemplate) Write(conf *config.TemplateConfig) ([]byte, error) {
|
||||||
c.tplConfig = conf
|
c.tplConfig = conf
|
||||||
|
|
||||||
// build root directives
|
// build root directives
|
||||||
|
|
|
@ -16,7 +16,25 @@ limitations under the License.
|
||||||
|
|
||||||
package crossplane_test
|
package crossplane_test
|
||||||
|
|
||||||
import "testing"
|
import (
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
ngx_crossplane "github.com/nginxinc/nginx-go-crossplane"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
|
"k8s.io/ingress-nginx/internal/ingress/controller/config"
|
||||||
|
"k8s.io/ingress-nginx/internal/ingress/controller/template/crossplane"
|
||||||
|
"k8s.io/ingress-nginx/pkg/apis/ingress"
|
||||||
|
)
|
||||||
|
|
||||||
|
const mockMimeTypes = `
|
||||||
|
types {
|
||||||
|
text/html html htm shtml;
|
||||||
|
text/css css;
|
||||||
|
text/xml xml;
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
// TestCrossplaneTemplate should be a roundtrip test.
|
// TestCrossplaneTemplate should be a roundtrip test.
|
||||||
// We should initialize the scenarios based on the template configuration
|
// We should initialize the scenarios based on the template configuration
|
||||||
|
@ -24,5 +42,45 @@ import "testing"
|
||||||
// if the directives matches
|
// if the directives matches
|
||||||
// we should ignore line numbers and comments
|
// we should ignore line numbers and comments
|
||||||
func TestCrossplaneTemplate(t *testing.T) {
|
func TestCrossplaneTemplate(t *testing.T) {
|
||||||
// implement
|
lua := ngx_crossplane.Lua{}
|
||||||
|
options := ngx_crossplane.ParseOptions{
|
||||||
|
ErrorOnUnknownDirectives: true,
|
||||||
|
StopParsingOnError: true,
|
||||||
|
IgnoreDirectives: []string{"more_clear_headers"},
|
||||||
|
DirectiveSources: []ngx_crossplane.MatchFunc{ngx_crossplane.DefaultDirectivesMatchFunc, ngx_crossplane.LuaDirectivesMatchFn},
|
||||||
|
LexOptions: ngx_crossplane.LexOptions{
|
||||||
|
Lexers: []ngx_crossplane.RegisterLexer{lua.RegisterLexer()},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
defaultCertificate := &ingress.SSLCert{
|
||||||
|
PemFileName: "bla.crt",
|
||||||
|
PemCertKey: "bla.key",
|
||||||
|
}
|
||||||
|
|
||||||
|
mimeFile, err := os.CreateTemp("", "")
|
||||||
|
require.NoError(t, err)
|
||||||
|
_, err = mimeFile.WriteString(mockMimeTypes)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NoError(t, mimeFile.Close())
|
||||||
|
|
||||||
|
t.Run("it should be able to marshall and unmarshall the current configuration", func(t *testing.T) {
|
||||||
|
tplConfig := &config.TemplateConfig{
|
||||||
|
Cfg: config.NewDefault(),
|
||||||
|
}
|
||||||
|
tplConfig.Cfg.DefaultSSLCertificate = defaultCertificate
|
||||||
|
|
||||||
|
tpl := crossplane.NewCrossplaneTemplate()
|
||||||
|
tpl.SetMimeFile(mimeFile.Name())
|
||||||
|
content, err := tpl.Write(tplConfig)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
tmpFile, err := os.CreateTemp("", "")
|
||||||
|
require.NoError(t, err)
|
||||||
|
_, err = tmpFile.Write(content)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NoError(t, tmpFile.Close())
|
||||||
|
|
||||||
|
_, err = ngx_crossplane.Parse(tmpFile.Name(), &options)
|
||||||
|
require.NoError(t, err)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ import (
|
||||||
ngx_crossplane "github.com/nginxinc/nginx-go-crossplane"
|
ngx_crossplane "github.com/nginxinc/nginx-go-crossplane"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (c *crossplaneTemplate) buildEvents() {
|
func (c *CrossplaneTemplate) buildEvents() {
|
||||||
events := &ngx_crossplane.Directive{
|
events := &ngx_crossplane.Directive{
|
||||||
Directive: "events",
|
Directive: "events",
|
||||||
Block: ngx_crossplane.Directives{
|
Block: ngx_crossplane.Directives{
|
||||||
|
|
|
@ -24,11 +24,11 @@ import (
|
||||||
ngx_crossplane "github.com/nginxinc/nginx-go-crossplane"
|
ngx_crossplane "github.com/nginxinc/nginx-go-crossplane"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (c *crossplaneTemplate) initHTTPDirectives() ngx_crossplane.Directives {
|
func (c *CrossplaneTemplate) initHTTPDirectives() ngx_crossplane.Directives {
|
||||||
cfg := c.tplConfig.Cfg
|
cfg := c.tplConfig.Cfg
|
||||||
httpBlock := ngx_crossplane.Directives{
|
httpBlock := ngx_crossplane.Directives{
|
||||||
buildDirective("lua_package_path", "/etc/nginx/lua/?.lua;;"),
|
buildDirective("lua_package_path", "/etc/nginx/lua/?.lua;;"),
|
||||||
buildDirective("include", "/etc/nginx/mime.types"),
|
buildDirective("include", c.mimeFile),
|
||||||
buildDirective("default_type", cfg.DefaultType),
|
buildDirective("default_type", cfg.DefaultType),
|
||||||
buildDirective("real_ip_recursive", "on"),
|
buildDirective("real_ip_recursive", "on"),
|
||||||
buildDirective("aio", "threads"),
|
buildDirective("aio", "threads"),
|
||||||
|
@ -46,7 +46,7 @@ func (c *crossplaneTemplate) initHTTPDirectives() ngx_crossplane.Directives {
|
||||||
buildDirective("proxy_temp_path", "/tmp/nginx/proxy-temp"),
|
buildDirective("proxy_temp_path", "/tmp/nginx/proxy-temp"),
|
||||||
buildDirective("client_header_buffer_size", cfg.ClientHeaderBufferSize),
|
buildDirective("client_header_buffer_size", cfg.ClientHeaderBufferSize),
|
||||||
buildDirective("client_header_timeout", seconds(cfg.ClientHeaderTimeout)),
|
buildDirective("client_header_timeout", seconds(cfg.ClientHeaderTimeout)),
|
||||||
buildDirective("large_client_header_buffers", cfg.LargeClientHeaderBuffers),
|
buildDirective("large_client_header_buffers", strings.Split(cfg.LargeClientHeaderBuffers, " ")),
|
||||||
buildDirective("client_body_buffer_size", cfg.ClientBodyBufferSize),
|
buildDirective("client_body_buffer_size", cfg.ClientBodyBufferSize),
|
||||||
buildDirective("client_body_timeout", seconds(cfg.ClientBodyTimeout)),
|
buildDirective("client_body_timeout", seconds(cfg.ClientBodyTimeout)),
|
||||||
buildDirective("types_hash_max_size", "2048"),
|
buildDirective("types_hash_max_size", "2048"),
|
||||||
|
@ -64,6 +64,7 @@ func (c *crossplaneTemplate) initHTTPDirectives() ngx_crossplane.Directives {
|
||||||
buildDirective("uninitialized_variable_warn", "off"),
|
buildDirective("uninitialized_variable_warn", "off"),
|
||||||
buildDirective("server_name_in_redirect", "off"),
|
buildDirective("server_name_in_redirect", "off"),
|
||||||
buildDirective("port_in_redirect", "off"),
|
buildDirective("port_in_redirect", "off"),
|
||||||
|
buildDirective("http2_max_concurrent_streams", cfg.HTTP2MaxConcurrentStreams),
|
||||||
buildDirective("ssl_protocols", strings.Split(cfg.SSLProtocols, " ")),
|
buildDirective("ssl_protocols", strings.Split(cfg.SSLProtocols, " ")),
|
||||||
buildDirective("ssl_early_data", cfg.SSLEarlyData),
|
buildDirective("ssl_early_data", cfg.SSLEarlyData),
|
||||||
buildDirective("ssl_session_tickets", cfg.SSLSessionTickets),
|
buildDirective("ssl_session_tickets", cfg.SSLSessionTickets),
|
||||||
|
@ -80,7 +81,7 @@ func (c *crossplaneTemplate) initHTTPDirectives() ngx_crossplane.Directives {
|
||||||
return httpBlock
|
return httpBlock
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *crossplaneTemplate) buildHTTP() {
|
func (c *CrossplaneTemplate) buildHTTP() {
|
||||||
cfg := c.tplConfig.Cfg
|
cfg := c.tplConfig.Cfg
|
||||||
httpBlock := c.initHTTPDirectives()
|
httpBlock := c.initHTTPDirectives()
|
||||||
httpBlock = append(httpBlock, buildLuaSharedDictionaries(&c.tplConfig.Cfg)...)
|
httpBlock = append(httpBlock, buildLuaSharedDictionaries(&c.tplConfig.Cfg)...)
|
||||||
|
@ -121,7 +122,7 @@ func (c *crossplaneTemplate) buildHTTP() {
|
||||||
httpBlock = append(httpBlock, buildDirective("gzip_vary", "on"))
|
httpBlock = append(httpBlock, buildDirective("gzip_vary", "on"))
|
||||||
|
|
||||||
if cfg.GzipDisable != "" {
|
if cfg.GzipDisable != "" {
|
||||||
httpBlock = append(httpBlock, buildDirective("gzip_disable", strings.Split(cfg.GzipDisable, "")))
|
httpBlock = append(httpBlock, buildDirective("gzip_disable", strings.Split(cfg.GzipDisable, " ")))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
8
internal/ingress/controller/template/crossplane/testdata/README.md
vendored
Normal file
8
internal/ingress/controller/template/crossplane/testdata/README.md
vendored
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
This directory contains the following files:
|
||||||
|
|
||||||
|
* nginx.tmpl - Should be used to track migrated directives. We will test later to see
|
||||||
|
if the ending result of it is the same as the one parsed by go-crossplane
|
||||||
|
* various nginx.conf - Will be used to see if the template parser reacts as
|
||||||
|
expected, creating files that matches and can be parsed by go-crossplane
|
||||||
|
|
||||||
|
TODO: move files to embed.FS
|
1254
internal/ingress/controller/template/crossplane/testdata/nginx.tmpl
vendored
Normal file
1254
internal/ingress/controller/template/crossplane/testdata/nginx.tmpl
vendored
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue