@@ -21,13 +21,15 @@ package client
2121import (
2222 "context"
2323 "fmt"
24+ "io"
2425
25- v1 "k8s.io/api/core/v1"
26+ "github.com/docker/compose-cli/api/compose"
27+ "github.com/docker/compose-cli/utils"
28+ "golang.org/x/sync/errgroup"
29+ corev1 "k8s.io/api/core/v1"
2630 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2731 "k8s.io/cli-runtime/pkg/genericclioptions"
2832 "k8s.io/client-go/kubernetes"
29-
30- "github.com/docker/compose-cli/api/compose"
3133)
3234
3335// KubeClient API to access kube objects
@@ -81,7 +83,7 @@ func (kc KubeClient) GetContainers(ctx context.Context, projectName string, all
8183 return result , nil
8284}
8385
84- func podToContainerSummary (pod v1 .Pod ) compose.ContainerSummary {
86+ func podToContainerSummary (pod corev1 .Pod ) compose.ContainerSummary {
8587 return compose.ContainerSummary {
8688 ID : pod .GetObjectMeta ().GetName (),
8789 Name : pod .GetObjectMeta ().GetName (),
@@ -90,3 +92,30 @@ func podToContainerSummary(pod v1.Pod) compose.ContainerSummary {
9092 Project : pod .GetObjectMeta ().GetLabels ()[compose .ProjectTag ],
9193 }
9294}
95+
96+ // GetLogs retrieves pod logs
97+ func (kc * KubeClient ) GetLogs (ctx context.Context , projectName string , consumer compose.LogConsumer , follow bool ) error {
98+ pods , err := kc .client .CoreV1 ().Pods (kc .namespace ).List (ctx , metav1.ListOptions {
99+ LabelSelector : fmt .Sprintf ("%s=%s" , compose .ProjectTag , projectName ),
100+ })
101+ if err != nil {
102+ return err
103+ }
104+ eg , ctx := errgroup .WithContext (ctx )
105+ for _ , pod := range pods .Items {
106+ request := kc .client .CoreV1 ().Pods (kc .namespace ).GetLogs (pod .Name , & corev1.PodLogOptions {Follow : follow })
107+ service := pod .Labels [compose .ServiceTag ]
108+ w := utils .GetWriter (service , pod .Name , consumer )
109+
110+ eg .Go (func () error {
111+ r , err := request .Stream (ctx )
112+ defer r .Close () // nolint errcheck
113+ if err != nil {
114+ return err
115+ }
116+ _ , err = io .Copy (w , r )
117+ return err
118+ })
119+ }
120+ return eg .Wait ()
121+ }
0 commit comments