Merge pull request #21335 from deads2k/make-rc-logs-work

Auto commit by PR queue bot
This commit is contained in:
k8s-merge-robot 2016-03-05 09:37:24 -08:00
commit 2e03822386
2 changed files with 54 additions and 8 deletions

View File

@ -380,6 +380,42 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory {
return nil, errors.New("provided options object is not a PodLogOptions") return nil, errors.New("provided options object is not a PodLogOptions")
} }
return c.Pods(t.Namespace).GetLogs(t.Name, opts), nil return c.Pods(t.Namespace).GetLogs(t.Name, opts), nil
case *api.ReplicationController:
opts, ok := options.(*api.PodLogOptions)
if !ok {
return nil, errors.New("provided options object is not a PodLogOptions")
}
selector := labels.SelectorFromSet(t.Spec.Selector)
pod, numPods, err := GetFirstPod(c, t.Namespace, selector)
if err != nil {
return nil, err
}
if numPods > 1 {
fmt.Fprintf(os.Stderr, "Found %v pods, using pod/%v\n", numPods, pod.Name)
}
return c.Pods(pod.Namespace).GetLogs(pod.Name, opts), nil
case *extensions.ReplicaSet:
opts, ok := options.(*api.PodLogOptions)
if !ok {
return nil, errors.New("provided options object is not a PodLogOptions")
}
selector, err := unversioned.LabelSelectorAsSelector(t.Spec.Selector)
if err != nil {
return nil, fmt.Errorf("invalid label selector: %v", err)
}
pod, numPods, err := GetFirstPod(c, t.Namespace, selector)
if err != nil {
return nil, err
}
if numPods > 1 {
fmt.Fprintf(os.Stderr, "Found %v pods, using pod/%v\n", numPods, pod.Name)
}
return c.Pods(pod.Namespace).GetLogs(pod.Name, opts), nil
default: default:
gvk, err := api.Scheme.ObjectKind(object) gvk, err := api.Scheme.ObjectKind(object)
if err != nil { if err != nil {
@ -527,19 +563,22 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory {
switch t := object.(type) { switch t := object.(type) {
case *api.ReplicationController: case *api.ReplicationController:
selector := labels.SelectorFromSet(t.Spec.Selector) selector := labels.SelectorFromSet(t.Spec.Selector)
return GetFirstPod(client, t.Namespace, selector) pod, _, err := GetFirstPod(client, t.Namespace, selector)
return pod, err
case *extensions.Deployment: case *extensions.Deployment:
selector, err := unversioned.LabelSelectorAsSelector(t.Spec.Selector) selector, err := unversioned.LabelSelectorAsSelector(t.Spec.Selector)
if err != nil { if err != nil {
return nil, fmt.Errorf("invalid label selector: %v", err) return nil, fmt.Errorf("invalid label selector: %v", err)
} }
return GetFirstPod(client, t.Namespace, selector) pod, _, err := GetFirstPod(client, t.Namespace, selector)
return pod, err
case *extensions.Job: case *extensions.Job:
selector, err := unversioned.LabelSelectorAsSelector(t.Spec.Selector) selector, err := unversioned.LabelSelectorAsSelector(t.Spec.Selector)
if err != nil { if err != nil {
return nil, fmt.Errorf("invalid label selector: %v", err) return nil, fmt.Errorf("invalid label selector: %v", err)
} }
return GetFirstPod(client, t.Namespace, selector) pod, _, err := GetFirstPod(client, t.Namespace, selector)
return pod, err
case *api.Pod: case *api.Pod:
return t, nil return t, nil
default: default:
@ -556,21 +595,21 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory {
} }
} }
// GetFirstPod returns the first pod of an object from its namespace and selector // GetFirstPod returns the first pod of an object from its namespace and selector and the number of matching pods
func GetFirstPod(client *client.Client, namespace string, selector labels.Selector) (*api.Pod, error) { func GetFirstPod(client *client.Client, namespace string, selector labels.Selector) (*api.Pod, int, error) {
var pods *api.PodList var pods *api.PodList
for pods == nil || len(pods.Items) == 0 { for pods == nil || len(pods.Items) == 0 {
var err error var err error
options := api.ListOptions{LabelSelector: selector} options := api.ListOptions{LabelSelector: selector}
if pods, err = client.Pods(namespace).List(options); err != nil { if pods, err = client.Pods(namespace).List(options); err != nil {
return nil, err return nil, 0, err
} }
if len(pods.Items) == 0 { if len(pods.Items) == 0 {
time.Sleep(2 * time.Second) time.Sleep(2 * time.Second)
} }
} }
pod := &pods.Items[0] pod := &pods.Items[0]
return pod, nil return pod, len(pods.Items), nil
} }
// Command will stringify and return all environment arguments ie. a command run by a client // Command will stringify and return all environment arguments ie. a command run by a client

View File

@ -464,7 +464,7 @@ var _ = Describe("Kubectl client", func() {
withStdinData("abcd1234\n"). withStdinData("abcd1234\n").
execOrDie() execOrDie()
Expect(runOutput).ToNot(ContainSubstring("stdin closed")) Expect(runOutput).ToNot(ContainSubstring("stdin closed"))
runTestPod, err := util.GetFirstPod(c, ns, labels.SelectorFromSet(map[string]string{"run": "run-test-3"})) runTestPod, _, err := util.GetFirstPod(c, ns, labels.SelectorFromSet(map[string]string{"run": "run-test-3"}))
if err != nil { if err != nil {
os.Exit(1) os.Exit(1)
} }
@ -898,6 +898,13 @@ var _ = Describe("Kubectl client", func() {
runKubectlOrDie("get", "pods", "-L", "run", nsFlag) runKubectlOrDie("get", "pods", "-L", "run", nsFlag)
Failf("Failed creating 1 pod with expected image %s. Number of pods = %v", nginxImage, len(pods)) Failf("Failed creating 1 pod with expected image %s. Number of pods = %v", nginxImage, len(pods))
} }
By("confirm that you can get logs from an rc")
_, err = runKubectl("logs", "rc/"+rcName, nsFlag)
// a non-nil error is fine as long as we actually found a pod.
if err != nil && !strings.Contains(err.Error(), " in pod ") {
Failf("Failed getting logs by rc %s: %v", rcName, err)
}
}) })
}) })