2016-05-04 23:24:43 +00:00
/ *
2016-05-18 17:33:17 +00:00
Copyright 2016 The Kubernetes Authors All rights reserved .
2016-05-04 23:24:43 +00:00
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 .
* /
// Package options contains flags for initializing a proxy.
package options
import (
"net/url"
"os"
"fmt"
"github.com/spf13/pflag"
"k8s.io/kubernetes/pkg/util/validation"
_ "net/http/pprof"
"strings"
)
type KubeDNSConfig struct {
ClusterDomain string
KubeConfigFile string
KubeMasterURL string
HealthzPort int
2016-05-23 21:54:00 +00:00
DNSPort int
2016-05-16 21:48:40 +00:00
// Federations maps federation names to their registered domain names.
Federations map [ string ] string
2016-05-04 23:24:43 +00:00
}
func NewKubeDNSConfig ( ) * KubeDNSConfig {
return & KubeDNSConfig {
ClusterDomain : "cluster.local." ,
KubeConfigFile : "" ,
KubeMasterURL : "" ,
HealthzPort : 8081 ,
2016-05-23 21:54:00 +00:00
DNSPort : 53 ,
2016-05-16 21:48:40 +00:00
Federations : make ( map [ string ] string ) ,
2016-05-04 23:24:43 +00:00
}
}
type clusterDomainVar struct {
val * string
}
func ( m clusterDomainVar ) Set ( v string ) error {
v = strings . TrimSuffix ( v , "." )
segments := strings . Split ( v , "." )
for _ , segment := range segments {
2016-05-18 17:33:17 +00:00
if errs := validation . IsDNS1123Label ( segment ) ; len ( errs ) > 0 {
return fmt . Errorf ( "Not a valid DNS label. %v" , errs )
2016-05-04 23:24:43 +00:00
}
}
if ! strings . HasSuffix ( v , "." ) {
v = fmt . Sprintf ( "%s." , v )
}
* m . val = v
return nil
}
func ( m clusterDomainVar ) String ( ) string {
return * m . val
}
func ( m clusterDomainVar ) Type ( ) string {
return "string"
}
type kubeMasterURLVar struct {
val * string
}
func ( m kubeMasterURLVar ) Set ( v string ) error {
parsedURL , err := url . Parse ( os . ExpandEnv ( v ) )
if err != nil {
return fmt . Errorf ( "failed to parse kube-master-url" )
}
if parsedURL . Scheme == "" || parsedURL . Host == "" || parsedURL . Host == ":" {
return fmt . Errorf ( "invalid kube-master-url specified" )
}
* m . val = v
return nil
}
func ( m kubeMasterURLVar ) String ( ) string {
return * m . val
}
func ( m kubeMasterURLVar ) Type ( ) string {
return "string"
}
2016-05-16 21:48:40 +00:00
type federationsVar struct {
nameDomainMap map [ string ] string
}
// Set deserializes the input string in the format
// "myfederation1=example.com,myfederation2=second.example.com,myfederation3=example.com"
// into a map of key-value pairs of federation names to domain names.
func ( fv federationsVar ) Set ( keyVal string ) error {
for _ , val := range strings . Split ( keyVal , "," ) {
splits := strings . SplitN ( strings . TrimSpace ( val ) , "=" , 2 )
name := strings . TrimSpace ( splits [ 0 ] )
domain := strings . TrimSpace ( splits [ 1 ] )
if len ( validation . IsDNS1123Label ( name ) ) != 0 {
return fmt . Errorf ( "%s not a valid federation name" , name )
}
// The federation domain name need not strictly be domain names, we
// accept valid dns names with subdomain components.
if len ( validation . IsDNS1123Subdomain ( domain ) ) != 0 {
return fmt . Errorf ( "%s not a valid federation name" , name )
}
fv . nameDomainMap [ name ] = domain
}
return nil
}
func ( fv federationsVar ) String ( ) string {
var splits [ ] string
for name , domain := range fv . nameDomainMap {
splits = append ( splits , fmt . Sprintf ( "%s=%s" , name , domain ) )
}
return strings . Join ( splits , "," )
}
func ( fv federationsVar ) Type ( ) string {
return "[]string"
}
2016-05-04 23:24:43 +00:00
func ( s * KubeDNSConfig ) AddFlags ( fs * pflag . FlagSet ) {
fs . Var ( clusterDomainVar { & s . ClusterDomain } , "domain" , "domain under which to create names" )
fs . StringVar ( & s . KubeConfigFile , "kubecfg-file" , s . KubeConfigFile , "Location of kubecfg file for access to kubernetes master service; --kube-master-url overrides the URL part of this; if neither this nor --kube-master-url are provided, defaults to service account tokens" )
fs . Var ( kubeMasterURLVar { & s . KubeMasterURL } , "kube-master-url" , "URL to reach kubernetes master. Env variables in this flag will be expanded." )
fs . IntVar ( & s . HealthzPort , "healthz-port" , s . HealthzPort , "port on which to serve a kube-dns HTTP readiness probe." )
2016-05-23 21:54:00 +00:00
fs . IntVar ( & s . DNSPort , "dns-port" , s . DNSPort , "port on which to serve DNS requests." )
2016-05-16 21:48:40 +00:00
fs . Var ( federationsVar { s . Federations } , "federations" , "a comma separated list of the federation names and their corresponding domain names to which this cluster belongs. Example: \"myfederation1=example.com,myfederation2=example2.com,myfederation3=example.com\"" )
2016-05-04 23:24:43 +00:00
}