func makePodSourceConfig(kc *QingletConfig) *config.PodConfig { // source of all configuration cfg := config.NewPodConfig(config.PodConfigNotificationSnapshotAndUpdates, kc.Recorder) // define file config source if kc.ConfigFile != "" { glog.Infof("Adding manifest file: %v", kc.ConfigFile) config.NewSourceFile(kc.ConfigFile, kc.NodeName, kc.FileCheckFrequency, cfg.Channel(qinglet.FileSource)) } // define url config source if kc.ManifestURL != "" { glog.Infof("Adding manifest url: %v", kc.ManifestURL) config.NewSourceURL(kc.ManifestURL, kc.NodeName, kc.HTTPCheckFrequency, cfg.Channel(qinglet.HTTPSource)) } if kc.QingClient != nil { glog.Infof("Watching apiserver") config.NewSourceApiserver(kc.QingClient, kc.NodeName, cfg.Channel(qinglet.ApiserverSource)) } return cfg }
func (ks *QingletExecutorServer) createAndInitQinglet( kc *app.QingletConfig, hks hyperqing.Interface, clientConfig *client.Config, shutdownCloser io.Closer, ) (app.QingletBootstrap, *kconfig.PodConfig, error) { // TODO(k8s): block until all sources have delivered at least one update to the channel, or break the sync loop // up into "per source" synchronizations // TODO(k8s): QingletConfig.QingClient should be a client interface, but client interface misses certain methods // used by qinglet. Since NewMainQinglet expects a client interface, we need to make sure we are not passing // a nil pointer to it when what we really want is a nil interface. var qingClient client.Interface if kc.QingClient == nil { qingClient = nil } else { qingClient = kc.QingClient } gcPolicy := qinglet.ContainerGCPolicy{ MinAge: kc.MinimumGCAge, MaxPerPodContainer: kc.MaxPerPodContainerCount, MaxContainers: kc.MaxContainerCount, } pc := kconfig.NewPodConfig(kconfig.PodConfigNotificationSnapshotAndUpdates, kc.Recorder) updates := pc.Channel(MESOS_CFG_SOURCE) klet, err := qinglet.NewMainQinglet( kc.Hostname, kc.NodeName, kc.DockerClient, qingClient, kc.RootDirectory, kc.PodInfraContainerImage, kc.SyncFrequency, float32(kc.RegistryPullQPS), kc.RegistryBurst, gcPolicy, pc.SeenAllSources, kc.RegisterNode, kc.StandaloneMode, kc.ClusterDomain, net.IP(kc.ClusterDNS), kc.MasterServiceNamespace, kc.VolumePlugins, kc.NetworkPlugins, kc.NetworkPluginName, kc.StreamingConnectionIdleTimeout, kc.Recorder, kc.CadvisorInterface, kc.ImageGCPolicy, kc.DiskSpacePolicy, kc.Cloud, kc.NodeStatusUpdateFrequency, kc.ResourceContainer, kc.OSInterface, kc.CgroupRoot, kc.ContainerRuntime, kc.Mounter, kc.DockerDaemonContainer, kc.SystemContainer, kc.ConfigureCBR0, kc.PodCIDR, kc.MaxPods, kc.DockerExecHandler, ) if err != nil { return nil, nil, err } //TODO(jdef) either configure Watch here with something useful, or else // get rid of it from executor.Config qingletFinished := make(chan struct{}) staticPodsConfigPath := filepath.Join(kc.RootDirectory, "static-pods") exec := executor.New(executor.Config{ Qinglet: klet, Updates: updates, SourceName: MESOS_CFG_SOURCE, APIClient: kc.QingClient, Docker: kc.DockerClient, SuicideTimeout: ks.SuicideTimeout, QingletFinished: qingletFinished, ShutdownAlert: func() { if shutdownCloser != nil { if e := shutdownCloser.Close(); e != nil { log.Warningf("failed to signal shutdown to external watcher: %v", e) } } }, ExitFunc: os.Exit, PodStatusFunc: func(_ executor.QingletInterface, pod *api.Pod) (*api.PodStatus, error) { return klet.GetRuntime().GetPodStatus(pod) }, StaticPodsConfigPath: staticPodsConfigPath, }) go exec.InitializeStaticPodsSource(func() { // Create file source only when we are called back. Otherwise, it is never marked unseen. fileSourceUpdates := pc.Channel(qinglet.FileSource) kconfig.NewSourceFile(staticPodsConfigPath, kc.Hostname, kc.FileCheckFrequency, fileSourceUpdates) }) k := &qingletExecutor{ Qinglet: klet, runProxy: ks.RunProxy, proxyLogV: ks.ProxyLogV, proxyExec: ks.ProxyExec, proxyLogfile: ks.ProxyLogfile, proxyBindall: ks.ProxyBindall, address: ks.Address, dockerClient: kc.DockerClient, hks: hks, qingletFinished: qingletFinished, executorDone: exec.Done(), clientConfig: clientConfig, } dconfig := bindings.DriverConfig{ Executor: exec, HostnameOverride: ks.HostnameOverride, BindingAddress: net.IP(ks.Address), } if driver, err := bindings.NewMesosExecutorDriver(dconfig); err != nil { log.Fatalf("failed to create executor driver: %v", err) } else { k.driver = driver } log.V(2).Infof("Initialize executor driver...") k.BirthCry() exec.Init(k.driver) k.StartGarbageCollection() return k, pc, nil }