func (s *SchedulerServer) addCoreFlags(fs *pflag.FlagSet) { fs.IntVar(&s.port, "port", s.port, "The port that the scheduler's http service runs on") fs.IPVar(&s.address, "address", s.address, "The IP address to serve on (set to 0.0.0.0 for all interfaces)") fs.BoolVar(&s.enableProfiling, "profiling", s.enableProfiling, "Enable profiling via web interface host:port/debug/pprof/") fs.StringSliceVar(&s.apiServerList, "api-servers", s.apiServerList, "List of Kubernetes API servers for publishing events, and reading pods and services. (ip:port), comma separated.") fs.StringVar(&s.kubeconfig, "kubeconfig", s.kubeconfig, "Path to kubeconfig file with authorization and master location information used by the scheduler.") fs.Float32Var(&s.kubeAPIQPS, "kube-api-qps", s.kubeAPIQPS, "QPS to use while talking with kubernetes apiserver") fs.IntVar(&s.kubeAPIBurst, "kube-api-burst", s.kubeAPIBurst, "Burst to use while talking with kubernetes apiserver") fs.StringSliceVar(&s.etcdServerList, "etcd-servers", s.etcdServerList, "List of etcd servers to watch (http://ip:port), comma separated.") fs.BoolVar(&s.allowPrivileged, "allow-privileged", s.allowPrivileged, "Enable privileged containers in the kubelet (compare the same flag in the apiserver).") fs.StringVar(&s.clusterDomain, "cluster-domain", s.clusterDomain, "Domain for this cluster. If set, kubelet will configure all containers to search this domain in addition to the host's search domains") fs.IPVar(&s.clusterDNS, "cluster-dns", s.clusterDNS, "IP address for a cluster DNS server. If set, kubelet will configure all containers to use this for DNS resolution in addition to the host's DNS servers") fs.StringVar(&s.staticPodsConfigPath, "static-pods-config", s.staticPodsConfigPath, "Path for specification of static pods. Path should point to dir containing the staticPods configuration files. Defaults to none.") fs.StringVar(&s.mesosMaster, "mesos-master", s.mesosMaster, "Location of the Mesos master. The format is a comma-delimited list of of hosts like zk://host1:port,host2:port/mesos. If using ZooKeeper, pay particular attention to the leading zk:// and trailing /mesos! If not using ZooKeeper, standard URLs like http://localhost are also acceptable.") fs.StringVar(&s.mesosUser, "mesos-user", s.mesosUser, "Mesos user for this framework, defaults to root.") fs.StringSliceVar(&s.frameworkRoles, "mesos-framework-roles", s.frameworkRoles, "Mesos framework roles that the scheduler receives offers for. Currently only \"*\" and optionally one additional role are supported.") fs.StringSliceVar(&s.defaultPodRoles, "mesos-default-pod-roles", s.defaultPodRoles, "Roles that will be used to launch pods having no "+meta.RolesKey+" label.") fs.StringVar(&s.mesosAuthPrincipal, "mesos-authentication-principal", s.mesosAuthPrincipal, "Mesos authentication principal.") fs.StringVar(&s.mesosAuthSecretFile, "mesos-authentication-secret-file", s.mesosAuthSecretFile, "Mesos authentication secret file.") fs.StringVar(&s.mesosAuthProvider, "mesos-authentication-provider", s.mesosAuthProvider, fmt.Sprintf("Authentication provider to use, default is SASL that supports mechanisms: %+v", mech.ListSupported())) fs.StringVar(&s.dockerCfgPath, "dockercfg-path", s.dockerCfgPath, "Path to a dockercfg file that will be used by the docker instance of the minions.") fs.StringVar(&s.mesosCgroupPrefix, "mesos-cgroup-prefix", s.mesosCgroupPrefix, "The cgroup prefix concatenated with MESOS_DIRECTORY must give the executor cgroup set by Mesos") fs.Var(&s.mesosExecutorCPUs, "mesos-executor-cpus", "Initial CPU shares to allocate for each Mesos executor container.") fs.Var(&s.mesosExecutorMem, "mesos-executor-mem", "Initial memory (MB) to allocate for each Mesos executor container.") fs.BoolVar(&s.checkpoint, "checkpoint", s.checkpoint, "Enable/disable checkpointing for the kubernetes-mesos framework.") fs.Float64Var(&s.failoverTimeout, "failover-timeout", s.failoverTimeout, fmt.Sprintf("Framework failover timeout, in sec.")) fs.BoolVar(&s.generateTaskDiscovery, "mesos-generate-task-discovery", s.generateTaskDiscovery, "Enable/disable generation of DiscoveryInfo for Mesos tasks.") fs.UintVar(&s.driverPort, "driver-port", s.driverPort, "Port that the Mesos scheduler driver process should listen on.") fs.StringVar(&s.hostnameOverride, "hostname-override", s.hostnameOverride, "If non-empty, will use this string as identification instead of the actual hostname.") fs.Int64Var(&s.reconcileInterval, "reconcile-interval", s.reconcileInterval, "Interval at which to execute task reconciliation, in sec. Zero disables.") fs.DurationVar(&s.reconcileCooldown, "reconcile-cooldown", s.reconcileCooldown, "Minimum rest period between task reconciliation operations.") fs.StringVar(&s.schedulerConfigFileName, "scheduler-config", s.schedulerConfigFileName, "An ini-style configuration file with low-level scheduler settings.") fs.BoolVar(&s.graceful, "graceful", s.graceful, "Indicator of a graceful failover, intended for internal use only.") fs.BoolVar(&s.ha, "ha", s.ha, "Run the scheduler in high availability mode with leader election. All peers should be configured exactly the same.") fs.StringVar(&s.frameworkName, "framework-name", s.frameworkName, "The framework name to register with Mesos.") fs.StringVar(&s.frameworkStoreURI, "framework-store-uri", s.frameworkStoreURI, "Where the framework should store metadata, either in Zookeeper (zk://host:port/path) or in etcd (etcd://path).") fs.StringVar(&s.frameworkWebURI, "framework-weburi", s.frameworkWebURI, "A URI that points to a web-based interface for interacting with the framework.") fs.StringVar(&s.advertisedAddress, "advertised-address", s.advertisedAddress, "host:port address that is advertised to clients. May be used to construct artifact download URIs.") fs.IPVar(&s.serviceAddress, "service-address", s.serviceAddress, "The service portal IP address that the scheduler should register with (if unset, chooses randomly)") fs.Var(&s.defaultContainerCPULimit, "default-container-cpu-limit", "Containers without a CPU resource limit are admitted this much CPU shares") fs.Var(&s.defaultContainerMemLimit, "default-container-mem-limit", "Containers without a memory resource limit are admitted this much amount of memory in MB") fs.BoolVar(&s.containPodResources, "contain-pod-resources", s.containPodResources, "Reparent pod containers into mesos cgroups; disable if you're having strange mesos/docker/systemd interactions.") fs.DurationVar(&s.nodeRelistPeriod, "node-monitor-period", s.nodeRelistPeriod, "Period between relisting of all nodes from the apiserver.") fs.BoolVar(&s.useHostPortEndpoints, "host-port-endpoints", s.useHostPortEndpoints, "Map service endpoints to hostIP:hostPort instead of podIP:containerPort. Default true.") fs.IntVar(&s.executorLogV, "executor-logv", s.executorLogV, "Logging verbosity of spawned minion and executor processes.") fs.BoolVar(&s.executorBindall, "executor-bindall", s.executorBindall, "When true will set -address of the executor to 0.0.0.0.") fs.DurationVar(&s.executorSuicideTimeout, "executor-suicide-timeout", s.executorSuicideTimeout, "Executor self-terminates after this period of inactivity. Zero disables suicide watch.") fs.DurationVar(&s.launchGracePeriod, "mesos-launch-grace-period", s.launchGracePeriod, "Launch grace period after which launching tasks will be cancelled. Zero disables launch cancellation.") fs.StringVar(&s.sandboxOverlay, "mesos-sandbox-overlay", s.sandboxOverlay, "Path to an archive (tar.gz, tar.bz2 or zip) extracted into the sandbox.") fs.BoolVar(&s.proxyBindall, "proxy-bindall", s.proxyBindall, "When true pass -proxy-bindall to the executor.") fs.BoolVar(&s.runProxy, "run-proxy", s.runProxy, "Run the kube-proxy as a side process of the executor.") fs.StringVar(&s.proxyKubeconfig, "proxy-kubeconfig", s.proxyKubeconfig, "Path to kubeconfig file with authorization and master location information used by the proxy.") fs.IntVar(&s.proxyLogV, "proxy-logv", s.proxyLogV, "Logging verbosity of spawned minion proxy processes.") fs.StringVar(&s.proxyMode, "proxy-mode", s.proxyMode, "Which proxy mode to use: 'userspace' (older) or 'iptables' (faster). If the iptables proxy is selected, regardless of how, but the system's kernel or iptables versions are insufficient, this always falls back to the userspace proxy.") fs.StringVar(&s.minionPathOverride, "minion-path-override", s.minionPathOverride, "Override the PATH in the environment of the minion sub-processes.") fs.Var(resource.NewQuantityFlagValue(&s.minionLogMaxSize), "minion-max-log-size", "Maximum log file size for the executor and proxy before rotation") fs.IntVar(&s.minionLogMaxAgeInDays, "minion-max-log-age", s.minionLogMaxAgeInDays, "Maximum log file age of the executor and proxy in days") fs.IntVar(&s.minionLogMaxBackups, "minion-max-log-backups", s.minionLogMaxBackups, "Maximum log file backups of the executor and proxy to keep after rotation") fs.StringSliceVar(&s.kubeletApiServerList, "kubelet-api-servers", s.kubeletApiServerList, "List of Kubernetes API servers kubelet will use. (ip:port), comma separated. If unspecified it defaults to the value of --api-servers.") fs.StringVar(&s.kubeletRootDirectory, "kubelet-root-dir", s.kubeletRootDirectory, "Directory path for managing kubelet files (volume mounts,etc). Defaults to executor sandbox.") fs.StringVar(&s.kubeletDockerEndpoint, "kubelet-docker-endpoint", s.kubeletDockerEndpoint, "If non-empty, kubelet will use this for the docker endpoint to communicate with.") fs.StringVar(&s.kubeletPodInfraContainerImage, "kubelet-pod-infra-container-image", s.kubeletPodInfraContainerImage, "The image whose network/ipc namespaces containers in each pod will use.") fs.UintVar(&s.kubeletCadvisorPort, "kubelet-cadvisor-port", s.kubeletCadvisorPort, "The port of the kubelet's local cAdvisor endpoint") fs.StringVar(&s.kubeletHostNetworkSources, "kubelet-host-network-sources", s.kubeletHostNetworkSources, "Comma-separated list of sources from which the Kubelet allows pods to use of host network. For all sources use \"*\" [default=\"file\"]") fs.DurationVar(&s.kubeletSyncFrequency, "kubelet-sync-frequency", s.kubeletSyncFrequency, "Max period between synchronizing running containers and config") fs.StringVar(&s.kubeletNetworkPluginName, "kubelet-network-plugin", s.kubeletNetworkPluginName, "<Warning: Alpha feature> The name of the network plugin to be invoked for various events in kubelet/pod lifecycle") fs.BoolVar(&s.kubeletEnableDebuggingHandlers, "kubelet-enable-debugging-handlers", s.kubeletEnableDebuggingHandlers, "Enables kubelet endpoints for log collection and local running of containers and commands") fs.StringVar(&s.kubeletKubeconfig, "kubelet-kubeconfig", s.kubeletKubeconfig, "Path to kubeconfig file with authorization and master location information used by the kubelet.") fs.IntVar(&s.conntrackMax, "conntrack-max", s.conntrackMax, "Maximum number of NAT connections to track on agent nodes (0 to leave as-is)") fs.IntVar(&s.conntrackTCPTimeoutEstablished, "conntrack-tcp-timeout-established", s.conntrackTCPTimeoutEstablished, "Idle timeout for established TCP connections on agent nodes (0 to leave as-is)") //TODO(jdef) support this flag once we have a better handle on mesos-dns and k8s DNS integration //fs.StringVar(&s.HADomain, "ha-domain", s.HADomain, "Domain of the HA scheduler service, only used in HA mode. If specified may be used to construct artifact download URIs.") }
util "github.com/mesos/mesos-go/mesosutil" sched "github.com/mesos/mesos-go/scheduler" "golang.org/x/net/context" ) const ( CPUS_PER_TASK = 1 MEM_PER_TASK = 128 defaultArtifactPort = 12345 ) var ( address = flag.String("address", "127.0.0.1", "Binding address for artifact server") artifactPort = flag.Int("artifactPort", defaultArtifactPort, "Binding port for artifact server") authProvider = flag.String("mesos_authentication_provider", sasl.ProviderName, fmt.Sprintf("Authentication provider to use, default is SASL that supports mechanisms: %+v", mech.ListSupported())) master = flag.String("master", "127.0.0.1:5050", "Master address <ip:port>") executorPath = flag.String("executor", "./executor", "Path to test executor") mesosAuthPrincipal = flag.String("mesos_authentication_principal", "", "Mesos authentication principal.") mesosAuthSecretFile = flag.String("mesos_authentication_secret_file", "", "Mesos authentication secret file.") cmdQueue = list.New() executorUris = []*mesos.CommandInfo_URI{} ) type SdcScheduler struct { executor *mesos.ExecutorInfo tasksLaunched int tasksFinished int totalTasks int }
func (s *SchedulerServer) addCoreFlags(fs *pflag.FlagSet) { fs.IntVar(&s.Port, "port", s.Port, "The port that the scheduler's http service runs on") fs.Var(&s.Address, "address", "The IP address to serve on (set to 0.0.0.0 for all interfaces)") fs.BoolVar(&s.EnableProfiling, "profiling", s.EnableProfiling, "Enable profiling via web interface host:port/debug/pprof/") fs.Var(&s.APIServerList, "api-servers", "List of Kubernetes API servers for publishing events, and reading pods and services. (ip:port), comma separated.") fs.StringVar(&s.AuthPath, "auth-path", s.AuthPath, "Path to .kubernetes_auth file, specifying how to authenticate to API server.") fs.Var(&s.EtcdServerList, "etcd-servers", "List of etcd servers to watch (http://ip:port), comma separated. Mutually exclusive with --etcd-config") fs.StringVar(&s.EtcdConfigFile, "etcd-config", s.EtcdConfigFile, "The config file for the etcd client. Mutually exclusive with --etcd-servers.") fs.BoolVar(&s.AllowPrivileged, "allow-privileged", s.AllowPrivileged, "If true, allow privileged containers.") fs.StringVar(&s.ClusterDomain, "cluster-domain", s.ClusterDomain, "Domain for this cluster. If set, kubelet will configure all containers to search this domain in addition to the host's search domains") fs.Var(&s.ClusterDNS, "cluster-dns", "IP address for a cluster DNS server. If set, kubelet will configure all containers to use this for DNS resolution in addition to the host's DNS servers") fs.StringVar(&s.StaticPodsConfigPath, "static-pods-config", s.StaticPodsConfigPath, "Path for specification of static pods. Path should point to dir containing the staticPods configuration files. Defaults to none.") fs.StringVar(&s.MesosMaster, "mesos-master", s.MesosMaster, "Location of the Mesos master. The format is a comma-delimited list of of hosts like zk://host1:port,host2:port/mesos. If using ZooKeeper, pay particular attention to the leading zk:// and trailing /mesos! If not using ZooKeeper, standard URLs like http://localhost are also acceptable.") fs.StringVar(&s.MesosUser, "mesos-user", s.MesosUser, "Mesos user for this framework, defaults to root.") fs.StringVar(&s.MesosRole, "mesos-role", s.MesosRole, "Mesos role for this framework, defaults to none.") fs.StringVar(&s.MesosAuthPrincipal, "mesos-authentication-principal", s.MesosAuthPrincipal, "Mesos authentication principal.") fs.StringVar(&s.MesosAuthSecretFile, "mesos-authentication-secret-file", s.MesosAuthSecretFile, "Mesos authentication secret file.") fs.StringVar(&s.MesosAuthProvider, "mesos-authentication-provider", s.MesosAuthProvider, fmt.Sprintf("Authentication provider to use, default is SASL that supports mechanisms: %+v", mech.ListSupported())) fs.BoolVar(&s.Checkpoint, "checkpoint", s.Checkpoint, "Enable/disable checkpointing for the kubernetes-mesos framework.") fs.Float64Var(&s.FailoverTimeout, "failover-timeout", s.FailoverTimeout, fmt.Sprintf("Framework failover timeout, in sec.")) fs.UintVar(&s.DriverPort, "driver-port", s.DriverPort, "Port that the Mesos scheduler driver process should listen on.") fs.StringVar(&s.HostnameOverride, "hostname-override", s.HostnameOverride, "If non-empty, will use this string as identification instead of the actual hostname.") fs.Int64Var(&s.ReconcileInterval, "reconcile-interval", s.ReconcileInterval, "Interval at which to execute task reconciliation, in sec. Zero disables.") fs.DurationVar(&s.ReconcileCooldown, "reconcile-cooldown", s.ReconcileCooldown, "Minimum rest period between task reconciliation operations.") fs.StringVar(&s.SchedulerConfigFileName, "scheduler-config", s.SchedulerConfigFileName, "An ini-style configuration file with low-level scheduler settings.") fs.BoolVar(&s.Graceful, "graceful", s.Graceful, "Indicator of a graceful failover, intended for internal use only.") fs.BoolVar(&s.HA, "ha", s.HA, "Run the scheduler in high availability mode with leader election. All peers should be configured exactly the same.") fs.StringVar(&s.FrameworkName, "framework-name", s.FrameworkName, "The framework name to register with Mesos.") fs.StringVar(&s.FrameworkWebURI, "framework-weburi", s.FrameworkWebURI, "A URI that points to a web-based interface for interacting with the framework.") fs.StringVar(&s.AdvertisedAddress, "advertised-address", s.AdvertisedAddress, "host:port address that is advertised to clients. May be used to construct artifact download URIs.") fs.Var(&s.ServiceAddress, "service-address", "The service portal IP address that the scheduler should register with (if unset, chooses randomly)") fs.BoolVar(&s.ExecutorBindall, "executor-bindall", s.ExecutorBindall, "When true will set -address of the executor to 0.0.0.0.") fs.IntVar(&s.ExecutorLogV, "executor-logv", s.ExecutorLogV, "Logging verbosity of spawned executor processes.") fs.BoolVar(&s.ExecutorProxyBindall, "executor-proxy-bindall", s.ExecutorProxyBindall, "When true pass -proxy-bindall to the executor.") fs.BoolVar(&s.ExecutorRunProxy, "executor-run-proxy", s.ExecutorRunProxy, "Run the kube-proxy as a child process of the executor.") fs.DurationVar(&s.ExecutorSuicideTimeout, "executor-suicide-timeout", s.ExecutorSuicideTimeout, "Executor self-terminates after this period of inactivity. Zero disables suicide watch.") fs.StringVar(&s.KubeletRootDirectory, "kubelet-root-dir", s.KubeletRootDirectory, "Directory path for managing kubelet files (volume mounts,etc). Defaults to executor sandbox.") fs.StringVar(&s.KubeletDockerEndpoint, "kubelet-docker-endpoint", s.KubeletDockerEndpoint, "If non-empty, kubelet will use this for the docker endpoint to communicate with.") fs.StringVar(&s.KubeletPodInfraContainerImage, "kubelet-pod-infra-container-image", s.KubeletPodInfraContainerImage, "The image whose network/ipc namespaces containers in each pod will use.") fs.UintVar(&s.KubeletCadvisorPort, "kubelet-cadvisor-port", s.KubeletCadvisorPort, "The port of the kubelet's local cAdvisor endpoint") fs.StringVar(&s.KubeletHostNetworkSources, "kubelet-host-network-sources", s.KubeletHostNetworkSources, "Comma-separated list of sources from which the Kubelet allows pods to use of host network. For all sources use \"*\" [default=\"file\"]") fs.DurationVar(&s.KubeletSyncFrequency, "kubelet-sync-frequency", s.KubeletSyncFrequency, "Max period between synchronizing running containers and config") fs.StringVar(&s.KubeletNetworkPluginName, "kubelet-network-plugin", s.KubeletNetworkPluginName, "<Warning: Alpha feature> The name of the network plugin to be invoked for various events in kubelet/pod lifecycle") //TODO(jdef) support this flag once we have a better handle on mesos-dns and k8s DNS integration //fs.StringVar(&s.HADomain, "ha-domain", s.HADomain, "Domain of the HA scheduler service, only used in HA mode. If specified may be used to construct artifact download URIs.") }
func init() { runtime.GOMAXPROCS(1) flag.BoolVar(&useReservations, "use_reservations", false, "Set this to true if the Mesos cluster supports Dynamic Reservations and Persistent Volumes") flag.StringVar(&mesosMaster, "master", "zk://master.mesos:2181/mesos", "Mesos master") flag.StringVar(&zookeeperAddr, "zk", "master.mesos:2181", "Zookeeper") flag.StringVar(&schedulerHostname, "hostname", "", "Framework hostname") flag.StringVar(&schedulerIPAddr, "ip", "", "Framework ip") flag.StringVar(&user, "user", "", "Framework Username") flag.StringVar(&logFile, "log", "", "Log File Location") flag.StringVar(&frameworkName, "name", "riak", "Framework Instance Name") flag.StringVar(&frameworkRole, "role", "*", "Framework Role Name") flag.StringVar(&nodeCpus, "node_cpus", "1.0", "Per Node CPUs") flag.StringVar(&nodeMem, "node_mem", "16000", "Per Node Mem") flag.StringVar(&nodeDisk, "node_disk", "20000", "Per Node Disk") flag.StringVar(&authProvider, "mesos_authentication_provider", sasl.ProviderName, fmt.Sprintf("Authentication provider to use, default is SASL that supports mechanisms: %+v", mech.ListSupported())) flag.StringVar(&mesosAuthPrincipal, "mesos_authentication_principal", "", "Mesos authentication principal.") flag.StringVar(&mesosAuthSecretFile, "mesos_authentication_secret_file", "", "Mesos authentication secret file.") flag.Parse() }
func init() { flag.StringVar(&mesosMaster, "master", "zk://33.33.33.2:2181/mesos", "Mesos master") flag.StringVar(&zookeeperAddr, "zk", "33.33.33.2:2181", "Zookeeper") flag.StringVar(&schedulerHostname, "hostname", "", "Framework hostname") flag.StringVar(&schedulerIPAddr, "ip", "", "Framework ip") flag.StringVar(&user, "user", "", "Framework Username") flag.StringVar(&logFile, "log", "", "Log File Location") flag.StringVar(&frameworkName, "name", "riakMesosFramework", "Framework Instance Name") flag.StringVar(&frameworkRole, "role", "*", "Framework Role Name") flag.StringVar(&authProvider, "mesos_authentication_provider", sasl.ProviderName, fmt.Sprintf("Authentication provider to use, default is SASL that supports mechanisms: %+v", mech.ListSupported())) flag.StringVar(&mesosAuthPrincipal, "mesos_authentication_principal", "", "Mesos authentication principal.") flag.StringVar(&mesosAuthSecretFile, "mesos_authentication_secret_file", "", "Mesos authentication secret file.") flag.Parse() }
// Responsible for loading up our config.json && || all the command lines switches. The way this is setup // will be order specific on the command line. Only exception to this rule is env-vars (see EnvVars()). // // E.g. // // # address will override config.json if it is defined in config.json. // mesos-runonce -config=config.json -address=address // // # config.json will override address if it is defined in config.json. // mesos-runonce -address=address -config=config.json func loadConfig() *Config { cfg := new(Config) flag.BoolVar(&cfg.Task.Docker.ForcePullImage, "force-pull", false, "Boolean for forcing pull of image before run.") flag.Float64Var(&cfg.Task.Docker.Cpus, "cpus", 1.0, "How many CPUs to use.") flag.Float64Var(&cfg.Task.Docker.Mem, "mem", 10, "How much memory to use.") flag.IntVar(&cfg.TaskCount, "task-count", 1, "Total task count to run.") flag.StringVar(&cfg.Runonce.Address, "address", "127.0.0.1", "Address for mesos to callback on.") flag.StringVar(&cfg.Runonce.AuthPrincipal, "principal", "", "Mesos authentication principal.") flag.StringVar(&cfg.Runonce.AuthProvider, "authentication-provider", sasl.ProviderName, fmt.Sprintf("Authentication provider to use, default is SASL that supports mechanisms: %+v", mech.ListSupported())) flag.StringVar(&cfg.Runonce.AuthSecretFile, "secret-file", "", "Mesos authentication secret file.") flag.StringVar(&cfg.Runonce.Master, "master", "127.0.0.1:5050", "Master address <ip:port>") flag.StringVar(&cfg.Runonce.MesosRunasUser, "user", "root", "Mesos user to run tasks as.") flag.StringVar(&cfg.Runonce.MesosRole, "role", "", "Mesos role to run tasks with.") flag.StringVar(&cfg.Task.Docker.Cmd, "docker-cmd", "", "Docker command to run.") flag.StringVar(&cfg.Task.Docker.EnvString, "env-vars", "", "Docker env vars for the container. E.g. -env-vars='{\"env\":{\"FOO\":\"bar\"}}'") flag.StringVar(&cfg.Task.Docker.Image, "docker-image", "", "Docker image to run.") flag.StringVar(&cfg.Task.Id, "task-id", "", "Mesos task id to identify the task.") flag.StringVar(&cfg.Task.Name, "task-name", "", "Mesos task name to label the task.") flag.UintVar(&cfg.Runonce.BindingPort, "port", 0, "Port for address to use for mesos to callback.") flag.Var(cfg, "config", "Runonce config of JSON. See spec in config.go for details.") flag.Parse() return cfg }
func main() { frameworkName := flag.String("framework-name", "etcd", "Unique name of this etcd cluster") master := flag.String("master", "127.0.0.1:5050", "Master address <ip:port>") zkFrameworkPersist := flag.String("zk-framework-persist", "", "Zookeeper URI of the form zk://host1:port1,host2:port2/chroot/path") taskCount := flag.Int("cluster-size", 5, "Total task count to run") adminPort := flag.Int("admin-port", 23400, "Binding port for admin interface") reseedTimeout := flag.Int("reseed-timeout", 240, "Seconds of etcd livelock to wait for before attempting a cluster re-seed") autoReseed := flag.Bool("auto-reseed", true, "Perform automatic cluster reseed when the "+ "cluster has been livelocked for -reseed-timeout seconds") artifactPort := flag.Int("artifact-port", 12300, "Binding port for artifact server") sandboxDisk := flag.Float64("sandbox-disk-limit", 4096, "Max disk usage for the etcd mesos sandbox in MB") sandboxCpu := flag.Float64("sandbox-cpu-limit", 4, "Max cpu usage for the etcd mesos sandbox in MB") sandboxMem := flag.Float64("sandbox-mem-limit", 2048, "Max memory usage for the etcd mesos sandbox in MB") executorPath := flag.String("executor-bin", "./bin/etcd-mesos-executor", "Path to executor binary") etcdPath := flag.String("etcd-bin", "./bin/etcd", "Path to etcd binary") etcdctlPath := flag.String("etcdctl-bin", "./bin/etcdctl", "Path to etcdctl binary") address := flag.String("address", "", "Binding address for scheduler and artifact server") driverPort := flag.Int("driver-port", 0, "Binding port for scheduler driver") mesosAuthPrincipal := flag.String("mesos-authentication-principal", "", "Mesos authentication principal") mesosAuthSecretFile := flag.String("mesos-authentication-secret-file", "", "Mesos authentication secret file") authProvider := flag.String("mesos-authentication-provider", sasl.ProviderName, fmt.Sprintf("Authentication provider to use, default is SASL that supports mechanisms: %+v", mech.ListSupported())) singleInstancePerSlave := flag.Bool("single-instance-per-slave", true, "Only allow one etcd instance to be started per slave") failoverTimeoutSeconds := flag.Float64("failover-timeout-seconds", 60*60*24*7, "Mesos framework failover timeout in seconds") weburi := flag.String("framework-weburi", "", "A URI that points to a web-based interface for interacting with the framework.") flag.Parse() if *zkFrameworkPersist == "" { log.Fatal("No value provided for -zk-framework-persist !") } if !*singleInstancePerSlave { log.Warning("-single-instance-per-slave=false is dangerous because it may lead to " + "multiple etcd instances in the same cluster on a single node, amplifying " + "the cost of a single node being lost, livelock, and data loss.") } if *address == "" { hostname, err := os.Hostname() if err == nil { *address = hostname } else { log.Errorf("Could not set default binding to hostname. Defaulting to 127.0.0.1") *address = "127.0.0.1" } } if *weburi == "" { *weburi = fmt.Sprintf("http://%s:%d/", *address, *adminPort) } executorUris := []*mesos.CommandInfo_URI{} execUri, err := etcdscheduler.ServeExecutorArtifact(*executorPath, *address, *artifactPort) if err != nil { log.Errorf("Could not stat executor binary: %v", err) return } executorUris = append(executorUris, &mesos.CommandInfo_URI{ Value: execUri, Executable: proto.Bool(true), }) etcdUri, err := etcdscheduler.ServeExecutorArtifact(*etcdPath, *address, *artifactPort) if err != nil { log.Errorf("Could not stat etcd binary: %v", err) return } executorUris = append(executorUris, &mesos.CommandInfo_URI{ Value: etcdUri, Executable: proto.Bool(true), }) etcdctlUri, err := etcdscheduler.ServeExecutorArtifact(*etcdctlPath, *address, *artifactPort) if err != nil { log.Errorf("Could not stat etcd binary: %v", err) return } executorUris = append(executorUris, &mesos.CommandInfo_URI{ Value: etcdctlUri, Executable: proto.Bool(true), }) go http.ListenAndServe(fmt.Sprintf("%s:%d", *address, *artifactPort), nil) log.V(2).Info("Serving executor artifacts...") bindingAddress := parseIP(*address) // chillFactor is the number of seconds that are slept for to allow for // convergence across the cluster during mutations. chillFactor := 10 etcdScheduler := etcdscheduler.NewEtcdScheduler( *taskCount, chillFactor, *reseedTimeout, *autoReseed, executorUris, *singleInstancePerSlave, *sandboxDisk, *sandboxCpu, *sandboxMem, ) etcdScheduler.ExecutorPath = *executorPath etcdScheduler.Master = *master etcdScheduler.FrameworkName = *frameworkName etcdScheduler.ZkConnect = *zkFrameworkPersist fwinfo := &mesos.FrameworkInfo{ User: proto.String(""), // Mesos-go will fill in user. Name: proto.String(*frameworkName), Checkpoint: proto.Bool(true), FailoverTimeout: proto.Float64(*failoverTimeoutSeconds), WebuiUrl: proto.String(*weburi), } cred := (*mesos.Credential)(nil) if *mesosAuthPrincipal != "" { fwinfo.Principal = proto.String(*mesosAuthPrincipal) secret, err := ioutil.ReadFile(*mesosAuthSecretFile) if err != nil { log.Fatal(err) } cred = &mesos.Credential{ Principal: proto.String(*mesosAuthPrincipal), Secret: secret, } } zkServers, zkChroot, err := rpc.ParseZKURI(*zkFrameworkPersist) etcdScheduler.ZkServers = zkServers etcdScheduler.ZkChroot = zkChroot if err != nil && *zkFrameworkPersist != "" { log.Fatalf("Error parsing zookeeper URI of %s: %s", *zkFrameworkPersist, err) } else if *zkFrameworkPersist != "" { previous, err := rpc.GetPreviousFrameworkID( zkServers, zkChroot, etcdScheduler.FrameworkName, ) if err != nil && err != zk.ErrNoNode { log.Fatalf("Could not retrieve previous framework ID: %s", err) } else if err == zk.ErrNoNode { log.Info("No previous persisted framework ID exists in zookeeper.") } else { log.Infof("Found stored framework ID in Zookeeper, "+ "attempting to re-use: %s", previous) fwinfo.Id = &mesos.FrameworkID{ Value: proto.String(previous), } } } config := scheduler.DriverConfig{ Scheduler: etcdScheduler, Framework: fwinfo, Master: etcdScheduler.Master, Credential: cred, BindingAddress: bindingAddress, BindingPort: uint16(*driverPort), WithAuthContext: func(ctx context.Context) context.Context { ctx = auth.WithLoginProvider(ctx, *authProvider) ctx = sasl.WithBindingAddress(ctx, bindingAddress) return ctx }, } driver, err := scheduler.NewMesosSchedulerDriver(config) if err != nil { log.Errorln("Unable to create a SchedulerDriver ", err.Error()) } go etcdScheduler.SerialLauncher(driver) go etcdScheduler.PeriodicReconciler(driver) go etcdScheduler.PeriodicHealthChecker() go etcdScheduler.PeriodicLaunchRequestor() go etcdScheduler.AdminHTTP(*adminPort, driver) if stat, err := driver.Run(); err != nil { log.Infof("Framework stopped with status %s and error: %s", stat.String(), err.Error()) } }