|
|
@@ -21,13 +21,15 @@ package client
|
|
|
import (
|
|
|
"context"
|
|
|
"fmt"
|
|
|
+ "io"
|
|
|
|
|
|
- v1 "k8s.io/api/core/v1"
|
|
|
+ "github.com/docker/compose-cli/api/compose"
|
|
|
+ "github.com/docker/compose-cli/utils"
|
|
|
+ "golang.org/x/sync/errgroup"
|
|
|
+ corev1 "k8s.io/api/core/v1"
|
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
|
"k8s.io/cli-runtime/pkg/genericclioptions"
|
|
|
"k8s.io/client-go/kubernetes"
|
|
|
-
|
|
|
- "github.com/docker/compose-cli/api/compose"
|
|
|
)
|
|
|
|
|
|
// KubeClient API to access kube objects
|
|
|
@@ -81,7 +83,7 @@ func (kc KubeClient) GetContainers(ctx context.Context, projectName string, all
|
|
|
return result, nil
|
|
|
}
|
|
|
|
|
|
-func podToContainerSummary(pod v1.Pod) compose.ContainerSummary {
|
|
|
+func podToContainerSummary(pod corev1.Pod) compose.ContainerSummary {
|
|
|
return compose.ContainerSummary{
|
|
|
ID: pod.GetObjectMeta().GetName(),
|
|
|
Name: pod.GetObjectMeta().GetName(),
|
|
|
@@ -90,3 +92,30 @@ func podToContainerSummary(pod v1.Pod) compose.ContainerSummary {
|
|
|
Project: pod.GetObjectMeta().GetLabels()[compose.ProjectTag],
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+// GetLogs retrieves pod logs
|
|
|
+func (c *KubeClient) GetLogs(ctx context.Context, projectName string, consumer compose.LogConsumer, follow bool) error {
|
|
|
+ pods, err := c.client.CoreV1().Pods(c.namespace).List(ctx, metav1.ListOptions{
|
|
|
+ LabelSelector: fmt.Sprintf("%s=%s", compose.ProjectTag, projectName),
|
|
|
+ })
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ eg, ctx := errgroup.WithContext(ctx)
|
|
|
+ for _, pod := range pods.Items {
|
|
|
+ request := c.client.CoreV1().Pods(c.namespace).GetLogs(pod.Name, &corev1.PodLogOptions{Follow: follow})
|
|
|
+ service := pod.Labels[compose.ServiceTag]
|
|
|
+ w := utils.GetWriter(service, pod.Name, consumer)
|
|
|
+
|
|
|
+ eg.Go(func() error {
|
|
|
+ r, err := request.Stream(ctx)
|
|
|
+ defer r.Close() // nolint errcheck
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ _, err = io.Copy(w, r)
|
|
|
+ return err
|
|
|
+ })
|
|
|
+ }
|
|
|
+ return eg.Wait()
|
|
|
+}
|