mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-28 05:57:25 +00:00
apiserver command line options lead to config
This commit is contained in:
parent
095f4ef624
commit
250408ee9c
@ -118,13 +118,14 @@ func (o DiscoveryServerOptions) RunDiscoveryServer() error {
|
|||||||
|
|
||||||
genericAPIServerConfig := genericapiserver.NewConfig().
|
genericAPIServerConfig := genericapiserver.NewConfig().
|
||||||
WithSerializer(api.Codecs)
|
WithSerializer(api.Codecs)
|
||||||
if _, err := genericAPIServerConfig.ApplySecureServingOptions(o.SecureServing); err != nil {
|
|
||||||
|
if err := o.SecureServing.ApplyTo(genericAPIServerConfig); err != nil {
|
||||||
|
return fmt.Errorf("failed to configure https: %s", err)
|
||||||
|
}
|
||||||
|
if err := o.Authentication.ApplyTo(genericAPIServerConfig); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if _, err := genericAPIServerConfig.ApplyDelegatingAuthenticationOptions(o.Authentication); err != nil {
|
if err := o.Authorization.ApplyTo(genericAPIServerConfig); err != nil {
|
||||||
return err
|
|
||||||
}
|
|
||||||
if _, err := genericAPIServerConfig.ApplyDelegatingAuthorizationOptions(o.Authorization); err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
genericAPIServerConfig.LongRunningFunc = filters.BasicLongRunningRequestCheck(
|
genericAPIServerConfig.LongRunningFunc = filters.BasicLongRunningRequestCheck(
|
||||||
|
@ -106,15 +106,19 @@ func Run(s *options.ServerRunOptions) error {
|
|||||||
|
|
||||||
// create config from options
|
// create config from options
|
||||||
genericConfig := genericapiserver.NewConfig().
|
genericConfig := genericapiserver.NewConfig().
|
||||||
WithSerializer(api.Codecs).
|
WithSerializer(api.Codecs)
|
||||||
ApplyOptions(s.GenericServerRunOptions).
|
|
||||||
ApplyInsecureServingOptions(s.InsecureServing)
|
|
||||||
|
|
||||||
if _, err := genericConfig.ApplySecureServingOptions(s.SecureServing); err != nil {
|
if err := s.GenericServerRunOptions.ApplyTo(genericConfig); err != nil {
|
||||||
return fmt.Errorf("failed to configure https: %s", err)
|
return err
|
||||||
}
|
}
|
||||||
if err = s.Authentication.Apply(genericConfig); err != nil {
|
if err := s.InsecureServing.ApplyTo(genericConfig); err != nil {
|
||||||
return fmt.Errorf("failed to configure authentication: %s", err)
|
return err
|
||||||
|
}
|
||||||
|
if err := s.SecureServing.ApplyTo(genericConfig); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := s.Authentication.ApplyTo(genericConfig); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
capabilities.Initialize(capabilities.Capabilities{
|
capabilities.Initialize(capabilities.Capabilities{
|
||||||
|
@ -104,14 +104,18 @@ func (serverOptions *ServerRunOptions) Run(stopCh <-chan struct{}) error {
|
|||||||
|
|
||||||
// create config from options
|
// create config from options
|
||||||
config := genericapiserver.NewConfig().
|
config := genericapiserver.NewConfig().
|
||||||
WithSerializer(api.Codecs).
|
WithSerializer(api.Codecs)
|
||||||
ApplyOptions(serverOptions.GenericServerRunOptions).
|
|
||||||
ApplyInsecureServingOptions(serverOptions.InsecureServing)
|
|
||||||
|
|
||||||
if _, err := config.ApplySecureServingOptions(serverOptions.SecureServing); err != nil {
|
if err := serverOptions.GenericServerRunOptions.ApplyTo(config); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := serverOptions.InsecureServing.ApplyTo(config); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := serverOptions.SecureServing.ApplyTo(config); err != nil {
|
||||||
return fmt.Errorf("failed to configure https: %s", err)
|
return fmt.Errorf("failed to configure https: %s", err)
|
||||||
}
|
}
|
||||||
if err := serverOptions.Authentication.Apply(config); err != nil {
|
if err := serverOptions.Authentication.ApplyTo(config); err != nil {
|
||||||
return fmt.Errorf("failed to configure authentication: %s", err)
|
return fmt.Errorf("failed to configure authentication: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,15 +89,19 @@ func Run(s *options.ServerRunOptions) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
genericConfig := genericapiserver.NewConfig().
|
genericConfig := genericapiserver.NewConfig().
|
||||||
WithSerializer(api.Codecs).
|
WithSerializer(api.Codecs)
|
||||||
ApplyOptions(s.GenericServerRunOptions).
|
|
||||||
ApplyInsecureServingOptions(s.InsecureServing)
|
|
||||||
|
|
||||||
if _, err := genericConfig.ApplySecureServingOptions(s.SecureServing); err != nil {
|
if err := s.GenericServerRunOptions.ApplyTo(genericConfig); err != nil {
|
||||||
return fmt.Errorf("failed to configure https: %s", err)
|
return err
|
||||||
}
|
}
|
||||||
if err := s.Authentication.Apply(genericConfig); err != nil {
|
if err := s.InsecureServing.ApplyTo(genericConfig); err != nil {
|
||||||
return fmt.Errorf("failed to configure authentication: %s", err)
|
return err
|
||||||
|
}
|
||||||
|
if err := s.SecureServing.ApplyTo(genericConfig); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := s.Authentication.ApplyTo(genericConfig); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: register cluster federation resources here.
|
// TODO: register cluster federation resources here.
|
||||||
|
@ -297,7 +297,7 @@ func (s *BuiltInAuthenticationOptions) ToAuthenticationConfig() authenticator.Au
|
|||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *BuiltInAuthenticationOptions) Apply(c *genericapiserver.Config) error {
|
func (o *BuiltInAuthenticationOptions) ApplyTo(c *genericapiserver.Config) error {
|
||||||
if o == nil {
|
if o == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -19,10 +19,8 @@ package server
|
|||||||
import (
|
import (
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"crypto/x509"
|
"crypto/x509"
|
||||||
"encoding/pem"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
goruntime "runtime"
|
goruntime "runtime"
|
||||||
@ -34,7 +32,6 @@ import (
|
|||||||
"github.com/emicklei/go-restful/swagger"
|
"github.com/emicklei/go-restful/swagger"
|
||||||
"github.com/go-openapi/spec"
|
"github.com/go-openapi/spec"
|
||||||
"github.com/pborman/uuid"
|
"github.com/pborman/uuid"
|
||||||
"gopkg.in/natefinch/lumberjack.v2"
|
|
||||||
|
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
openapicommon "k8s.io/apimachinery/pkg/openapi"
|
openapicommon "k8s.io/apimachinery/pkg/openapi"
|
||||||
@ -56,7 +53,6 @@ import (
|
|||||||
genericfilters "k8s.io/apiserver/pkg/server/filters"
|
genericfilters "k8s.io/apiserver/pkg/server/filters"
|
||||||
"k8s.io/apiserver/pkg/server/healthz"
|
"k8s.io/apiserver/pkg/server/healthz"
|
||||||
"k8s.io/apiserver/pkg/server/mux"
|
"k8s.io/apiserver/pkg/server/mux"
|
||||||
"k8s.io/apiserver/pkg/server/options"
|
|
||||||
"k8s.io/apiserver/pkg/server/routes"
|
"k8s.io/apiserver/pkg/server/routes"
|
||||||
restclient "k8s.io/client-go/rest"
|
restclient "k8s.io/client-go/rest"
|
||||||
certutil "k8s.io/client-go/util/cert"
|
certutil "k8s.io/client-go/util/cert"
|
||||||
@ -193,25 +189,23 @@ type SecureServingInfo struct {
|
|||||||
|
|
||||||
// NewConfig returns a Config struct with the default values
|
// NewConfig returns a Config struct with the default values
|
||||||
func NewConfig() *Config {
|
func NewConfig() *Config {
|
||||||
config := &Config{
|
return &Config{
|
||||||
ReadWritePort: 6443,
|
ReadWritePort: 6443,
|
||||||
RequestContextMapper: apirequest.NewRequestContextMapper(),
|
RequestContextMapper: apirequest.NewRequestContextMapper(),
|
||||||
BuildHandlerChainsFunc: DefaultBuildHandlerChain,
|
BuildHandlerChainsFunc: DefaultBuildHandlerChain,
|
||||||
LegacyAPIGroupPrefixes: sets.NewString(DefaultLegacyAPIPrefix),
|
LegacyAPIGroupPrefixes: sets.NewString(DefaultLegacyAPIPrefix),
|
||||||
HealthzChecks: []healthz.HealthzChecker{healthz.PingHealthz},
|
HealthzChecks: []healthz.HealthzChecker{healthz.PingHealthz},
|
||||||
EnableIndex: true,
|
EnableIndex: true,
|
||||||
|
EnableGarbageCollection: true,
|
||||||
|
EnableProfiling: true,
|
||||||
|
MaxRequestsInFlight: 400,
|
||||||
|
MaxMutatingRequestsInFlight: 200,
|
||||||
|
MinRequestTimeout: 1800,
|
||||||
|
|
||||||
// Default to treating watch as a long-running operation
|
// Default to treating watch as a long-running operation
|
||||||
// Generic API servers have no inherent long-running subresources
|
// Generic API servers have no inherent long-running subresources
|
||||||
LongRunningFunc: genericfilters.BasicLongRunningRequestCheck(sets.NewString("watch"), sets.NewString()),
|
LongRunningFunc: genericfilters.BasicLongRunningRequestCheck(sets.NewString("watch"), sets.NewString()),
|
||||||
}
|
}
|
||||||
|
|
||||||
// this keeps the defaults in sync
|
|
||||||
defaultOptions := options.NewServerRunOptions()
|
|
||||||
// unset fields that can be overridden to avoid setting values so that we won't end up with lingering values.
|
|
||||||
// TODO we probably want to run the defaults the other way. A default here drives it in the CLI flags
|
|
||||||
defaultOptions.AuditLogPath = ""
|
|
||||||
return config.ApplyOptions(defaultOptions)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Config) WithSerializer(codecs serializer.CodecFactory) *Config {
|
func (c *Config) WithSerializer(codecs serializer.CodecFactory) *Config {
|
||||||
@ -257,82 +251,6 @@ func DefaultSwaggerConfig() *swagger.Config {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Config) ApplySecureServingOptions(secureServing *options.SecureServingOptions) (*Config, error) {
|
|
||||||
if secureServing == nil || secureServing.ServingOptions.BindPort <= 0 {
|
|
||||||
return c, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
secureServingInfo := &SecureServingInfo{
|
|
||||||
ServingInfo: ServingInfo{
|
|
||||||
BindAddress: net.JoinHostPort(secureServing.ServingOptions.BindAddress.String(), strconv.Itoa(secureServing.ServingOptions.BindPort)),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
serverCertFile, serverKeyFile := secureServing.ServerCert.CertKey.CertFile, secureServing.ServerCert.CertKey.KeyFile
|
|
||||||
|
|
||||||
// load main cert
|
|
||||||
if len(serverCertFile) != 0 || len(serverKeyFile) != 0 {
|
|
||||||
tlsCert, err := tls.LoadX509KeyPair(serverCertFile, serverKeyFile)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("unable to load server certificate: %v", err)
|
|
||||||
}
|
|
||||||
secureServingInfo.Cert = &tlsCert
|
|
||||||
}
|
|
||||||
|
|
||||||
// optionally load CA cert
|
|
||||||
if len(secureServing.ServerCert.CACertFile) != 0 {
|
|
||||||
pemData, err := ioutil.ReadFile(secureServing.ServerCert.CACertFile)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("failed to read certificate authority from %q: %v", secureServing.ServerCert.CACertFile, err)
|
|
||||||
}
|
|
||||||
block, pemData := pem.Decode(pemData)
|
|
||||||
if block == nil {
|
|
||||||
return nil, fmt.Errorf("no certificate found in certificate authority file %q", secureServing.ServerCert.CACertFile)
|
|
||||||
}
|
|
||||||
if block.Type != "CERTIFICATE" {
|
|
||||||
return nil, fmt.Errorf("expected CERTIFICATE block in certiticate authority file %q, found: %s", secureServing.ServerCert.CACertFile, block.Type)
|
|
||||||
}
|
|
||||||
secureServingInfo.CACert = &tls.Certificate{
|
|
||||||
Certificate: [][]byte{block.Bytes},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// load SNI certs
|
|
||||||
namedTlsCerts := make([]namedTlsCert, 0, len(secureServing.SNICertKeys))
|
|
||||||
for _, nck := range secureServing.SNICertKeys {
|
|
||||||
tlsCert, err := tls.LoadX509KeyPair(nck.CertFile, nck.KeyFile)
|
|
||||||
namedTlsCerts = append(namedTlsCerts, namedTlsCert{
|
|
||||||
tlsCert: tlsCert,
|
|
||||||
names: nck.Names,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("failed to load SNI cert and key: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var err error
|
|
||||||
secureServingInfo.SNICerts, err = getNamedCertificateMap(namedTlsCerts)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
c.SecureServingInfo = secureServingInfo
|
|
||||||
c.ReadWritePort = secureServing.ServingOptions.BindPort
|
|
||||||
|
|
||||||
return c, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Config) ApplyInsecureServingOptions(insecureServing *options.ServingOptions) *Config {
|
|
||||||
if insecureServing == nil || insecureServing.BindPort <= 0 {
|
|
||||||
return c
|
|
||||||
}
|
|
||||||
|
|
||||||
c.InsecureServingInfo = &ServingInfo{
|
|
||||||
BindAddress: net.JoinHostPort(insecureServing.BindAddress.String(), strconv.Itoa(insecureServing.BindPort)),
|
|
||||||
}
|
|
||||||
|
|
||||||
return c
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Config) ApplyClientCert(clientCAFile string) (*Config, error) {
|
func (c *Config) ApplyClientCert(clientCAFile string) (*Config, error) {
|
||||||
if c.SecureServingInfo != nil {
|
if c.SecureServingInfo != nil {
|
||||||
if len(clientCAFile) > 0 {
|
if len(clientCAFile) > 0 {
|
||||||
@ -352,83 +270,6 @@ func (c *Config) ApplyClientCert(clientCAFile string) (*Config, error) {
|
|||||||
return c, nil
|
return c, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Config) ApplyDelegatingAuthenticationOptions(o *options.DelegatingAuthenticationOptions) (*Config, error) {
|
|
||||||
if o == nil {
|
|
||||||
return c, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var err error
|
|
||||||
c, err = c.ApplyClientCert(o.ClientCert.ClientCA)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("unable to load client CA file: %v", err)
|
|
||||||
}
|
|
||||||
c, err = c.ApplyClientCert(o.RequestHeader.ClientCAFile)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("unable to load client CA file: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
cfg, err := o.ToAuthenticationConfig()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
authenticator, securityDefinitions, err := cfg.New()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
c.Authenticator = authenticator
|
|
||||||
if c.OpenAPIConfig != nil {
|
|
||||||
c.OpenAPIConfig.SecurityDefinitions = securityDefinitions
|
|
||||||
}
|
|
||||||
c.SupportsBasicAuth = false
|
|
||||||
|
|
||||||
return c, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Config) ApplyDelegatingAuthorizationOptions(o *options.DelegatingAuthorizationOptions) (*Config, error) {
|
|
||||||
if o == nil {
|
|
||||||
return c, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
cfg, err := o.ToAuthorizationConfig()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
authorizer, err := cfg.New()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
c.Authorizer = authorizer
|
|
||||||
|
|
||||||
return c, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ApplyOptions applies the run options to the method receiver and returns self
|
|
||||||
func (c *Config) ApplyOptions(options *options.ServerRunOptions) *Config {
|
|
||||||
if len(options.AuditLogPath) != 0 {
|
|
||||||
c.AuditWriter = &lumberjack.Logger{
|
|
||||||
Filename: options.AuditLogPath,
|
|
||||||
MaxAge: options.AuditLogMaxAge,
|
|
||||||
MaxBackups: options.AuditLogMaxBackups,
|
|
||||||
MaxSize: options.AuditLogMaxSize,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
c.CorsAllowedOriginList = options.CorsAllowedOriginList
|
|
||||||
c.EnableGarbageCollection = options.EnableGarbageCollection
|
|
||||||
c.EnableProfiling = options.EnableProfiling
|
|
||||||
c.EnableContentionProfiling = options.EnableContentionProfiling
|
|
||||||
c.EnableSwaggerUI = options.EnableSwaggerUI
|
|
||||||
c.ExternalAddress = options.ExternalHost
|
|
||||||
c.MaxRequestsInFlight = options.MaxRequestsInFlight
|
|
||||||
c.MaxMutatingRequestsInFlight = options.MaxMutatingRequestsInFlight
|
|
||||||
c.MinRequestTimeout = options.MinRequestTimeout
|
|
||||||
c.PublicAddress = options.AdvertiseAddress
|
|
||||||
|
|
||||||
return c
|
|
||||||
}
|
|
||||||
|
|
||||||
type completedConfig struct {
|
type completedConfig struct {
|
||||||
*Config
|
*Config
|
||||||
}
|
}
|
||||||
|
@ -40,13 +40,13 @@ import (
|
|||||||
utilnet "k8s.io/apimachinery/pkg/util/net"
|
utilnet "k8s.io/apimachinery/pkg/util/net"
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
"k8s.io/apiserver/pkg/admission"
|
"k8s.io/apiserver/pkg/admission"
|
||||||
apirequest "k8s.io/apiserver/pkg/endpoints/request"
|
|
||||||
"k8s.io/apiserver/pkg/server/healthz"
|
|
||||||
restclient "k8s.io/client-go/rest"
|
|
||||||
genericapi "k8s.io/apiserver/pkg/endpoints"
|
genericapi "k8s.io/apiserver/pkg/endpoints"
|
||||||
|
apirequest "k8s.io/apiserver/pkg/endpoints/request"
|
||||||
"k8s.io/apiserver/pkg/registry/rest"
|
"k8s.io/apiserver/pkg/registry/rest"
|
||||||
|
"k8s.io/apiserver/pkg/server/healthz"
|
||||||
genericmux "k8s.io/apiserver/pkg/server/mux"
|
genericmux "k8s.io/apiserver/pkg/server/mux"
|
||||||
"k8s.io/apiserver/pkg/server/routes"
|
"k8s.io/apiserver/pkg/server/routes"
|
||||||
|
restclient "k8s.io/client-go/rest"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Info about an API group.
|
// Info about an API group.
|
||||||
@ -212,6 +212,11 @@ func (s preparedGenericAPIServer) Run(stopCh <-chan struct{}) {
|
|||||||
<-stopCh
|
<-stopCh
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// EffectiveSecurePort returns the secure port we bound to.
|
||||||
|
func (s *GenericAPIServer) EffectiveSecurePort() int {
|
||||||
|
return s.effectiveSecurePort
|
||||||
|
}
|
||||||
|
|
||||||
// installAPIResources is a private method for installing the REST storage backing each api groupversionresource
|
// installAPIResources is a private method for installing the REST storage backing each api groupversionresource
|
||||||
func (s *GenericAPIServer) installAPIResources(apiPrefix string, apiGroupInfo *APIGroupInfo) error {
|
func (s *GenericAPIServer) installAPIResources(apiPrefix string, apiGroupInfo *APIGroupInfo) error {
|
||||||
for _, groupVersion := range apiGroupInfo.GroupMeta.GroupVersions {
|
for _, groupVersion := range apiGroupInfo.GroupMeta.GroupVersions {
|
||||||
|
@ -17,11 +17,13 @@ limitations under the License.
|
|||||||
package options
|
package options
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/spf13/pflag"
|
"github.com/spf13/pflag"
|
||||||
|
|
||||||
"k8s.io/apiserver/pkg/authentication/authenticatorfactory"
|
"k8s.io/apiserver/pkg/authentication/authenticatorfactory"
|
||||||
|
"k8s.io/apiserver/pkg/server"
|
||||||
authenticationclient "k8s.io/client-go/kubernetes/typed/authentication/v1beta1"
|
authenticationclient "k8s.io/client-go/kubernetes/typed/authentication/v1beta1"
|
||||||
"k8s.io/client-go/rest"
|
"k8s.io/client-go/rest"
|
||||||
"k8s.io/client-go/tools/clientcmd"
|
"k8s.io/client-go/tools/clientcmd"
|
||||||
@ -128,6 +130,35 @@ func (s *DelegatingAuthenticationOptions) AddFlags(fs *pflag.FlagSet) {
|
|||||||
s.RequestHeader.AddFlags(fs)
|
s.RequestHeader.AddFlags(fs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *DelegatingAuthenticationOptions) ApplyTo(c *server.Config) error {
|
||||||
|
var err error
|
||||||
|
c, err = c.ApplyClientCert(s.ClientCert.ClientCA)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("unable to load client CA file: %v", err)
|
||||||
|
}
|
||||||
|
c, err = c.ApplyClientCert(s.RequestHeader.ClientCAFile)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("unable to load client CA file: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg, err := s.ToAuthenticationConfig()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
authenticator, securityDefinitions, err := cfg.New()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
c.Authenticator = authenticator
|
||||||
|
if c.OpenAPIConfig != nil {
|
||||||
|
c.OpenAPIConfig.SecurityDefinitions = securityDefinitions
|
||||||
|
}
|
||||||
|
c.SupportsBasicAuth = false
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (s *DelegatingAuthenticationOptions) ToAuthenticationConfig() (authenticatorfactory.DelegatingAuthenticatorConfig, error) {
|
func (s *DelegatingAuthenticationOptions) ToAuthenticationConfig() (authenticatorfactory.DelegatingAuthenticatorConfig, error) {
|
||||||
tokenClient, err := s.newTokenAccessReview()
|
tokenClient, err := s.newTokenAccessReview()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -22,6 +22,7 @@ import (
|
|||||||
"github.com/spf13/pflag"
|
"github.com/spf13/pflag"
|
||||||
|
|
||||||
"k8s.io/apiserver/pkg/authorization/authorizerfactory"
|
"k8s.io/apiserver/pkg/authorization/authorizerfactory"
|
||||||
|
"k8s.io/apiserver/pkg/server"
|
||||||
authorizationclient "k8s.io/client-go/kubernetes/typed/authorization/v1beta1"
|
authorizationclient "k8s.io/client-go/kubernetes/typed/authorization/v1beta1"
|
||||||
"k8s.io/client-go/rest"
|
"k8s.io/client-go/rest"
|
||||||
"k8s.io/client-go/tools/clientcmd"
|
"k8s.io/client-go/tools/clientcmd"
|
||||||
@ -69,6 +70,20 @@ func (s *DelegatingAuthorizationOptions) AddFlags(fs *pflag.FlagSet) {
|
|||||||
"The duration to cache 'unauthorized' responses from the webhook authorizer.")
|
"The duration to cache 'unauthorized' responses from the webhook authorizer.")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *DelegatingAuthorizationOptions) ApplyTo(c *server.Config) error {
|
||||||
|
cfg, err := s.ToAuthorizationConfig()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
authorizer, err := cfg.New()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
c.Authorizer = authorizer
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (s *DelegatingAuthorizationOptions) ToAuthorizationConfig() (authorizerfactory.DelegatingAuthorizerConfig, error) {
|
func (s *DelegatingAuthorizationOptions) ToAuthorizationConfig() (authorizerfactory.DelegatingAuthorizerConfig, error) {
|
||||||
sarClient, err := s.newSubjectAccessReview()
|
sarClient, err := s.newSubjectAccessReview()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -23,6 +23,7 @@ import (
|
|||||||
|
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apiserver/pkg/admission"
|
"k8s.io/apiserver/pkg/admission"
|
||||||
|
"k8s.io/apiserver/pkg/server"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
utilflag "k8s.io/apiserver/pkg/util/flag"
|
utilflag "k8s.io/apiserver/pkg/util/flag"
|
||||||
|
|
||||||
@ -30,6 +31,7 @@ import (
|
|||||||
_ "k8s.io/apiserver/pkg/features"
|
_ "k8s.io/apiserver/pkg/features"
|
||||||
|
|
||||||
"github.com/spf13/pflag"
|
"github.com/spf13/pflag"
|
||||||
|
"gopkg.in/natefinch/lumberjack.v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ServerRunOptions contains the options while running a generic api server.
|
// ServerRunOptions contains the options while running a generic api server.
|
||||||
@ -62,21 +64,48 @@ type ServerRunOptions struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func NewServerRunOptions() *ServerRunOptions {
|
func NewServerRunOptions() *ServerRunOptions {
|
||||||
|
defaults := server.NewConfig()
|
||||||
|
|
||||||
return &ServerRunOptions{
|
return &ServerRunOptions{
|
||||||
AdmissionControl: "AlwaysAdmit",
|
AdmissionControl: "AlwaysAdmit",
|
||||||
DefaultStorageMediaType: "application/json",
|
DefaultStorageMediaType: "application/json",
|
||||||
DeleteCollectionWorkers: 1,
|
DeleteCollectionWorkers: 1,
|
||||||
EnableGarbageCollection: true,
|
EnableGarbageCollection: defaults.EnableGarbageCollection,
|
||||||
EnableProfiling: true,
|
EnableProfiling: defaults.EnableProfiling,
|
||||||
EnableContentionProfiling: false,
|
EnableContentionProfiling: false,
|
||||||
EnableWatchCache: true,
|
EnableWatchCache: true,
|
||||||
MaxRequestsInFlight: 400,
|
MaxRequestsInFlight: defaults.MaxRequestsInFlight,
|
||||||
MaxMutatingRequestsInFlight: 200,
|
MaxMutatingRequestsInFlight: defaults.MaxMutatingRequestsInFlight,
|
||||||
MinRequestTimeout: 1800,
|
MinRequestTimeout: defaults.MinRequestTimeout,
|
||||||
RuntimeConfig: make(utilflag.ConfigurationMap),
|
RuntimeConfig: make(utilflag.ConfigurationMap),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ApplyOptions applies the run options to the method receiver and returns self
|
||||||
|
func (s *ServerRunOptions) ApplyTo(c *server.Config) error {
|
||||||
|
if len(s.AuditLogPath) != 0 {
|
||||||
|
c.AuditWriter = &lumberjack.Logger{
|
||||||
|
Filename: s.AuditLogPath,
|
||||||
|
MaxAge: s.AuditLogMaxAge,
|
||||||
|
MaxBackups: s.AuditLogMaxBackups,
|
||||||
|
MaxSize: s.AuditLogMaxSize,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
c.CorsAllowedOriginList = s.CorsAllowedOriginList
|
||||||
|
c.EnableGarbageCollection = s.EnableGarbageCollection
|
||||||
|
c.EnableProfiling = s.EnableProfiling
|
||||||
|
c.EnableContentionProfiling = s.EnableContentionProfiling
|
||||||
|
c.EnableSwaggerUI = s.EnableSwaggerUI
|
||||||
|
c.ExternalAddress = s.ExternalHost
|
||||||
|
c.MaxRequestsInFlight = s.MaxRequestsInFlight
|
||||||
|
c.MaxMutatingRequestsInFlight = s.MaxMutatingRequestsInFlight
|
||||||
|
c.MinRequestTimeout = s.MinRequestTimeout
|
||||||
|
c.PublicAddress = s.AdvertiseAddress
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// DefaultAdvertiseAddress sets the field AdvertiseAddress if
|
// DefaultAdvertiseAddress sets the field AdvertiseAddress if
|
||||||
// unset. The field will be set based on the SecureServingOptions. If
|
// unset. The field will be set based on the SecureServingOptions. If
|
||||||
// the SecureServingOptions is not present, DefaultExternalAddress
|
// the SecureServingOptions is not present, DefaultExternalAddress
|
||||||
|
@ -17,14 +17,19 @@ limitations under the License.
|
|||||||
package options
|
package options
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/tls"
|
||||||
|
"encoding/pem"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
"net"
|
"net"
|
||||||
"path"
|
"path"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
"github.com/spf13/pflag"
|
"github.com/spf13/pflag"
|
||||||
|
|
||||||
utilnet "k8s.io/apimachinery/pkg/util/net"
|
utilnet "k8s.io/apimachinery/pkg/util/net"
|
||||||
|
"k8s.io/apiserver/pkg/server"
|
||||||
utilflag "k8s.io/apiserver/pkg/util/flag"
|
utilflag "k8s.io/apiserver/pkg/util/flag"
|
||||||
certutil "k8s.io/client-go/util/cert"
|
certutil "k8s.io/client-go/util/cert"
|
||||||
)
|
)
|
||||||
@ -130,6 +135,70 @@ func (s *SecureServingOptions) AddDeprecatedFlags(fs *pflag.FlagSet) {
|
|||||||
fs.MarkDeprecated("public-address-override", "see --bind-address instead.")
|
fs.MarkDeprecated("public-address-override", "see --bind-address instead.")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *SecureServingOptions) ApplyTo(c *server.Config) error {
|
||||||
|
if s.ServingOptions.BindPort <= 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
secureServingInfo := &server.SecureServingInfo{
|
||||||
|
ServingInfo: server.ServingInfo{
|
||||||
|
BindAddress: net.JoinHostPort(s.ServingOptions.BindAddress.String(), strconv.Itoa(s.ServingOptions.BindPort)),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
serverCertFile, serverKeyFile := s.ServerCert.CertKey.CertFile, s.ServerCert.CertKey.KeyFile
|
||||||
|
|
||||||
|
// load main cert
|
||||||
|
if len(serverCertFile) != 0 || len(serverKeyFile) != 0 {
|
||||||
|
tlsCert, err := tls.LoadX509KeyPair(serverCertFile, serverKeyFile)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("unable to load server certificate: %v", err)
|
||||||
|
}
|
||||||
|
secureServingInfo.Cert = &tlsCert
|
||||||
|
}
|
||||||
|
|
||||||
|
// optionally load CA cert
|
||||||
|
if len(s.ServerCert.CACertFile) != 0 {
|
||||||
|
pemData, err := ioutil.ReadFile(s.ServerCert.CACertFile)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to read certificate authority from %q: %v", s.ServerCert.CACertFile, err)
|
||||||
|
}
|
||||||
|
block, pemData := pem.Decode(pemData)
|
||||||
|
if block == nil {
|
||||||
|
return fmt.Errorf("no certificate found in certificate authority file %q", s.ServerCert.CACertFile)
|
||||||
|
}
|
||||||
|
if block.Type != "CERTIFICATE" {
|
||||||
|
return fmt.Errorf("expected CERTIFICATE block in certiticate authority file %q, found: %s", s.ServerCert.CACertFile, block.Type)
|
||||||
|
}
|
||||||
|
secureServingInfo.CACert = &tls.Certificate{
|
||||||
|
Certificate: [][]byte{block.Bytes},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// load SNI certs
|
||||||
|
namedTLSCerts := make([]server.NamedTLSCert, 0, len(s.SNICertKeys))
|
||||||
|
for _, nck := range s.SNICertKeys {
|
||||||
|
tlsCert, err := tls.LoadX509KeyPair(nck.CertFile, nck.KeyFile)
|
||||||
|
namedTLSCerts = append(namedTLSCerts, server.NamedTLSCert{
|
||||||
|
TLSCert: tlsCert,
|
||||||
|
Names: nck.Names,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to load SNI cert and key: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var err error
|
||||||
|
secureServingInfo.SNICerts, err = server.GetNamedCertificateMap(namedTLSCerts)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
c.SecureServingInfo = secureServingInfo
|
||||||
|
c.ReadWritePort = s.ServingOptions.BindPort
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func NewInsecureServingOptions() *ServingOptions {
|
func NewInsecureServingOptions() *ServingOptions {
|
||||||
return &ServingOptions{
|
return &ServingOptions{
|
||||||
BindAddress: net.ParseIP("127.0.0.1"),
|
BindAddress: net.ParseIP("127.0.0.1"),
|
||||||
@ -172,6 +241,18 @@ func (s *ServingOptions) AddDeprecatedFlags(fs *pflag.FlagSet) {
|
|||||||
fs.MarkDeprecated("port", "see --insecure-port instead.")
|
fs.MarkDeprecated("port", "see --insecure-port instead.")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *ServingOptions) ApplyTo(c *server.Config) error {
|
||||||
|
if s.BindPort <= 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
c.InsecureServingInfo = &server.ServingInfo{
|
||||||
|
BindAddress: net.JoinHostPort(s.BindAddress.String(), strconv.Itoa(s.BindPort)),
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (s *SecureServingOptions) MaybeDefaultWithSelfSignedCerts(publicAddress string, alternateIPs ...net.IP) error {
|
func (s *SecureServingOptions) MaybeDefaultWithSelfSignedCerts(publicAddress string, alternateIPs ...net.IP) error {
|
||||||
if s == nil {
|
if s == nil {
|
||||||
return nil
|
return nil
|
||||||
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package server
|
package options
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
@ -26,17 +26,30 @@ import (
|
|||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strconv"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
||||||
"k8s.io/apiserver/pkg/server/options"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime/serializer"
|
||||||
|
"k8s.io/apimachinery/pkg/version"
|
||||||
|
genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
|
||||||
|
. "k8s.io/apiserver/pkg/server"
|
||||||
utilflag "k8s.io/apiserver/pkg/util/flag"
|
utilflag "k8s.io/apiserver/pkg/util/flag"
|
||||||
utilcert "k8s.io/client-go/util/cert"
|
utilcert "k8s.io/client-go/util/cert"
|
||||||
"k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
|
"k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func setUp(t *testing.T) Config {
|
||||||
|
scheme := runtime.NewScheme()
|
||||||
|
codecs := serializer.NewCodecFactory(scheme)
|
||||||
|
|
||||||
|
config := NewConfig().WithSerializer(codecs)
|
||||||
|
config.RequestContextMapper = genericapirequest.NewRequestContextMapper()
|
||||||
|
|
||||||
|
return *config
|
||||||
|
}
|
||||||
|
|
||||||
type TestCertSpec struct {
|
type TestCertSpec struct {
|
||||||
host string
|
host string
|
||||||
names, ips []string // in certificate
|
names, ips []string // in certificate
|
||||||
@ -190,7 +203,7 @@ func TestGetNamedCertificateMap(t *testing.T) {
|
|||||||
|
|
||||||
NextTest:
|
NextTest:
|
||||||
for i, test := range tests {
|
for i, test := range tests {
|
||||||
var namedTLSCerts []namedTlsCert
|
var namedTLSCerts []NamedTLSCert
|
||||||
bySignature := map[string]int{} // index in test.certs by cert signature
|
bySignature := map[string]int{} // index in test.certs by cert signature
|
||||||
for j, c := range test.certs {
|
for j, c := range test.certs {
|
||||||
cert, err := createTestTLSCerts(c.TestCertSpec)
|
cert, err := createTestTLSCerts(c.TestCertSpec)
|
||||||
@ -199,9 +212,9 @@ NextTest:
|
|||||||
continue NextTest
|
continue NextTest
|
||||||
}
|
}
|
||||||
|
|
||||||
namedTLSCerts = append(namedTLSCerts, namedTlsCert{
|
namedTLSCerts = append(namedTLSCerts, NamedTLSCert{
|
||||||
tlsCert: cert,
|
TLSCert: cert,
|
||||||
names: c.explicitNames,
|
Names: c.explicitNames,
|
||||||
})
|
})
|
||||||
|
|
||||||
sig, err := certSignature(cert)
|
sig, err := certSignature(cert)
|
||||||
@ -212,7 +225,7 @@ NextTest:
|
|||||||
bySignature[sig] = j
|
bySignature[sig] = j
|
||||||
}
|
}
|
||||||
|
|
||||||
certMap, err := getNamedCertificateMap(namedTLSCerts)
|
certMap, err := GetNamedCertificateMap(namedTLSCerts)
|
||||||
if err == nil && len(test.errorString) != 0 {
|
if err == nil && len(test.errorString) != 0 {
|
||||||
t.Errorf("%d - expected no error, got: %v", i, err)
|
t.Errorf("%d - expected no error, got: %v", i, err)
|
||||||
} else if err != nil && err.Error() != test.errorString {
|
} else if err != nil && err.Error() != test.errorString {
|
||||||
@ -461,27 +474,26 @@ NextTest:
|
|||||||
stopCh := make(chan struct{})
|
stopCh := make(chan struct{})
|
||||||
|
|
||||||
// launch server
|
// launch server
|
||||||
etcdserver, config, _ := setUp(t)
|
config := setUp(t)
|
||||||
defer etcdserver.Terminate(t)
|
|
||||||
|
|
||||||
v := fakeVersion()
|
v := fakeVersion()
|
||||||
config.Version = &v
|
config.Version = &v
|
||||||
|
|
||||||
config.EnableIndex = true
|
config.EnableIndex = true
|
||||||
_, err = config.ApplySecureServingOptions(&options.SecureServingOptions{
|
secureOptions := &SecureServingOptions{
|
||||||
ServingOptions: options.ServingOptions{
|
ServingOptions: ServingOptions{
|
||||||
BindAddress: net.ParseIP("127.0.0.1"),
|
BindAddress: net.ParseIP("127.0.0.1"),
|
||||||
BindPort: 6443,
|
BindPort: 6443,
|
||||||
},
|
},
|
||||||
ServerCert: options.GeneratableKeyCert{
|
ServerCert: GeneratableKeyCert{
|
||||||
CertKey: options.CertKey{
|
CertKey: CertKey{
|
||||||
CertFile: serverCertBundleFile,
|
CertFile: serverCertBundleFile,
|
||||||
KeyFile: serverKeyFile,
|
KeyFile: serverKeyFile,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
SNICertKeys: namedCertKeys,
|
SNICertKeys: namedCertKeys,
|
||||||
})
|
}
|
||||||
if err != nil {
|
if err := secureOptions.ApplyTo(&config); err != nil {
|
||||||
t.Errorf("%q - failed applying the SecureServingOptions: %v", title, err)
|
t.Errorf("%q - failed applying the SecureServingOptions: %v", title, err)
|
||||||
continue NextTest
|
continue NextTest
|
||||||
}
|
}
|
||||||
@ -496,10 +508,14 @@ NextTest:
|
|||||||
// patch in a 0-port to enable auto port allocation
|
// patch in a 0-port to enable auto port allocation
|
||||||
s.SecureServingInfo.BindAddress = "127.0.0.1:0"
|
s.SecureServingInfo.BindAddress = "127.0.0.1:0"
|
||||||
|
|
||||||
if err := s.serveSecurely(stopCh); err != nil {
|
// add poststart hook to know when the server is up.
|
||||||
t.Errorf("%q - failed running the server: %v", title, err)
|
startedCh := make(chan struct{})
|
||||||
continue NextTest
|
s.AddPostStartHook("test-notifier", func(context PostStartHookContext) error {
|
||||||
}
|
close(startedCh)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
preparedServer := s.PrepareRun()
|
||||||
|
go preparedServer.Run(stopCh)
|
||||||
|
|
||||||
// load ca certificates into a pool
|
// load ca certificates into a pool
|
||||||
roots := x509.NewCertPool()
|
roots := x509.NewCertPool()
|
||||||
@ -507,8 +523,11 @@ NextTest:
|
|||||||
roots.AddCert(caCert)
|
roots.AddCert(caCert)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
<-startedCh
|
||||||
|
|
||||||
|
effectiveSecurePort := fmt.Sprintf("%d", preparedServer.EffectiveSecurePort())
|
||||||
// try to dial
|
// try to dial
|
||||||
addr := fmt.Sprintf("localhost:%d", s.effectiveSecurePort)
|
addr := fmt.Sprintf("localhost:%s", effectiveSecurePort)
|
||||||
t.Logf("Dialing %s as %q", addr, test.ServerName)
|
t.Logf("Dialing %s as %q", addr, test.ServerName)
|
||||||
conn, err := tls.Dial("tcp", addr, &tls.Config{
|
conn, err := tls.Dial("tcp", addr, &tls.Config{
|
||||||
RootCAs: roots,
|
RootCAs: roots,
|
||||||
@ -536,7 +555,7 @@ NextTest:
|
|||||||
if len(test.SelfClientBindAddressOverride) != 0 {
|
if len(test.SelfClientBindAddressOverride) != 0 {
|
||||||
host = test.SelfClientBindAddressOverride
|
host = test.SelfClientBindAddressOverride
|
||||||
}
|
}
|
||||||
config.SecureServingInfo.ServingInfo.BindAddress = net.JoinHostPort(host, strconv.Itoa(s.effectiveSecurePort))
|
config.SecureServingInfo.ServingInfo.BindAddress = net.JoinHostPort(host, effectiveSecurePort)
|
||||||
cfg, err := config.SecureServingInfo.NewSelfClientConfig("some-token")
|
cfg, err := config.SecureServingInfo.NewSelfClientConfig("some-token")
|
||||||
if test.ExpectSelfClientError {
|
if test.ExpectSelfClientError {
|
||||||
if err == nil {
|
if err == nil {
|
||||||
@ -654,3 +673,13 @@ func certSignature(cert tls.Certificate) (string, error) {
|
|||||||
}
|
}
|
||||||
return x509CertSignature(x509Certs[0]), nil
|
return x509CertSignature(x509Certs[0]), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func fakeVersion() version.Info {
|
||||||
|
return version.Info{
|
||||||
|
Major: "42",
|
||||||
|
Minor: "42",
|
||||||
|
GitVersion: "42",
|
||||||
|
GitCommit: "34973274ccef6ab4dfaaf86599792fa9c3fe4689",
|
||||||
|
GitTreeState: "Dirty",
|
||||||
|
}
|
||||||
|
}
|
@ -173,25 +173,25 @@ func runServer(server *http.Server, network string, stopCh <-chan struct{}) (int
|
|||||||
return tcpAddr.Port, nil
|
return tcpAddr.Port, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type namedTlsCert struct {
|
type NamedTLSCert struct {
|
||||||
tlsCert tls.Certificate
|
TLSCert tls.Certificate
|
||||||
|
|
||||||
// names is a list of domain patterns: fully qualified domain names, possibly prefixed with
|
// names is a list of domain patterns: fully qualified domain names, possibly prefixed with
|
||||||
// wildcard segments.
|
// wildcard segments.
|
||||||
names []string
|
Names []string
|
||||||
}
|
}
|
||||||
|
|
||||||
// getNamedCertificateMap returns a map of *tls.Certificate by name. It's is
|
// getNamedCertificateMap returns a map of *tls.Certificate by name. It's is
|
||||||
// suitable for use in tls.Config#NamedCertificates. Returns an error if any of the certs
|
// suitable for use in tls.Config#NamedCertificates. Returns an error if any of the certs
|
||||||
// cannot be loaded. Returns nil if len(certs) == 0
|
// cannot be loaded. Returns nil if len(certs) == 0
|
||||||
func getNamedCertificateMap(certs []namedTlsCert) (map[string]*tls.Certificate, error) {
|
func GetNamedCertificateMap(certs []NamedTLSCert) (map[string]*tls.Certificate, error) {
|
||||||
// register certs with implicit names first, reverse order such that earlier trump over the later
|
// register certs with implicit names first, reverse order such that earlier trump over the later
|
||||||
byName := map[string]*tls.Certificate{}
|
byName := map[string]*tls.Certificate{}
|
||||||
for i := len(certs) - 1; i >= 0; i-- {
|
for i := len(certs) - 1; i >= 0; i-- {
|
||||||
if len(certs[i].names) > 0 {
|
if len(certs[i].Names) > 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
cert := &certs[i].tlsCert
|
cert := &certs[i].TLSCert
|
||||||
|
|
||||||
// read names from certificate common names and DNS names
|
// read names from certificate common names and DNS names
|
||||||
if len(cert.Certificate) == 0 {
|
if len(cert.Certificate) == 0 {
|
||||||
@ -216,8 +216,8 @@ func getNamedCertificateMap(certs []namedTlsCert) (map[string]*tls.Certificate,
|
|||||||
// again in reverse order.
|
// again in reverse order.
|
||||||
for i := len(certs) - 1; i >= 0; i-- {
|
for i := len(certs) - 1; i >= 0; i-- {
|
||||||
namedCert := &certs[i]
|
namedCert := &certs[i]
|
||||||
for _, name := range namedCert.names {
|
for _, name := range namedCert.Names {
|
||||||
byName[name] = &certs[i].tlsCert
|
byName[name] = &certs[i].TLSCert
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,7 +28,6 @@ import (
|
|||||||
"k8s.io/apiserver/pkg/apis/example"
|
"k8s.io/apiserver/pkg/apis/example"
|
||||||
exampleinstall "k8s.io/apiserver/pkg/apis/example/install"
|
exampleinstall "k8s.io/apiserver/pkg/apis/example/install"
|
||||||
examplev1 "k8s.io/apiserver/pkg/apis/example/v1"
|
examplev1 "k8s.io/apiserver/pkg/apis/example/v1"
|
||||||
"k8s.io/apiserver/pkg/server/options"
|
|
||||||
"k8s.io/apiserver/pkg/storage/storagebackend"
|
"k8s.io/apiserver/pkg/storage/storagebackend"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -128,7 +127,7 @@ func TestUpdateEtcdOverrides(t *testing.T) {
|
|||||||
defaultEtcdLocation := []string{"http://127.0.0.1"}
|
defaultEtcdLocation := []string{"http://127.0.0.1"}
|
||||||
for i, test := range testCases {
|
for i, test := range testCases {
|
||||||
defaultConfig := storagebackend.Config{
|
defaultConfig := storagebackend.Config{
|
||||||
Prefix: options.DefaultEtcdPathPrefix,
|
Prefix: "/registry",
|
||||||
ServerList: defaultEtcdLocation,
|
ServerList: defaultEtcdLocation,
|
||||||
Copier: scheme,
|
Copier: scheme,
|
||||||
}
|
}
|
||||||
|
27
vendor/BUILD
vendored
27
vendor/BUILD
vendored
@ -9058,7 +9058,6 @@ go_library(
|
|||||||
"//vendor:github.com/golang/glog",
|
"//vendor:github.com/golang/glog",
|
||||||
"//vendor:github.com/pborman/uuid",
|
"//vendor:github.com/pborman/uuid",
|
||||||
"//vendor:github.com/pkg/errors",
|
"//vendor:github.com/pkg/errors",
|
||||||
"//vendor:gopkg.in/natefinch/lumberjack.v2",
|
|
||||||
"//vendor:k8s.io/apimachinery/pkg/apimachinery",
|
"//vendor:k8s.io/apimachinery/pkg/apimachinery",
|
||||||
"//vendor:k8s.io/apimachinery/pkg/apimachinery/registered",
|
"//vendor:k8s.io/apimachinery/pkg/apimachinery/registered",
|
||||||
"//vendor:k8s.io/apimachinery/pkg/apis/meta/v1",
|
"//vendor:k8s.io/apimachinery/pkg/apis/meta/v1",
|
||||||
@ -9089,7 +9088,6 @@ go_library(
|
|||||||
"//vendor:k8s.io/apiserver/pkg/server/filters",
|
"//vendor:k8s.io/apiserver/pkg/server/filters",
|
||||||
"//vendor:k8s.io/apiserver/pkg/server/healthz",
|
"//vendor:k8s.io/apiserver/pkg/server/healthz",
|
||||||
"//vendor:k8s.io/apiserver/pkg/server/mux",
|
"//vendor:k8s.io/apiserver/pkg/server/mux",
|
||||||
"//vendor:k8s.io/apiserver/pkg/server/options",
|
|
||||||
"//vendor:k8s.io/apiserver/pkg/server/routes",
|
"//vendor:k8s.io/apiserver/pkg/server/routes",
|
||||||
"//vendor:k8s.io/apiserver/pkg/storage/storagebackend",
|
"//vendor:k8s.io/apiserver/pkg/storage/storagebackend",
|
||||||
"//vendor:k8s.io/client-go/rest",
|
"//vendor:k8s.io/client-go/rest",
|
||||||
@ -14088,6 +14086,7 @@ go_library(
|
|||||||
deps = [
|
deps = [
|
||||||
"//vendor:github.com/golang/glog",
|
"//vendor:github.com/golang/glog",
|
||||||
"//vendor:github.com/spf13/pflag",
|
"//vendor:github.com/spf13/pflag",
|
||||||
|
"//vendor:gopkg.in/natefinch/lumberjack.v2",
|
||||||
"//vendor:k8s.io/apimachinery/pkg/apis/meta/v1",
|
"//vendor:k8s.io/apimachinery/pkg/apis/meta/v1",
|
||||||
"//vendor:k8s.io/apimachinery/pkg/runtime",
|
"//vendor:k8s.io/apimachinery/pkg/runtime",
|
||||||
"//vendor:k8s.io/apimachinery/pkg/util/net",
|
"//vendor:k8s.io/apimachinery/pkg/util/net",
|
||||||
@ -14095,6 +14094,7 @@ go_library(
|
|||||||
"//vendor:k8s.io/apiserver/pkg/authentication/authenticatorfactory",
|
"//vendor:k8s.io/apiserver/pkg/authentication/authenticatorfactory",
|
||||||
"//vendor:k8s.io/apiserver/pkg/authorization/authorizerfactory",
|
"//vendor:k8s.io/apiserver/pkg/authorization/authorizerfactory",
|
||||||
"//vendor:k8s.io/apiserver/pkg/features",
|
"//vendor:k8s.io/apiserver/pkg/features",
|
||||||
|
"//vendor:k8s.io/apiserver/pkg/server",
|
||||||
"//vendor:k8s.io/apiserver/pkg/storage/storagebackend",
|
"//vendor:k8s.io/apiserver/pkg/storage/storagebackend",
|
||||||
"//vendor:k8s.io/apiserver/pkg/util/feature",
|
"//vendor:k8s.io/apiserver/pkg/util/feature",
|
||||||
"//vendor:k8s.io/apiserver/pkg/util/flag",
|
"//vendor:k8s.io/apiserver/pkg/util/flag",
|
||||||
@ -14761,13 +14761,11 @@ go_test(
|
|||||||
srcs = [
|
srcs = [
|
||||||
"k8s.io/apiserver/pkg/server/genericapiserver_test.go",
|
"k8s.io/apiserver/pkg/server/genericapiserver_test.go",
|
||||||
"k8s.io/apiserver/pkg/server/resource_config_test.go",
|
"k8s.io/apiserver/pkg/server/resource_config_test.go",
|
||||||
"k8s.io/apiserver/pkg/server/serve_test.go",
|
|
||||||
"k8s.io/apiserver/pkg/server/storage_factory_test.go",
|
"k8s.io/apiserver/pkg/server/storage_factory_test.go",
|
||||||
],
|
],
|
||||||
library = ":k8s.io/apiserver/pkg/server",
|
library = ":k8s.io/apiserver/pkg/server",
|
||||||
tags = ["automanaged"],
|
tags = ["automanaged"],
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/client/clientset_generated/clientset:go_default_library",
|
|
||||||
"//pkg/generated/openapi:go_default_library",
|
"//pkg/generated/openapi:go_default_library",
|
||||||
"//vendor:github.com/go-openapi/spec",
|
"//vendor:github.com/go-openapi/spec",
|
||||||
"//vendor:github.com/stretchr/testify/assert",
|
"//vendor:github.com/stretchr/testify/assert",
|
||||||
@ -14789,12 +14787,9 @@ go_test(
|
|||||||
"//vendor:k8s.io/apiserver/pkg/authorization/authorizer",
|
"//vendor:k8s.io/apiserver/pkg/authorization/authorizer",
|
||||||
"//vendor:k8s.io/apiserver/pkg/endpoints/request",
|
"//vendor:k8s.io/apiserver/pkg/endpoints/request",
|
||||||
"//vendor:k8s.io/apiserver/pkg/registry/rest",
|
"//vendor:k8s.io/apiserver/pkg/registry/rest",
|
||||||
"//vendor:k8s.io/apiserver/pkg/server/options",
|
|
||||||
"//vendor:k8s.io/apiserver/pkg/storage/etcd/testing",
|
"//vendor:k8s.io/apiserver/pkg/storage/etcd/testing",
|
||||||
"//vendor:k8s.io/apiserver/pkg/storage/storagebackend",
|
"//vendor:k8s.io/apiserver/pkg/storage/storagebackend",
|
||||||
"//vendor:k8s.io/apiserver/pkg/util/flag",
|
|
||||||
"//vendor:k8s.io/client-go/pkg/api",
|
"//vendor:k8s.io/client-go/pkg/api",
|
||||||
"//vendor:k8s.io/client-go/util/cert",
|
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -15256,3 +15251,21 @@ go_library(
|
|||||||
"//vendor:k8s.io/apiserver/pkg/apis/apiserver",
|
"//vendor:k8s.io/apiserver/pkg/apis/apiserver",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
go_test(
|
||||||
|
name = "k8s.io/apiserver/pkg/server/options_test",
|
||||||
|
srcs = ["k8s.io/apiserver/pkg/server/options/serving_test.go"],
|
||||||
|
library = ":k8s.io/apiserver/pkg/server/options",
|
||||||
|
tags = ["automanaged"],
|
||||||
|
deps = [
|
||||||
|
"//pkg/client/clientset_generated/clientset:go_default_library",
|
||||||
|
"//vendor:github.com/stretchr/testify/assert",
|
||||||
|
"//vendor:k8s.io/apimachinery/pkg/runtime",
|
||||||
|
"//vendor:k8s.io/apimachinery/pkg/runtime/serializer",
|
||||||
|
"//vendor:k8s.io/apimachinery/pkg/version",
|
||||||
|
"//vendor:k8s.io/apiserver/pkg/endpoints/request",
|
||||||
|
"//vendor:k8s.io/apiserver/pkg/server",
|
||||||
|
"//vendor:k8s.io/apiserver/pkg/util/flag",
|
||||||
|
"//vendor:k8s.io/client-go/util/cert",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user