2016-03-15 15:31:39 +00:00
|
|
|
/*
|
|
|
|
Copyright 2015 The Kubernetes Authors All rights reserved.
|
|
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
you may not use this file except in compliance with the License.
|
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
See the License for the specific language governing permissions and
|
|
|
|
limitations under the License.
|
|
|
|
*/
|
|
|
|
|
2016-03-15 02:29:13 +00:00
|
|
|
package nginx
|
|
|
|
|
2016-03-16 14:12:45 +00:00
|
|
|
import (
|
|
|
|
"os"
|
|
|
|
|
|
|
|
"github.com/golang/glog"
|
|
|
|
)
|
2016-03-15 02:29:13 +00:00
|
|
|
|
|
|
|
// IngressNGINXConfig describes an NGINX configuration
|
|
|
|
type IngressNGINXConfig struct {
|
|
|
|
Upstreams []Upstream
|
|
|
|
Servers []Server
|
|
|
|
}
|
|
|
|
|
|
|
|
// Upstream describes an NGINX upstream
|
|
|
|
type Upstream struct {
|
|
|
|
Name string
|
|
|
|
Backends []UpstreamServer
|
|
|
|
}
|
|
|
|
|
2016-03-15 15:31:39 +00:00
|
|
|
// UpstreamByNameServers Upstream sorter by name
|
2016-03-15 02:29:13 +00:00
|
|
|
type UpstreamByNameServers []Upstream
|
|
|
|
|
|
|
|
func (c UpstreamByNameServers) Len() int { return len(c) }
|
|
|
|
func (c UpstreamByNameServers) Swap(i, j int) { c[i], c[j] = c[j], c[i] }
|
|
|
|
func (c UpstreamByNameServers) Less(i, j int) bool {
|
|
|
|
return c[i].Name < c[j].Name
|
|
|
|
}
|
|
|
|
|
|
|
|
// UpstreamServer describes a server in an NGINX upstream
|
|
|
|
type UpstreamServer struct {
|
|
|
|
Address string
|
|
|
|
Port string
|
|
|
|
}
|
|
|
|
|
2016-03-15 15:31:39 +00:00
|
|
|
// UpstreamServerByAddrPort UpstreamServer sorter by address and port
|
2016-03-15 02:29:13 +00:00
|
|
|
type UpstreamServerByAddrPort []UpstreamServer
|
|
|
|
|
|
|
|
func (c UpstreamServerByAddrPort) Len() int { return len(c) }
|
|
|
|
func (c UpstreamServerByAddrPort) Swap(i, j int) { c[i], c[j] = c[j], c[i] }
|
|
|
|
func (c UpstreamServerByAddrPort) Less(i, j int) bool {
|
|
|
|
iName := c[i].Address
|
|
|
|
jName := c[j].Address
|
|
|
|
if iName != jName {
|
|
|
|
return iName < jName
|
|
|
|
}
|
|
|
|
|
|
|
|
iU := c[i].Port
|
|
|
|
jU := c[j].Port
|
|
|
|
return iU < jU
|
|
|
|
}
|
|
|
|
|
|
|
|
// Server describes an NGINX server
|
|
|
|
type Server struct {
|
|
|
|
Name string
|
|
|
|
Locations []Location
|
|
|
|
SSL bool
|
|
|
|
SSLCertificate string
|
|
|
|
SSLCertificateKey string
|
|
|
|
}
|
|
|
|
|
2016-03-15 15:31:39 +00:00
|
|
|
// ServerByName Server sorter by name
|
|
|
|
type ServerByName []Server
|
2016-03-15 02:29:13 +00:00
|
|
|
|
2016-03-15 15:31:39 +00:00
|
|
|
func (c ServerByName) Len() int { return len(c) }
|
|
|
|
func (c ServerByName) Swap(i, j int) { c[i], c[j] = c[j], c[i] }
|
|
|
|
func (c ServerByName) Less(i, j int) bool {
|
2016-03-15 02:29:13 +00:00
|
|
|
return c[i].Name < c[j].Name
|
|
|
|
}
|
|
|
|
|
|
|
|
// Location describes an NGINX location
|
|
|
|
type Location struct {
|
|
|
|
Path string
|
|
|
|
Upstream Upstream
|
|
|
|
}
|
|
|
|
|
2016-03-15 15:31:39 +00:00
|
|
|
// LocationByPath Location sorter by path
|
|
|
|
type LocationByPath []Location
|
2016-03-15 02:29:13 +00:00
|
|
|
|
2016-03-15 15:31:39 +00:00
|
|
|
func (c LocationByPath) Len() int { return len(c) }
|
|
|
|
func (c LocationByPath) Swap(i, j int) { c[i], c[j] = c[j], c[i] }
|
|
|
|
func (c LocationByPath) Less(i, j int) bool {
|
2016-03-15 02:29:13 +00:00
|
|
|
return c[i].Path < c[j].Path
|
|
|
|
}
|
|
|
|
|
2016-03-15 15:31:39 +00:00
|
|
|
// NewDefaultServer return an UpstreamServer to be use as default server returns 502.
|
|
|
|
func NewDefaultServer() UpstreamServer {
|
|
|
|
return UpstreamServer{Address: "127.0.0.1", Port: "8181"}
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewUpstream creates an upstream without servers.
|
|
|
|
func NewUpstream(name string) Upstream {
|
2016-03-15 02:29:13 +00:00
|
|
|
return Upstream{
|
|
|
|
Name: name,
|
2016-03-15 15:31:39 +00:00
|
|
|
Backends: []UpstreamServer{},
|
2016-03-15 02:29:13 +00:00
|
|
|
}
|
|
|
|
}
|
2016-03-16 14:12:45 +00:00
|
|
|
|
|
|
|
// AddOrUpdateCertAndKey creates a .pem file wth the cert and the key with the specified name
|
|
|
|
func (nginx *NginxManager) AddOrUpdateCertAndKey(name string, cert string, key string) string {
|
|
|
|
pemFileName := sslDirectory + "/" + name + ".pem"
|
|
|
|
|
|
|
|
pem, err := os.Create(pemFileName)
|
|
|
|
if err != nil {
|
|
|
|
glog.Fatalf("Couldn't create pem file %v: %v", pemFileName, err)
|
|
|
|
}
|
|
|
|
defer pem.Close()
|
|
|
|
|
|
|
|
_, err = pem.WriteString(string(key))
|
|
|
|
if err != nil {
|
|
|
|
glog.Fatalf("Couldn't write to pem file %v: %v", pemFileName, err)
|
|
|
|
}
|
|
|
|
_, err = pem.WriteString(string(cert))
|
|
|
|
if err != nil {
|
|
|
|
glog.Fatalf("Couldn't write to pem file %v: %v", pemFileName, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return pemFileName
|
|
|
|
}
|