2016-05-13 06:51:48 +03:00
// Copyright 2015 The etcd Authors
2015-01-25 06:19:16 +03: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.
2014-12-20 01:47:07 +03:00
2015-11-10 20:26:33 +03:00
// Every change should be reflected on help.go as well.
2014-12-20 01:47:07 +03:00
package etcdmain
import (
"flag"
"fmt"
2016-05-05 10:47:38 +03:00
"io/ioutil"
2018-03-15 08:24:53 +03:00
"net/url"
2014-12-20 01:47:07 +03:00
"os"
2015-05-09 02:49:12 +03:00
"runtime"
2014-12-20 01:47:07 +03:00
"strings"
2016-07-10 21:06:08 +03:00
"github.com/coreos/etcd/embed"
2014-12-20 01:47:07 +03:00
"github.com/coreos/etcd/pkg/flags"
2018-03-15 08:24:53 +03:00
"github.com/coreos/etcd/pkg/types"
2018-02-26 21:36:33 +03:00
"github.com/coreos/etcd/version"
2017-11-02 22:49:50 +03:00
2016-05-05 10:47:38 +03:00
"github.com/ghodss/yaml"
2014-12-20 01:47:07 +03:00
)
2016-07-10 21:06:08 +03:00
var (
2014-12-20 01:47:07 +03:00
proxyFlagOff = "off"
proxyFlagReadonly = "readonly"
proxyFlagOn = "on"
fallbackFlagExit = "exit"
fallbackFlagProxy = "proxy"
ignored = [ ] string {
"cluster-active-size" ,
"cluster-remove-delay" ,
"cluster-sync-interval" ,
"config" ,
"force" ,
"max-result-buffer" ,
"max-retry-attempts" ,
"peer-heartbeat-interval" ,
"peer-election-timeout" ,
"retry-interval" ,
"snapshot" ,
"v" ,
"vv" ,
2017-01-31 03:04:40 +03:00
// for coverage testing
"test.coverprofile" ,
"test.outputdir" ,
2014-12-20 01:47:07 +03:00
}
)
2016-07-10 21:06:08 +03:00
type configProxy struct {
ProxyFailureWaitMs uint ` json:"proxy-failure-wait" `
ProxyRefreshIntervalMs uint ` json:"proxy-refresh-interval" `
ProxyDialTimeoutMs uint ` json:"proxy-dial-timeout" `
ProxyWriteTimeoutMs uint ` json:"proxy-write-timeout" `
ProxyReadTimeoutMs uint ` json:"proxy-read-timeout" `
Fallback string
Proxy string
ProxyJSON string ` json:"proxy" `
FallbackJSON string ` json:"discovery-fallback" `
}
2014-12-20 01:47:07 +03:00
2016-07-10 21:06:08 +03:00
// config holds the config for a command line invocation of etcd
type config struct {
2017-11-09 01:20:52 +03:00
ec embed . Config
cp configProxy
cf configFlags
2016-07-10 21:06:08 +03:00
configFile string
2014-12-20 01:47:07 +03:00
printVersion bool
2016-07-10 21:06:08 +03:00
ignored [ ] string
2014-12-20 01:47:07 +03:00
}
2016-07-10 21:06:08 +03:00
// configFlags has the set of flags used for command line parsing a Config
type configFlags struct {
2018-03-15 04:38:20 +03:00
flagSet * flag . FlagSet
2018-03-19 12:00:20 +03:00
clusterState * flags . SelectiveStringValue
fallback * flags . SelectiveStringValue
proxy * flags . SelectiveStringValue
2016-05-05 10:47:38 +03:00
}
2016-07-10 21:06:08 +03:00
func newConfig ( ) * config {
2014-12-20 01:47:07 +03:00
cfg := & config {
2017-11-09 01:20:52 +03:00
ec : * embed . NewConfig ( ) ,
cp : configProxy {
2016-07-10 21:06:08 +03:00
Proxy : proxyFlagOff ,
ProxyFailureWaitMs : 5000 ,
ProxyRefreshIntervalMs : 30000 ,
ProxyDialTimeoutMs : 1000 ,
ProxyWriteTimeoutMs : 5000 ,
} ,
ignored : ignored ,
}
2017-11-09 01:20:52 +03:00
cfg . cf = configFlags {
flagSet : flag . NewFlagSet ( "etcd" , flag . ContinueOnError ) ,
2018-03-19 12:00:20 +03:00
clusterState : flags . NewSelectiveStringValue (
2016-07-10 21:06:08 +03:00
embed . ClusterStateFlagNew ,
embed . ClusterStateFlagExisting ,
2014-12-20 01:47:07 +03:00
) ,
2018-03-19 12:00:20 +03:00
fallback : flags . NewSelectiveStringValue (
2014-12-20 01:47:07 +03:00
fallbackFlagProxy ,
2017-08-28 10:02:11 +03:00
fallbackFlagExit ,
2014-12-20 01:47:07 +03:00
) ,
2018-03-19 12:00:20 +03:00
proxy : flags . NewSelectiveStringValue (
2014-12-20 01:47:07 +03:00
proxyFlagOff ,
proxyFlagReadonly ,
proxyFlagOn ,
) ,
}
2017-11-09 01:20:52 +03:00
fs := cfg . cf . flagSet
2014-12-20 01:47:07 +03:00
fs . Usage = func ( ) {
2015-09-30 23:43:38 +03:00
fmt . Fprintln ( os . Stderr , usageline )
2014-12-20 01:47:07 +03:00
}
2016-05-05 10:47:38 +03:00
fs . StringVar ( & cfg . configFile , "config-file" , "" , "Path to the server configuration file" )
2014-12-20 01:47:07 +03:00
// member
2017-11-09 01:20:52 +03:00
fs . StringVar ( & cfg . ec . Dir , "data-dir" , cfg . ec . Dir , "Path to the data directory." )
fs . StringVar ( & cfg . ec . WalDir , "wal-dir" , cfg . ec . WalDir , "Path to the dedicated wal directory." )
2018-03-26 21:06:31 +03:00
fs . Var (
flags . NewUniqueURLsWithExceptions ( embed . DefaultListenPeerURLs , "" ) ,
"listen-peer-urls" ,
"List of URLs to listen on for peer traffic." ,
)
fs . Var (
flags . NewUniqueURLsWithExceptions ( embed . DefaultListenClientURLs , "" ) , "listen-client-urls" ,
"List of URLs to listen on for client traffic." ,
)
fs . Var (
flags . NewUniqueURLsWithExceptions ( "" , "" ) ,
"listen-metrics-urls" ,
"List of URLs to listen on for metrics." ,
)
2017-11-09 01:20:52 +03:00
fs . UintVar ( & cfg . ec . MaxSnapFiles , "max-snapshots" , cfg . ec . MaxSnapFiles , "Maximum number of snapshot files to retain (0 is unlimited)." )
fs . UintVar ( & cfg . ec . MaxWalFiles , "max-wals" , cfg . ec . MaxWalFiles , "Maximum number of wal files to retain (0 is unlimited)." )
fs . StringVar ( & cfg . ec . Name , "name" , cfg . ec . Name , "Human-readable name for this member." )
fs . Uint64Var ( & cfg . ec . SnapCount , "snapshot-count" , cfg . ec . SnapCount , "Number of committed transactions to trigger a snapshot to disk." )
fs . UintVar ( & cfg . ec . TickMs , "heartbeat-interval" , cfg . ec . TickMs , "Time (in milliseconds) of a heartbeat interval." )
fs . UintVar ( & cfg . ec . ElectionMs , "election-timeout" , cfg . ec . ElectionMs , "Time (in milliseconds) for an election to timeout." )
fs . Int64Var ( & cfg . ec . QuotaBackendBytes , "quota-backend-bytes" , cfg . ec . QuotaBackendBytes , "Raise alarms when backend size exceeds the given quota. 0 means use the default quota." )
fs . UintVar ( & cfg . ec . MaxTxnOps , "max-txn-ops" , cfg . ec . MaxTxnOps , "Maximum number of operations permitted in a transaction." )
fs . UintVar ( & cfg . ec . MaxRequestBytes , "max-request-bytes" , cfg . ec . MaxRequestBytes , "Maximum client request size in bytes the server will accept." )
fs . DurationVar ( & cfg . ec . GRPCKeepAliveMinTime , "grpc-keepalive-min-time" , cfg . ec . GRPCKeepAliveMinTime , "Minimum interval duration that a client should wait before pinging server." )
fs . DurationVar ( & cfg . ec . GRPCKeepAliveInterval , "grpc-keepalive-interval" , cfg . ec . GRPCKeepAliveInterval , "Frequency duration of server-to-client ping to check if a connection is alive (0 to disable)." )
fs . DurationVar ( & cfg . ec . GRPCKeepAliveTimeout , "grpc-keepalive-timeout" , cfg . ec . GRPCKeepAliveTimeout , "Additional duration of wait before closing a non-responsive connection (0 to disable)." )
2014-12-20 01:47:07 +03:00
// clustering
2018-03-26 21:06:31 +03:00
fs . Var (
flags . NewUniqueURLsWithExceptions ( embed . DefaultInitialAdvertisePeerURLs , "" ) ,
"initial-advertise-peer-urls" ,
"List of this member's peer URLs to advertise to the rest of the cluster." ,
)
fs . Var (
flags . NewUniqueURLsWithExceptions ( embed . DefaultAdvertiseClientURLs , "" ) ,
"advertise-client-urls" ,
"List of this member's client URLs to advertise to the public." ,
)
2017-11-09 01:20:52 +03:00
fs . StringVar ( & cfg . ec . Durl , "discovery" , cfg . ec . Durl , "Discovery URL used to bootstrap the cluster." )
2018-03-19 12:00:20 +03:00
fs . Var ( cfg . cf . fallback , "discovery-fallback" , fmt . Sprintf ( "Valid values include %q" , cfg . cf . fallback . Valids ( ) ) )
2017-08-28 10:02:11 +03:00
2017-11-09 01:20:52 +03:00
fs . StringVar ( & cfg . ec . Dproxy , "discovery-proxy" , cfg . ec . Dproxy , "HTTP proxy to use for traffic to discovery service." )
fs . StringVar ( & cfg . ec . DNSCluster , "discovery-srv" , cfg . ec . DNSCluster , "DNS domain used to bootstrap initial cluster." )
2017-06-14 19:48:23 +03:00
fs . StringVar ( & cfg . ec . DNSClusterServiceName , "discovery-srv-name" , cfg . ec . DNSClusterServiceName , "Service name to query when using DNS discovery." )
2017-11-09 01:20:52 +03:00
fs . StringVar ( & cfg . ec . InitialCluster , "initial-cluster" , cfg . ec . InitialCluster , "Initial cluster configuration for bootstrapping." )
fs . StringVar ( & cfg . ec . InitialClusterToken , "initial-cluster-token" , cfg . ec . InitialClusterToken , "Initial cluster token for the etcd cluster during bootstrap." )
fs . Var ( cfg . cf . clusterState , "initial-cluster-state" , "Initial cluster state ('new' or 'existing')." )
2017-08-28 10:02:11 +03:00
2017-11-09 01:20:52 +03:00
fs . BoolVar ( & cfg . ec . StrictReconfigCheck , "strict-reconfig-check" , cfg . ec . StrictReconfigCheck , "Reject reconfiguration requests that would cause quorum loss." )
2017-12-14 19:30:28 +03:00
fs . BoolVar ( & cfg . ec . EnableV2 , "enable-v2" , cfg . ec . EnableV2 , "Accept etcd V2 client requests." )
2018-03-18 06:19:18 +03:00
fs . BoolVar ( & cfg . ec . PreVote , "pre-vote" , cfg . ec . PreVote , "Enable to run an additional Raft election phase." )
2014-12-20 01:47:07 +03:00
// proxy
2018-03-19 12:00:20 +03:00
fs . Var ( cfg . cf . proxy , "proxy" , fmt . Sprintf ( "Valid values include %q" , cfg . cf . proxy . Valids ( ) ) )
2017-11-09 01:20:52 +03:00
fs . UintVar ( & cfg . cp . ProxyFailureWaitMs , "proxy-failure-wait" , cfg . cp . ProxyFailureWaitMs , "Time (in milliseconds) an endpoint will be held in a failed state." )
fs . UintVar ( & cfg . cp . ProxyRefreshIntervalMs , "proxy-refresh-interval" , cfg . cp . ProxyRefreshIntervalMs , "Time (in milliseconds) of the endpoints refresh interval." )
fs . UintVar ( & cfg . cp . ProxyDialTimeoutMs , "proxy-dial-timeout" , cfg . cp . ProxyDialTimeoutMs , "Time (in milliseconds) for a dial to timeout." )
fs . UintVar ( & cfg . cp . ProxyWriteTimeoutMs , "proxy-write-timeout" , cfg . cp . ProxyWriteTimeoutMs , "Time (in milliseconds) for a write to timeout." )
fs . UintVar ( & cfg . cp . ProxyReadTimeoutMs , "proxy-read-timeout" , cfg . cp . ProxyReadTimeoutMs , "Time (in milliseconds) for a read to timeout." )
2014-12-20 01:47:07 +03:00
// security
2017-11-09 01:20:52 +03:00
fs . StringVar ( & cfg . ec . ClientTLSInfo . CertFile , "cert-file" , "" , "Path to the client server TLS cert file." )
fs . StringVar ( & cfg . ec . ClientTLSInfo . KeyFile , "key-file" , "" , "Path to the client server TLS key file." )
fs . BoolVar ( & cfg . ec . ClientTLSInfo . ClientCertAuth , "client-cert-auth" , false , "Enable client cert authentication." )
fs . StringVar ( & cfg . ec . ClientTLSInfo . CRLFile , "client-crl-file" , "" , "Path to the client certificate revocation list file." )
2017-11-17 10:39:09 +03:00
fs . StringVar ( & cfg . ec . ClientTLSInfo . TrustedCAFile , "trusted-ca-file" , "" , "Path to the client server TLS trusted CA cert file." )
2017-11-09 01:20:52 +03:00
fs . BoolVar ( & cfg . ec . ClientAutoTLS , "auto-tls" , false , "Client TLS using generated certificates" )
fs . StringVar ( & cfg . ec . PeerTLSInfo . CertFile , "peer-cert-file" , "" , "Path to the peer server TLS cert file." )
fs . StringVar ( & cfg . ec . PeerTLSInfo . KeyFile , "peer-key-file" , "" , "Path to the peer server TLS key file." )
fs . BoolVar ( & cfg . ec . PeerTLSInfo . ClientCertAuth , "peer-client-cert-auth" , false , "Enable peer client cert authentication." )
fs . StringVar ( & cfg . ec . PeerTLSInfo . TrustedCAFile , "peer-trusted-ca-file" , "" , "Path to the peer server TLS trusted CA file." )
fs . BoolVar ( & cfg . ec . PeerAutoTLS , "peer-auto-tls" , false , "Peer TLS using generated certificates" )
fs . StringVar ( & cfg . ec . PeerTLSInfo . CRLFile , "peer-crl-file" , "" , "Path to the peer certificate revocation list file." )
fs . StringVar ( & cfg . ec . PeerTLSInfo . AllowedCN , "peer-cert-allowed-cn" , "" , "Allowed CN for inter peer authentication." )
2018-03-26 21:06:31 +03:00
fs . Var (
flags . NewUniqueURLsWithExceptions ( "*" , "*" ) ,
"cors" ,
"Comma-separated white list of origins for CORS, or cross-origin resource sharing, (empty or * means allow all)" ,
)
fs . Var ( flags . NewUniqueStringsValue ( "*" ) , "host-whitelist" , "Comma-separated acceptable hostnames from HTTP client requests, if server is not secure (empty means allow all)." )
2014-12-20 01:47:07 +03:00
2015-04-28 21:00:23 +03:00
// logging
2017-11-09 01:20:52 +03:00
fs . BoolVar ( & cfg . ec . Debug , "debug" , false , "Enable debug-level logging for etcd." )
fs . StringVar ( & cfg . ec . LogPkgLevels , "log-package-levels" , "" , "Specify a particular log level for each etcd package (eg: 'etcdmain=CRITICAL,etcdserver=DEBUG')." )
fs . StringVar ( & cfg . ec . LogOutput , "log-output" , embed . DefaultLogOutput , "Specify 'stdout' or 'stderr' to skip journald logging even when running under systemd." )
2015-04-28 21:00:23 +03:00
2014-12-20 01:47:07 +03:00
// version
2015-10-25 16:31:37 +03:00
fs . BoolVar ( & cfg . printVersion , "version" , false , "Print the version and exit." )
2014-12-20 01:47:07 +03:00
2017-11-09 01:20:52 +03:00
fs . StringVar ( & cfg . ec . AutoCompactionRetention , "auto-compaction-retention" , "0" , "Auto compaction retention for mvcc key value store. 0 means disable auto compaction." )
fs . StringVar ( & cfg . ec . AutoCompactionMode , "auto-compaction-mode" , "periodic" , "interpret 'auto-compaction-retention' one of: periodic|revision. 'periodic' for duration based retention, defaulting to hours if no time unit is provided (e.g. '5m'). 'revision' for revision number based retention." )
2015-08-08 15:58:29 +03:00
2016-01-07 10:15:27 +03:00
// pprof profiler via HTTP
2017-11-09 01:20:52 +03:00
fs . BoolVar ( & cfg . ec . EnablePprof , "enable-pprof" , false , "Enable runtime profiling data via HTTP server. Address is at client URL + \"/debug/pprof/\"" )
2016-01-07 10:15:27 +03:00
2016-12-17 04:04:20 +03:00
// additional metrics
2017-11-09 01:20:52 +03:00
fs . StringVar ( & cfg . ec . Metrics , "metrics" , cfg . ec . Metrics , "Set level of detail for exported metrics, specify 'extensive' to include histogram metrics" )
2016-12-17 04:04:20 +03:00
2016-07-21 08:13:57 +03:00
// auth
2017-11-09 01:20:52 +03:00
fs . StringVar ( & cfg . ec . AuthToken , "auth-token" , cfg . ec . AuthToken , "Specify auth token specific options." )
2016-07-21 08:13:57 +03:00
2017-08-19 12:40:35 +03:00
// experimental
2017-11-22 00:17:59 +03:00
fs . BoolVar ( & cfg . ec . ExperimentalInitialCorruptCheck , "experimental-initial-corrupt-check" , cfg . ec . ExperimentalInitialCorruptCheck , "Enable to check data corruption before serving any client/peer traffic." )
2017-11-09 01:20:52 +03:00
fs . DurationVar ( & cfg . ec . ExperimentalCorruptCheckTime , "experimental-corrupt-check-time" , cfg . ec . ExperimentalCorruptCheckTime , "Duration of time between cluster corruption check passes." )
2018-03-18 06:19:18 +03:00
fs . StringVar ( & cfg . ec . ExperimentalEnableV2V3 , "experimental-enable-v2v3" , cfg . ec . ExperimentalEnableV2V3 , "v3 prefix for serving emulated v2 state." )
2017-08-19 12:40:35 +03:00
2018-03-23 15:22:38 +03:00
// unsafe
fs . BoolVar ( & cfg . ec . ForceNewCluster , "force-new-cluster" , false , "Force to create a new one member cluster." )
2014-12-20 01:47:07 +03:00
// ignored
for _ , f := range cfg . ignored {
fs . Var ( & flags . IgnoredFlag { Name : f } , f , "" )
}
return cfg
}
2016-07-10 21:06:08 +03:00
func ( cfg * config ) parse ( arguments [ ] string ) error {
2017-11-09 01:20:52 +03:00
perr := cfg . cf . flagSet . Parse ( arguments )
2014-12-20 01:47:07 +03:00
switch perr {
case nil :
case flag . ErrHelp :
2015-07-22 04:01:19 +03:00
fmt . Println ( flagsline )
2014-12-20 01:47:07 +03:00
os . Exit ( 0 )
default :
os . Exit ( 2 )
}
2017-11-09 01:20:52 +03:00
if len ( cfg . cf . flagSet . Args ( ) ) != 0 {
return fmt . Errorf ( "'%s' is not a valid flag" , cfg . cf . flagSet . Arg ( 0 ) )
2015-03-21 03:01:53 +03:00
}
2014-12-20 01:47:07 +03:00
if cfg . printVersion {
2015-05-09 02:49:12 +03:00
fmt . Printf ( "etcd Version: %s\n" , version . Version )
fmt . Printf ( "Git SHA: %s\n" , version . GitSHA )
fmt . Printf ( "Go Version: %s\n" , runtime . Version ( ) )
fmt . Printf ( "Go OS/Arch: %s/%s\n" , runtime . GOOS , runtime . GOARCH )
2014-12-20 01:47:07 +03:00
os . Exit ( 0 )
}
2016-05-05 10:47:38 +03:00
var err error
if cfg . configFile != "" {
2017-12-28 01:12:28 +03:00
plog . Infof ( "Loading server configuration from %q. Other configuration command line flags and environment variables will be ignored if provided." , cfg . configFile )
2016-07-10 21:06:08 +03:00
err = cfg . configFromFile ( cfg . configFile )
2016-05-05 10:47:38 +03:00
} else {
err = cfg . configFromCmdLine ( )
}
return err
}
func ( cfg * config ) configFromCmdLine ( ) error {
2017-11-09 01:20:52 +03:00
err := flags . SetFlagsFromEnv ( "ETCD" , cfg . cf . flagSet )
2014-12-20 01:47:07 +03:00
if err != nil {
2015-06-11 02:19:06 +03:00
plog . Fatalf ( "%v" , err )
2014-12-20 01:47:07 +03:00
}
2018-03-26 21:06:31 +03:00
cfg . ec . LPUrls = flags . UniqueURLsFromFlag ( cfg . cf . flagSet , "listen-peer-urls" )
cfg . ec . APUrls = flags . UniqueURLsFromFlag ( cfg . cf . flagSet , "initial-advertise-peer-urls" )
cfg . ec . LCUrls = flags . UniqueURLsFromFlag ( cfg . cf . flagSet , "listen-client-urls" )
cfg . ec . ACUrls = flags . UniqueURLsFromFlag ( cfg . cf . flagSet , "advertise-client-urls" )
cfg . ec . ListenMetricsUrls = flags . UniqueURLsFromFlag ( cfg . cf . flagSet , "listen-metrics-urls" )
2018-03-27 03:13:14 +03:00
cfg . ec . CORS = flags . UniqueURLsMapFromFlag ( cfg . cf . flagSet , "cors" )
cfg . ec . HostWhitelist = flags . UniqueStringsMapFromFlag ( cfg . cf . flagSet , "host-whitelist" )
2017-07-12 20:06:38 +03:00
2017-11-09 01:20:52 +03:00
cfg . ec . ClusterState = cfg . cf . clusterState . String ( )
cfg . cp . Fallback = cfg . cf . fallback . String ( )
cfg . cp . Proxy = cfg . cf . proxy . String ( )
2016-07-10 21:06:08 +03:00
// disable default advertise-client-urls if lcurls is set
2017-11-09 01:20:52 +03:00
missingAC := flags . IsSet ( cfg . cf . flagSet , "listen-client-urls" ) && ! flags . IsSet ( cfg . cf . flagSet , "advertise-client-urls" )
2016-07-10 21:06:08 +03:00
if ! cfg . mayBeProxy ( ) && missingAC {
2017-11-09 01:20:52 +03:00
cfg . ec . ACUrls = nil
2016-05-05 10:47:38 +03:00
}
2016-07-10 21:06:08 +03:00
// disable default initial-cluster if discovery is set
2017-06-14 19:48:23 +03:00
if ( cfg . ec . Durl != "" || cfg . ec . DNSCluster != "" || cfg . ec . DNSClusterServiceName != "" ) && ! flags . IsSet ( cfg . cf . flagSet , "initial-cluster" ) {
2017-11-09 01:20:52 +03:00
cfg . ec . InitialCluster = ""
2016-05-05 10:47:38 +03:00
}
2016-07-10 21:06:08 +03:00
return cfg . validate ( )
}
2016-05-05 10:47:38 +03:00
2016-07-10 21:06:08 +03:00
func ( cfg * config ) configFromFile ( path string ) error {
eCfg , err := embed . ConfigFromFile ( path )
if err != nil {
return err
2016-05-05 10:47:38 +03:00
}
2017-11-09 01:20:52 +03:00
cfg . ec = * eCfg
2016-05-05 10:47:38 +03:00
2016-07-10 21:06:08 +03:00
// load extra config information
b , rerr := ioutil . ReadFile ( path )
if rerr != nil {
return rerr
2016-05-05 10:47:38 +03:00
}
2017-11-09 01:20:52 +03:00
if yerr := yaml . Unmarshal ( b , & cfg . cp ) ; yerr != nil {
2016-07-10 21:06:08 +03:00
return yerr
2016-05-05 10:47:38 +03:00
}
2018-03-15 08:24:53 +03:00
if cfg . ec . ListenMetricsUrlsJSON != "" {
us , err := types . NewURLs ( strings . Split ( cfg . ec . ListenMetricsUrlsJSON , "," ) )
if err != nil {
plog . Panicf ( "unexpected error setting up listen-metrics-urls: %v" , err )
}
cfg . ec . ListenMetricsUrls = [ ] url . URL ( us )
}
2017-11-09 01:20:52 +03:00
if cfg . cp . FallbackJSON != "" {
if err := cfg . cf . fallback . Set ( cfg . cp . FallbackJSON ) ; err != nil {
2016-05-05 10:47:38 +03:00
plog . Panicf ( "unexpected error setting up discovery-fallback flag: %v" , err )
}
2017-11-09 01:20:52 +03:00
cfg . cp . Fallback = cfg . cf . fallback . String ( )
2016-05-05 10:47:38 +03:00
}
2018-03-15 08:24:53 +03:00
2017-11-09 01:20:52 +03:00
if cfg . cp . ProxyJSON != "" {
if err := cfg . cf . proxy . Set ( cfg . cp . ProxyJSON ) ; err != nil {
2016-05-05 10:47:38 +03:00
plog . Panicf ( "unexpected error setting up proxyFlag: %v" , err )
}
2017-11-09 01:20:52 +03:00
cfg . cp . Proxy = cfg . cf . proxy . String ( )
2016-05-05 10:47:38 +03:00
}
2016-07-10 21:06:08 +03:00
return nil
2016-05-05 10:47:38 +03:00
}
2016-07-10 21:06:08 +03:00
func ( cfg * config ) mayBeProxy ( ) bool {
2017-11-09 01:20:52 +03:00
mayFallbackToProxy := cfg . ec . Durl != "" && cfg . cp . Fallback == fallbackFlagProxy
return cfg . cp . Proxy != proxyFlagOff || mayFallbackToProxy
2014-12-20 01:47:07 +03:00
}
2016-07-10 21:06:08 +03:00
func ( cfg * config ) validate ( ) error {
2017-11-09 01:20:52 +03:00
err := cfg . ec . Validate ( )
2016-07-10 21:06:08 +03:00
// TODO(yichengq): check this for joining through discovery service case
if err == embed . ErrUnsetAdvertiseClientURLsFlag && cfg . mayBeProxy ( ) {
return nil
2015-03-19 02:59:41 +03:00
}
2016-07-10 21:06:08 +03:00
return err
2015-03-19 02:59:41 +03:00
}
2017-11-09 01:20:52 +03:00
func ( cfg config ) isProxy ( ) bool { return cfg . cf . proxy . String ( ) != proxyFlagOff }
func ( cfg config ) isReadonlyProxy ( ) bool { return cfg . cf . proxy . String ( ) == proxyFlagReadonly }
func ( cfg config ) shouldFallbackToProxy ( ) bool { return cfg . cf . fallback . String ( ) == fallbackFlagProxy }