Skip to content

fix: panic handlings and argocd app delete stuck in partial stage #5770

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Aug 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -714,7 +714,7 @@ func (impl InstalledAppRepositoryImpl) GetDeploymentSuccessfulStatusCountForTele
func (impl InstalledAppRepositoryImpl) GetGitOpsInstalledAppsWhereArgoAppDeletedIsTrue(installedAppId int, envId int) (InstalledApps, error) {
var installedApps InstalledApps
err := impl.dbConnection.Model(&installedApps).
Column("installed_apps.*", "App.app_name", "Environment.namespace", "Environment.cluster_id", "Environment.environment_name").
Column("installed_apps.*", "App.id", "App.app_name", "Environment.namespace", "Environment.cluster_id", "Environment.environment_name").
Where("deployment_app_delete_request = ?", true).
Where("installed_apps.active = ?", true).
Where("installed_apps.id = ?", installedAppId).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -877,7 +877,7 @@ func (impl *AppStoreDeploymentServiceImpl) MarkGitOpsInstalledAppsDeletedIfArgoA
apiError.InternalMessage = "error in fetching partially deleted argoCd apps from installed app repo"
return apiError
}
deploymentConfig, err := impl.deploymentConfigService.GetConfigForHelmApps(installedAppId, envId)
deploymentConfig, err := impl.deploymentConfigService.GetConfigForHelmApps(installedApp.App.Id, envId)
if err != nil {
impl.logger.Errorw("error in getting deployment config by appId and envId", "appId", installedAppId, "envId", envId, "err", err)
apiError.HttpStatusCode = http.StatusInternalServerError
Expand Down
31 changes: 25 additions & 6 deletions pkg/deployment/gitOps/git/GitServiceGithub.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@ package git
import (
"context"
"crypto/tls"
"errors"
"fmt"
"github.com/devtron-labs/common-lib/utils/runTime"
bean2 "github.com/devtron-labs/devtron/api/bean/gitOps"
globalUtil "github.com/devtron-labs/devtron/util"
"github.com/devtron-labs/devtron/util/retryFunc"
Expand Down Expand Up @@ -91,6 +93,15 @@ func (impl GitHubClient) DeleteRepository(config *bean2.GitOpsConfigDto) error {
return nil
}

func IsRepoNotFound(err error) bool {
if err == nil {
return false
}
var responseErr *github.ErrorResponse
ok := errors.As(err, &responseErr)
return ok && responseErr.Response.StatusCode == 404
}

func (impl GitHubClient) CreateRepository(ctx context.Context, config *bean2.GitOpsConfigDto) (url string, isNew bool, detailedErrorGitOpsConfigActions DetailedErrorGitOpsConfigActions) {
var err error
start := time.Now()
Expand All @@ -100,15 +111,14 @@ func (impl GitHubClient) CreateRepository(ctx context.Context, config *bean2.Git

detailedErrorGitOpsConfigActions.StageErrorMap = make(map[string]error)
repoExists := true
url, err = impl.GetRepoUrl(config)
url, err = impl.getRepoUrl(ctx, config, IsRepoNotFound)
if err != nil {
responseErr, ok := err.(*github.ErrorResponse)
if !ok || responseErr.Response.StatusCode != 404 {
if IsRepoNotFound(err) {
repoExists = false
} else {
impl.logger.Errorw("error in creating github repo", "err", err)
detailedErrorGitOpsConfigActions.StageErrorMap[GetRepoUrlStage] = err
return "", false, detailedErrorGitOpsConfigActions
} else {
repoExists = false
}
}
if repoExists {
Expand Down Expand Up @@ -251,12 +261,21 @@ func (impl GitHubClient) CommitValues(ctx context.Context, config *ChartConfig,
}

func (impl GitHubClient) GetRepoUrl(config *bean2.GitOpsConfigDto) (repoUrl string, err error) {
ctx := context.Background()
return impl.getRepoUrl(ctx, config, globalUtil.AllPublishableError())
}

func (impl GitHubClient) getRepoUrl(ctx context.Context, config *bean2.GitOpsConfigDto,
isNonPublishableError globalUtil.EvalIsNonPublishableErr) (repoUrl string, err error) {
start := time.Now()
defer func() {
if isNonPublishableError(err) {
impl.logger.Debugw("found non publishable error. skipping metrics publish!", "caller method", runTime.GetCallerFunctionName(), "err", err)
return
}
globalUtil.TriggerGitOpsMetrics("GetRepoUrl", "GitHubClient", start, err)
}()

ctx := context.Background()
repo, _, err := impl.client.Repositories.Get(ctx, impl.org, config.GitRepoName)
if err != nil {
impl.logger.Errorw("error in getting repo url by repo name", "org", impl.org, "gitRepoName", config.GitRepoName, "err", err)
Expand Down
10 changes: 7 additions & 3 deletions pkg/pipeline/CdHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -475,11 +475,15 @@ func (impl *CdHandlerImpl) getWorkflowLogs(pipelineId int, cdWorkflow *pipelineC
if !cdWorkflow.BlobStorageEnabled {
return nil, nil, errors.New("logs-not-stored-in-repository")
} else if string(v1alpha1.NodeSucceeded) == cdWorkflow.Status || string(v1alpha1.NodeError) == cdWorkflow.Status || string(v1alpha1.NodeFailed) == cdWorkflow.Status || cdWorkflow.Status == executors.WorkflowCancel {
impl.Logger.Debugw("pod is not live ", "err", err)
impl.Logger.Debugw("pod is not live", "podName", cdWorkflow.PodName, "err", err)
return impl.getLogsFromRepository(pipelineId, cdWorkflow, clusterConfig, runStageInEnv)
}
impl.Logger.Errorw("err on fetch workflow logs", "err", err)
return nil, nil, err
if err != nil {
impl.Logger.Errorw("err on fetch workflow logs", "err", err)
return nil, nil, err
} else if logStream == nil {
return nil, cleanUp, fmt.Errorf("no logs found for pod %s", cdWorkflow.PodName)
}
}
logReader := bufio.NewReader(logStream)
return logReader, cleanUp, err
Expand Down
10 changes: 7 additions & 3 deletions pkg/pipeline/CiHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -798,11 +798,15 @@ func (impl *CiHandlerImpl) getWorkflowLogs(pipelineId int, ciWorkflow *pipelineC
if !ciWorkflow.BlobStorageEnabled {
return nil, nil, &util.ApiError{Code: "200", HttpStatusCode: 400, UserMessage: "logs-not-stored-in-repository"}
} else if string(v1alpha1.NodeSucceeded) == ciWorkflow.Status || string(v1alpha1.NodeError) == ciWorkflow.Status || string(v1alpha1.NodeFailed) == ciWorkflow.Status || ciWorkflow.Status == executors.WorkflowCancel {
impl.Logger.Errorw("err", "err", err)
impl.Logger.Debugw("pod is not live", "podName", ciWorkflow.PodName, "err", err)
return impl.getLogsFromRepository(pipelineId, ciWorkflow, clusterConfig, isExt)
}
impl.Logger.Errorw("err", "err", err)
return nil, nil, &util.ApiError{Code: "200", HttpStatusCode: 400, UserMessage: err.Error()}
if err != nil {
impl.Logger.Errorw("err on fetch workflow logs", "err", err)
return nil, nil, &util.ApiError{Code: "200", HttpStatusCode: 400, UserMessage: err.Error()}
} else if logStream == nil {
return nil, cleanUp, fmt.Errorf("no logs found for pod %s", ciWorkflow.PodName)
}
}
logReader := bufio.NewReader(logStream)
return logReader, cleanUp, err
Expand Down
7 changes: 5 additions & 2 deletions pkg/pipeline/CiLogService.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,12 @@ func (impl *CiLogServiceImpl) FetchRunningWorkflowLogs(ciLogRequest types.BuildL
}
req := impl.k8sUtil.GetLogsForAPod(kubeClient, ciLogRequest.Namespace, ciLogRequest.PodName, CiPipeline.Main, true)
podLogs, err := req.Stream(context.Background())
if podLogs == nil || err != nil {
impl.logger.Errorw("error in opening stream", "name", ciLogRequest.PodName)
if err != nil {
impl.logger.Errorw("error in opening stream", "name", ciLogRequest.PodName, "err", err)
return nil, nil, err
} else if podLogs == nil {
impl.logger.Warnw("no stream reader found", "name", ciLogRequest.PodName)
return nil, func() error { return nil }, err
}
cleanUpFunc := func() error {
impl.logger.Info("closing running pod log stream")
Expand Down
8 changes: 8 additions & 0 deletions util/helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,14 @@ func TriggerGitOpsMetrics(operation string, method string, startTime time.Time,
middleware.GitOpsDuration.WithLabelValues(operation, method, status).Observe(time.Since(startTime).Seconds())
}

type EvalIsNonPublishableErr func(err error) bool

func AllPublishableError() EvalIsNonPublishableErr {
return func(err error) bool {
return false
}
}

func InterfaceToString(resp interface{}) string {
var dat string
b, err := json.Marshal(resp)
Expand Down
Loading