From 675255e8dbdbbb2e3ac925002be49b32949ddcd5 Mon Sep 17 00:00:00 2001 From: nishant Date: Fri, 23 May 2025 15:13:12 +0530 Subject: [PATCH] wf logs --- .../pipeline/configure/BuildPipelineRestHandler.go | 12 +++++++++++- .../configure/DeploymentPipelineRestHandler.go | 12 +++++++++++- pkg/build/trigger/HandlerService.go | 10 +++++----- pkg/deployment/trigger/devtronApps/HandlerService.go | 2 +- .../trigger/devtronApps/prePostWfAndLogsCode.go | 8 ++++---- pkg/pipeline/CiLogService.go | 6 +++--- 6 files changed, 35 insertions(+), 15 deletions(-) diff --git a/api/restHandler/app/pipeline/configure/BuildPipelineRestHandler.go b/api/restHandler/app/pipeline/configure/BuildPipelineRestHandler.go index c7d11e12aa..57b048e7db 100644 --- a/api/restHandler/app/pipeline/configure/BuildPipelineRestHandler.go +++ b/api/restHandler/app/pipeline/configure/BuildPipelineRestHandler.go @@ -1085,6 +1085,16 @@ func (handler *PipelineConfigRestHandlerImpl) GetBuildLogs(w http.ResponseWriter common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } + followLogs := true + if ok := r.URL.Query().Has("followLogs"); ok { + followLogsStr := r.URL.Query().Get("followLogs") + follow, err := strconv.ParseBool(followLogsStr) + if err != nil { + common.WriteJsonResp(w, err, "followLogs is not a valid bool", http.StatusBadRequest) + return + } + followLogs = follow + } workflowId, err := strconv.Atoi(vars["workflowId"]) if err != nil { @@ -1116,7 +1126,7 @@ func (handler *PipelineConfigRestHandlerImpl) GetBuildLogs(w http.ResponseWriter return } } - logsReader, cleanUp, err := handler.ciHandlerService.GetRunningWorkflowLogs(workflowId) + logsReader, cleanUp, err := handler.ciHandlerService.GetRunningWorkflowLogs(workflowId, followLogs) if err != nil { handler.Logger.Errorw("service err, GetBuildLogs", "err", err, "pipelineId", pipelineId, "workflowId", workflowId, "lastEventId", lastEventId) common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) diff --git a/api/restHandler/app/pipeline/configure/DeploymentPipelineRestHandler.go b/api/restHandler/app/pipeline/configure/DeploymentPipelineRestHandler.go index 4a94fff0b5..d784037519 100644 --- a/api/restHandler/app/pipeline/configure/DeploymentPipelineRestHandler.go +++ b/api/restHandler/app/pipeline/configure/DeploymentPipelineRestHandler.go @@ -1609,6 +1609,16 @@ func (handler *PipelineConfigRestHandlerImpl) GetPrePostDeploymentLogs(w http.Re common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } + followLogs := true + if ok := r.URL.Query().Has("followLogs"); ok { + followLogsStr := r.URL.Query().Get("followLogs") + follow, err := strconv.ParseBool(followLogsStr) + if err != nil { + common.WriteJsonResp(w, err, "followLogs is not a valid bool", http.StatusBadRequest) + return + } + followLogs = follow + } handler.Logger.Infow("request payload, GetPrePostDeploymentLogs", "err", err, "appId", appId, "environmentId", environmentId, "pipelineId", pipelineId, "workflowId", workflowId) // RBAC CHECK @@ -1619,7 +1629,7 @@ func (handler *PipelineConfigRestHandlerImpl) GetPrePostDeploymentLogs(w http.Re } // RBAC CHECK - logsReader, cleanUp, err := handler.cdHandlerService.GetRunningWorkflowLogs(environmentId, pipelineId, workflowId) + logsReader, cleanUp, err := handler.cdHandlerService.GetRunningWorkflowLogs(environmentId, pipelineId, workflowId, followLogs) if err != nil { handler.Logger.Errorw("service err, GetPrePostDeploymentLogs", "err", err, "appId", appId, "environmentId", environmentId, "pipelineId", pipelineId, "workflowId", workflowId) common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) diff --git a/pkg/build/trigger/HandlerService.go b/pkg/build/trigger/HandlerService.go index 413edd3964..8df68c4375 100644 --- a/pkg/build/trigger/HandlerService.go +++ b/pkg/build/trigger/HandlerService.go @@ -78,7 +78,7 @@ type HandlerService interface { StartCiWorkflowAndPrepareWfRequest(trigger types.Trigger) (*pipelineConfig.CiPipeline, map[string]string, *pipelineConfig.CiWorkflow, *types.WorkflowRequest, error) CancelBuild(workflowId int, forceAbort bool) (int, error) - GetRunningWorkflowLogs(workflowId int) (*bufio.Reader, func() error, error) + GetRunningWorkflowLogs(workflowId int, followLogs bool) (*bufio.Reader, func() error, error) GetHistoricBuildLogs(workflowId int, ciWorkflow *pipelineConfig.CiWorkflow) (map[string]string, error) DownloadCiWorkflowArtifacts(pipelineId int, buildId int) (*os.File, error) } @@ -1685,16 +1685,16 @@ func (impl *HandlerServiceImpl) getRestConfig(workflow *pipelineConfig.CiWorkflo return restConfig, nil } -func (impl *HandlerServiceImpl) GetRunningWorkflowLogs(workflowId int) (*bufio.Reader, func() error, error) { +func (impl *HandlerServiceImpl) GetRunningWorkflowLogs(workflowId int, followLogs bool) (*bufio.Reader, func() error, error) { ciWorkflow, err := impl.ciWorkflowRepository.FindById(workflowId) if err != nil { impl.Logger.Errorw("err", "err", err) return nil, nil, err } - return impl.getWorkflowLogs(ciWorkflow) + return impl.getWorkflowLogs(ciWorkflow, followLogs) } -func (impl *HandlerServiceImpl) getWorkflowLogs(ciWorkflow *pipelineConfig.CiWorkflow) (*bufio.Reader, func() error, error) { +func (impl *HandlerServiceImpl) getWorkflowLogs(ciWorkflow *pipelineConfig.CiWorkflow, followLogs bool) (*bufio.Reader, func() error, error) { if string(v1alpha1.NodePending) == ciWorkflow.PodStatus { return bufio.NewReader(strings.NewReader("")), func() error { return nil }, nil } @@ -1717,7 +1717,7 @@ func (impl *HandlerServiceImpl) getWorkflowLogs(ciWorkflow *pipelineConfig.CiWor isExt = true } - logStream, cleanUp, err := impl.ciLogService.FetchRunningWorkflowLogs(ciLogRequest, clusterConfig, isExt) + logStream, cleanUp, err := impl.ciLogService.FetchRunningWorkflowLogs(ciLogRequest, clusterConfig, isExt, followLogs) if logStream == nil || err != nil { if !ciWorkflow.BlobStorageEnabled { return nil, nil, &util.ApiError{Code: "200", HttpStatusCode: 400, UserMessage: "logs-not-stored-in-repository"} diff --git a/pkg/deployment/trigger/devtronApps/HandlerService.go b/pkg/deployment/trigger/devtronApps/HandlerService.go index 4382f14ff0..65d067ba07 100644 --- a/pkg/deployment/trigger/devtronApps/HandlerService.go +++ b/pkg/deployment/trigger/devtronApps/HandlerService.go @@ -102,7 +102,7 @@ type HandlerService interface { CancelStage(workflowRunnerId int, forceAbort bool, userId int32) (int, error) DownloadCdWorkflowArtifacts(buildId int) (*os.File, error) - GetRunningWorkflowLogs(environmentId int, pipelineId int, workflowId int) (*bufio.Reader, func() error, error) + GetRunningWorkflowLogs(environmentId int, pipelineId int, workflowId int, followLogs bool) (*bufio.Reader, func() error, error) } type HandlerServiceImpl struct { diff --git a/pkg/deployment/trigger/devtronApps/prePostWfAndLogsCode.go b/pkg/deployment/trigger/devtronApps/prePostWfAndLogsCode.go index d02d1e4cd9..932f2a22d8 100644 --- a/pkg/deployment/trigger/devtronApps/prePostWfAndLogsCode.go +++ b/pkg/deployment/trigger/devtronApps/prePostWfAndLogsCode.go @@ -224,7 +224,7 @@ func (impl *HandlerServiceImpl) DownloadCdWorkflowArtifacts(buildId int) (*os.Fi return file, nil } -func (impl *HandlerServiceImpl) GetRunningWorkflowLogs(environmentId int, pipelineId int, wfrId int) (*bufio.Reader, func() error, error) { +func (impl *HandlerServiceImpl) GetRunningWorkflowLogs(environmentId int, pipelineId int, wfrId int, followLogs bool) (*bufio.Reader, func() error, error) { cdWorkflow, err := impl.cdWorkflowRepository.FindWorkflowRunnerById(wfrId) if err != nil { impl.logger.Errorw("error on fetch wf runner", "err", err) @@ -253,16 +253,16 @@ func (impl *HandlerServiceImpl) GetRunningWorkflowLogs(environmentId int, pipeli } else if cdWorkflow.WorkflowType == types.POST { isExtCluster = pipeline.RunPostStageInEnv } - return impl.getWorkflowLogs(pipelineId, cdWorkflow, clusterConfig, isExtCluster) + return impl.getWorkflowLogs(pipelineId, cdWorkflow, clusterConfig, isExtCluster, followLogs) } -func (impl *HandlerServiceImpl) getWorkflowLogs(pipelineId int, cdWorkflow *pipelineConfig.CdWorkflowRunner, clusterConfig *k8s.ClusterConfig, runStageInEnv bool) (*bufio.Reader, func() error, error) { +func (impl *HandlerServiceImpl) getWorkflowLogs(pipelineId int, cdWorkflow *pipelineConfig.CdWorkflowRunner, clusterConfig *k8s.ClusterConfig, runStageInEnv bool, followLogs bool) (*bufio.Reader, func() error, error) { cdLogRequest := types.BuildLogRequest{ PodName: cdWorkflow.PodName, Namespace: cdWorkflow.Namespace, } - logStream, cleanUp, err := impl.ciLogService.FetchRunningWorkflowLogs(cdLogRequest, clusterConfig, runStageInEnv) + logStream, cleanUp, err := impl.ciLogService.FetchRunningWorkflowLogs(cdLogRequest, clusterConfig, runStageInEnv, followLogs) if logStream == nil || err != nil { if !cdWorkflow.BlobStorageEnabled { return nil, nil, errors.New("logs-not-stored-in-repository") diff --git a/pkg/pipeline/CiLogService.go b/pkg/pipeline/CiLogService.go index 1c0b75d320..37010d544f 100644 --- a/pkg/pipeline/CiLogService.go +++ b/pkg/pipeline/CiLogService.go @@ -30,7 +30,7 @@ import ( ) type CiLogService interface { - FetchRunningWorkflowLogs(ciLogRequest types.BuildLogRequest, clusterConfig *k8s.ClusterConfig, isExt bool) (io.ReadCloser, func() error, error) + FetchRunningWorkflowLogs(ciLogRequest types.BuildLogRequest, clusterConfig *k8s.ClusterConfig, isExt bool, followLogs bool) (io.ReadCloser, func() error, error) FetchLogs(baseLogLocationPathConfig string, ciLogRequest types.BuildLogRequest) (*os.File, func() error, error) } @@ -53,7 +53,7 @@ func NewCiLogServiceImpl(logger *zap.SugaredLogger, k8sUtil *k8s.K8sServiceImpl) }, nil } -func (impl *CiLogServiceImpl) FetchRunningWorkflowLogs(ciLogRequest types.BuildLogRequest, clusterConfig *k8s.ClusterConfig, isExt bool) (io.ReadCloser, func() error, error) { +func (impl *CiLogServiceImpl) FetchRunningWorkflowLogs(ciLogRequest types.BuildLogRequest, clusterConfig *k8s.ClusterConfig, isExt bool, followLogs bool) (io.ReadCloser, func() error, error) { var kubeClient *kubernetes.Clientset kubeClient = impl.kubeClient var err error @@ -64,7 +64,7 @@ func (impl *CiLogServiceImpl) FetchRunningWorkflowLogs(ciLogRequest types.BuildL return nil, nil, err } } - req := impl.k8sUtil.GetLogsForAPod(kubeClient, ciLogRequest.Namespace, ciLogRequest.PodName, bean.Main, true) + req := impl.k8sUtil.GetLogsForAPod(kubeClient, ciLogRequest.Namespace, ciLogRequest.PodName, bean.Main, followLogs) podLogs, err := req.Stream(context.Background()) if err != nil { impl.logger.Errorw("error in opening stream", "name", ciLogRequest.PodName, "err", err)