// NewAcceptNewlyObservedReadyPods makes a new AcceptNewlyObservedReadyPods // from a real client. func NewAcceptNewlyObservedReadyPods(out io.Writer, kclient kclient.PodsNamespacer, timeout time.Duration, interval time.Duration) *AcceptNewlyObservedReadyPods { return &AcceptNewlyObservedReadyPods{ out: out, timeout: timeout, interval: interval, acceptedPods: sets.NewString(), getDeploymentPodStore: func(deployment *kapi.ReplicationController) (cache.Store, chan struct{}) { selector := labels.Set(deployment.Spec.Selector).AsSelector() store := cache.NewStore(cache.MetaNamespaceKeyFunc) lw := &cache.ListWatch{ ListFunc: func(options kapi.ListOptions) (runtime.Object, error) { opts := kapi.ListOptions{LabelSelector: selector} return kclient.Pods(deployment.Namespace).List(opts) }, WatchFunc: func(options kapi.ListOptions) (watch.Interface, error) { opts := kapi.ListOptions{LabelSelector: selector, ResourceVersion: options.ResourceVersion} return kclient.Pods(deployment.Namespace).Watch(opts) }, } stop := make(chan struct{}) cache.NewReflector(lw, &kapi.Pod{}, store, 10*time.Second).RunUntil(stop) return store, stop }, } }
// WaitForRunningDeployerPod waits a given period of time until the deployer pod // for given replication controller is not running. func WaitForRunningDeployerPod(podClient kclient.PodsNamespacer, rc *api.ReplicationController, timeout time.Duration) error { podName := DeployerPodNameForDeployment(rc.Name) canGetLogs := func(p *api.Pod) bool { return api.PodSucceeded == p.Status.Phase || api.PodFailed == p.Status.Phase || api.PodRunning == p.Status.Phase } pod, err := podClient.Pods(rc.Namespace).Get(podName) if err == nil && canGetLogs(pod) { return nil } watcher, err := podClient.Pods(rc.Namespace).Watch( api.ListOptions{ FieldSelector: fields.Set{"metadata.name": podName}.AsSelector(), }, ) if err != nil { return err } defer watcher.Stop() if _, err := watch.Until(timeout, watcher, func(e watch.Event) (bool, error) { if e.Type == watch.Error { return false, fmt.Errorf("encountered error while watching for pod: %v", e.Object) } obj, isPod := e.Object.(*api.Pod) if !isPod { return false, errors.New("received unknown object while watching for pods") } return canGetLogs(obj), nil }); err != nil { return err } return nil }
// GetPodListChannelWithOptions is GetPodListChannel plus listing options. func GetPodListChannelWithOptions(client client.PodsNamespacer, nsQuery *NamespaceQuery, options api.ListOptions, numReads int) PodListChannel { channel := PodListChannel{ List: make(chan *api.PodList, numReads), Error: make(chan error, numReads), } go func() { list, err := client.Pods(nsQuery.ToRequestParam()).List(options) var filteredItems []api.Pod for _, item := range list.Items { if nsQuery.Matches(item.ObjectMeta.Namespace) { filteredItems = append(filteredItems, item) } } list.Items = filteredItems for i := 0; i < numReads; i++ { channel.List <- list channel.Error <- err } }() return channel }
func getFirstRunningPod(client unversioned.PodsNamespacer, namespace string, selector labels.Selector) (*api.Pod, error) { options := api.ListOptions{LabelSelector: selector} pods, err := client.Pods(namespace).List(options) if err != nil { return nil, err } if len(pods.Items) < 1 { return nil, fmt.Errorf("could not find tiller") } for _, p := range pods.Items { if api.IsPodReady(&p) { return &p, nil } } return nil, fmt.Errorf("could not find a ready tiller pod") }
// NewHookExecutor makes a HookExecutor from a client. func NewHookExecutor(client kclient.PodsNamespacer, tags client.ImageStreamTagsNamespacer, out io.Writer, decoder runtime.Decoder) *HookExecutor { return &HookExecutor{ tags: tags, podClient: &HookExecutorPodClientImpl{ CreatePodFunc: func(namespace string, pod *kapi.Pod) (*kapi.Pod, error) { return client.Pods(namespace).Create(pod) }, PodWatchFunc: func(namespace, name, resourceVersion string, stopChannel chan struct{}) func() *kapi.Pod { return NewPodWatch(client, namespace, name, resourceVersion, stopChannel) }, }, podLogStream: func(namespace, name string, opts *kapi.PodLogOptions) (io.ReadCloser, error) { return client.Pods(namespace).GetLogs(name, opts).Stream() }, out: out, decoder: decoder, } }
// NewPodWatch creates a pod watching function which is backed by a // FIFO/reflector pair. This avoids managing watches directly. // A stop channel to close the watch's reflector is also returned. // It is the caller's responsibility to defer closing the stop channel to prevent leaking resources. func NewPodWatch(client kclient.PodsNamespacer, namespace, name, resourceVersion string, stopChannel chan struct{}) func() *kapi.Pod { fieldSelector := fields.OneTermEqualSelector("metadata.name", name) podLW := &cache.ListWatch{ ListFunc: func(options kapi.ListOptions) (runtime.Object, error) { opts := kapi.ListOptions{FieldSelector: fieldSelector} return client.Pods(namespace).List(opts) }, WatchFunc: func(options kapi.ListOptions) (watch.Interface, error) { opts := kapi.ListOptions{FieldSelector: fieldSelector, ResourceVersion: options.ResourceVersion} return client.Pods(namespace).Watch(opts) }, } queue := cache.NewFIFO(cache.MetaNamespaceKeyFunc) cache.NewReflector(podLW, &kapi.Pod{}, queue, 1*time.Minute).RunUntil(stopChannel) return func() *kapi.Pod { obj := queue.Pop() return obj.(*kapi.Pod) } }
// GetFirstPod returns a pod matching the namespace and label selector // and the number of all pods that match the label selector. func GetFirstPod(client client.PodsNamespacer, namespace string, selector labels.Selector, timeout time.Duration, sortBy func([]*api.Pod) sort.Interface) (*api.Pod, int, error) { options := api.ListOptions{LabelSelector: selector} podList, err := client.Pods(namespace).List(options) if err != nil { return nil, 0, err } pods := []*api.Pod{} for i := range podList.Items { pod := podList.Items[i] pods = append(pods, &pod) } if len(pods) > 0 { sort.Sort(sortBy(pods)) return pods[0], len(podList.Items), nil } // Watch until we observe a pod options.ResourceVersion = podList.ResourceVersion w, err := client.Pods(namespace).Watch(options) if err != nil { return nil, 0, err } defer w.Stop() condition := func(event watch.Event) (bool, error) { return event.Type == watch.Added || event.Type == watch.Modified, nil } event, err := watch.Until(timeout, w, condition) if err != nil { return nil, 0, err } pod, ok := event.Object.(*api.Pod) if !ok { return nil, 0, fmt.Errorf("%#v is not a pod event", event) } return pod, 1, nil }