Skip to content

Commit 4cfc2fd

Browse files
Merge pull request #6595 from devtron-labs/release-candidate-v0.36.0
sync: Release candidate v0.36.0
2 parents c49516b + f790978 commit 4cfc2fd

File tree

71 files changed

+5675
-225
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+5675
-225
lines changed

api/k8s/capacity/k8sCapacityRestHandler.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"github.com/devtron-labs/devtron/pkg/cluster/rbac"
2727
"github.com/devtron-labs/devtron/pkg/cluster/read"
2828
bean3 "github.com/devtron-labs/devtron/pkg/k8s/bean"
29+
"gopkg.in/go-playground/validator.v9"
2930
"net/http"
3031
"strconv"
3132

@@ -60,6 +61,7 @@ type K8sCapacityRestHandlerImpl struct {
6061
environmentService environment.EnvironmentService
6162
clusterRbacService rbac.ClusterRbacService
6263
clusterReadService read.ClusterReadService
64+
validator *validator.Validate
6365
}
6466

6567
func NewK8sCapacityRestHandlerImpl(logger *zap.SugaredLogger,
@@ -68,7 +70,7 @@ func NewK8sCapacityRestHandlerImpl(logger *zap.SugaredLogger,
6870
clusterService cluster.ClusterService,
6971
environmentService environment.EnvironmentService,
7072
clusterRbacService rbac.ClusterRbacService,
71-
clusterReadService read.ClusterReadService) *K8sCapacityRestHandlerImpl {
73+
clusterReadService read.ClusterReadService, validator *validator.Validate) *K8sCapacityRestHandlerImpl {
7274
return &K8sCapacityRestHandlerImpl{
7375
logger: logger,
7476
k8sCapacityService: k8sCapacityService,
@@ -78,6 +80,7 @@ func NewK8sCapacityRestHandlerImpl(logger *zap.SugaredLogger,
7880
environmentService: environmentService,
7981
clusterRbacService: clusterRbacService,
8082
clusterReadService: clusterReadService,
83+
validator: validator,
8184
}
8285
}
8386

@@ -401,6 +404,15 @@ func (handler *K8sCapacityRestHandlerImpl) DrainNode(w http.ResponseWriter, r *h
401404
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
402405
return
403406
}
407+
408+
// Validate the struct using the validator
409+
err = handler.validator.Struct(nodeDrainReq)
410+
if err != nil {
411+
handler.logger.Errorw("validation error", "err", err, "payload", nodeDrainReq)
412+
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
413+
return
414+
}
415+
404416
userId, err := handler.userService.GetLoggedInUser(r)
405417
if userId == 0 || err != nil {
406418
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)

api/util/logger.go

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,14 @@ import (
2828
)
2929

3030
type AuditLoggerDTO struct {
31-
UrlPath string `json:"urlPath"`
32-
UserEmail string `json:"userEmail"`
33-
UpdatedOn time.Time `json:"updatedOn"`
34-
QueryParams string `json:"queryParams"`
35-
ApiResponseCode int `json:"apiResponseCode"`
36-
RequestPayload []byte `json:"requestPayload"`
37-
RequestMethod string `json:"requestMethod"`
31+
UrlPath string `json:"urlPath"`
32+
UserEmail string `json:"userEmail"`
33+
UpdatedOn time.Time `json:"updatedOn"`
34+
QueryParams string `json:"queryParams"`
35+
ApiResponseCode int `json:"apiResponseCode"`
36+
RequestPayload []byte `json:"requestPayload"`
37+
RequestMethod string `json:"requestMethod"`
38+
ResponseTime time.Duration `json:"responseTime"`
3839
}
3940

4041
type LoggingMiddlewareImpl struct {
@@ -72,22 +73,27 @@ func (impl LoggingMiddlewareImpl) LoggingMiddleware(next http.Handler) http.Hand
7273
// Restore the request body for downstream handlers
7374
r.Body = io.NopCloser(&bodyBuffer)
7475

76+
// Record start time for calculating response time
77+
startTime := time.Now()
78+
7579
auditLogDto := &AuditLoggerDTO{
7680
UrlPath: r.URL.Path,
7781
UserEmail: userEmail,
78-
UpdatedOn: time.Now(),
82+
UpdatedOn: startTime,
7983
QueryParams: r.URL.Query().Encode(),
8084
RequestPayload: bodyBuffer.Bytes(),
8185
RequestMethod: r.Method,
8286
}
8387
// Call the next handler in the chain.
8488
next.ServeHTTP(d, r)
8589

90+
// Calculate response time
91+
auditLogDto.ResponseTime = time.Since(startTime)
8692
auditLogDto.ApiResponseCode = d.Status()
8793
LogRequest(auditLogDto)
8894
})
8995
}
9096

9197
func LogRequest(auditLogDto *AuditLoggerDTO) {
92-
log.Printf("AUDIT_LOG: requestMethod: %s, urlPath: %s, queryParams: %s, updatedBy: %s, updatedOn: %s, apiResponseCode: %d, requestPayload: %s", auditLogDto.RequestMethod, auditLogDto.UrlPath, auditLogDto.QueryParams, auditLogDto.UserEmail, auditLogDto.UpdatedOn, auditLogDto.ApiResponseCode, auditLogDto.RequestPayload)
98+
log.Printf("AUDIT_LOG: requestMethod: %s, urlPath: %s, queryParams: %s, updatedBy: %s, updatedOn: %s, apiResponseCode: %d, responseTime: %s, requestPayload: %s", auditLogDto.RequestMethod, auditLogDto.UrlPath, auditLogDto.QueryParams, auditLogDto.UserEmail, auditLogDto.UpdatedOn, auditLogDto.ApiResponseCode, auditLogDto.ResponseTime, auditLogDto.RequestPayload)
9399
}

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -307,8 +307,8 @@ require (
307307

308308
replace (
309309
github.com/argoproj/argo-workflows/v3 v3.5.13 => github.com/devtron-labs/argo-workflows/v3 v3.5.13
310-
github.com/devtron-labs/authenticator => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250516092913-a8cc2e4a33e5
311-
github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250516092913-a8cc2e4a33e5
310+
github.com/devtron-labs/authenticator => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250519113737-b060cea3a495
311+
github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250519113737-b060cea3a495
312312
github.com/go-check/check => github.com/go-check/check v0.0.0-20180628173108-788fd7840127
313313
github.com/googleapis/gnostic => github.com/googleapis/gnostic v0.5.5
314314
k8s.io/api => k8s.io/api v0.29.7

go.sum

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -829,10 +829,10 @@ github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc h1:VRRKCwnzq
829829
github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
830830
github.com/devtron-labs/argo-workflows/v3 v3.5.13 h1:3pINq0gXOSeTw2z/vYe+j80lRpSN5Rp/8mfQORh8SmU=
831831
github.com/devtron-labs/argo-workflows/v3 v3.5.13/go.mod h1:/vqxcovDPT4zqr4DjR5v7CF8ggpY1l3TSa2CIG3jmjA=
832-
github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250516092913-a8cc2e4a33e5 h1:RzH1TwejuyKys9pLooVRy+nDkI1vaBV+GTJK9zIhIEg=
833-
github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250516092913-a8cc2e4a33e5/go.mod h1:FfaLDXN1ZXxyRpnskBqVIYkpkWDCzBmDgIO9xqLnxdQ=
834-
github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250516092913-a8cc2e4a33e5 h1:8/TvnOcams0ewKNBZcywwA/Ccr8ZIhFWBrK3k6di5Lo=
835-
github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250516092913-a8cc2e4a33e5/go.mod h1:zkNShlkcHxsmnL0gKNbs0uyRL8lZonGKr5Km63uTLI0=
832+
github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250519113737-b060cea3a495 h1:GBe/yfpn5uU3Myv0TV4KBvSLfuwRRjTN7uXAupeUhbk=
833+
github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250519113737-b060cea3a495/go.mod h1:FfaLDXN1ZXxyRpnskBqVIYkpkWDCzBmDgIO9xqLnxdQ=
834+
github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250519113737-b060cea3a495 h1:aEJw3HPicUqpwBIZos5lsiNIuL1c4w5bqadkHyj+dAA=
835+
github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250519113737-b060cea3a495/go.mod h1:CXQGEo+kZc7JPX5hn4jJf1msal9q/ExSdAYGkHNPnQw=
836836
github.com/devtron-labs/go-bitbucket v0.9.60-beta h1:VEx1jvDgdtDPS6A1uUFoaEi0l1/oLhbr+90xOwr6sDU=
837837
github.com/devtron-labs/go-bitbucket v0.9.60-beta/go.mod h1:GnuiCesvh8xyHeMCb+twm8lBR/kQzJYSKL28ZfObp1Y=
838838
github.com/devtron-labs/protos v0.0.3-0.20250323220609-ecf8a0f7305e h1:U6UdYbW8a7xn5IzFPd8cywjVVPfutGJCudjePAfL/Hs=

internal/sql/repository/pipelineConfig/PipelineRepository.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ type PipelineRepository interface {
145145
FindDeploymentAppTypeByIds(ids []int) (pipelines []*Pipeline, err error)
146146
GetAllAppsByClusterAndDeploymentAppType(clusterIds []int, deploymentAppName string) ([]*PipelineDeploymentConfigObj, error)
147147
GetAllArgoAppInfoByDeploymentAppNames(deploymentAppNames []string) ([]*PipelineDeploymentConfigObj, error)
148+
FindEnvIdsByIdsInIncludingDeleted(ids []int) ([]int, error)
148149
}
149150

150151
type CiArtifactDTO struct {
@@ -951,3 +952,18 @@ func (impl *PipelineRepositoryImpl) GetAllArgoAppInfoByDeploymentAppNames(deploy
951952
Select(&result)
952953
return result, err
953954
}
955+
956+
func (impl *PipelineRepositoryImpl) FindEnvIdsByIdsInIncludingDeleted(ids []int) ([]int, error) {
957+
var envIds []int
958+
if len(ids) == 0 {
959+
return envIds, nil
960+
}
961+
err := impl.dbConnection.Model(&Pipeline{}).
962+
Column("pipeline.environment_id").
963+
Where("pipeline.id in (?)", pg.In(ids)).
964+
Select(&envIds)
965+
if err != nil {
966+
impl.logger.Errorw("error on fetching pipelines", "ids", ids, "err", err)
967+
}
968+
return envIds, err
969+
}

pkg/app/AppService.go

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -74,14 +74,14 @@ import (
7474
type AppServiceConfig struct {
7575
CdPipelineStatusCronTime string `env:"CD_PIPELINE_STATUS_CRON_TIME" envDefault:"*/2 * * * *" description:"Cron time for CD pipeline status"`
7676
CdHelmPipelineStatusCronTime string `env:"CD_HELM_PIPELINE_STATUS_CRON_TIME" envDefault:"*/2 * * * *" description:"Cron time to check the pipeline status "`
77-
CdPipelineStatusTimeoutDuration string `env:"CD_PIPELINE_STATUS_TIMEOUT_DURATION" envDefault:"20" description:"Timeout for CD pipeline to get healthy" ` // in minutes
78-
PipelineDegradedTime string `env:"PIPELINE_DEGRADED_TIME" envDefault:"10" description:"Time to mark a pipeline degraded if not healthy in defined time"` // in minutes
79-
GetPipelineDeployedWithinHours int `env:"DEPLOY_STATUS_CRON_GET_PIPELINE_DEPLOYED_WITHIN_HOURS" envDefault:"12" description:"This flag is used to fetch the deployment status of the application. It retrieves the status of deployments that occurred between 12 hours and 10 minutes prior to the current time. It fetches non-terminal statuses."` // in hours
80-
HelmPipelineStatusCheckEligibleTime string `env:"HELM_PIPELINE_STATUS_CHECK_ELIGIBLE_TIME" envDefault:"120" description:"eligible time for checking helm app status periodically and update in db, value is in seconds., default is 120, if wfr is updated within configured time i.e. HELM_PIPELINE_STATUS_CHECK_ELIGIBLE_TIME then do not include for this cron cycle."` // in seconds
77+
CdPipelineStatusTimeoutDuration string `env:"CD_PIPELINE_STATUS_TIMEOUT_DURATION" envDefault:"20" description:"Timeout for CD pipeline to get healthy" ` // in minutes
78+
PipelineDegradedTime string `env:"PIPELINE_DEGRADED_TIME" envDefault:"10" description:"Time to mark a pipeline degraded if not healthy in defined time"` // in minutes
79+
GetPipelineDeployedWithinHours int `env:"DEPLOY_STATUS_CRON_GET_PIPELINE_DEPLOYED_WITHIN_HOURS" envDefault:"12" description:"This flag is used to fetch the deployment status of the application. It retrieves the status of deployments that occurred between 12 hours and 10 minutes prior to the current time. It fetches non-terminal statuses."` // in hours
80+
HelmPipelineStatusCheckEligibleTime string `env:"HELM_PIPELINE_STATUS_CHECK_ELIGIBLE_TIME" envDefault:"120" description:"eligible time for checking helm app status periodically and update in db, value is in seconds., default is 120, if wfr is updated within configured time i.e. HELM_PIPELINE_STATUS_CHECK_ELIGIBLE_TIME then do not include for this cron cycle."` // in seconds
8181
ExposeCDMetrics bool `env:"EXPOSE_CD_METRICS" envDefault:"false"`
82-
DevtronChartHelmInstallRequestTimeout int `env:"DEVTRON_CHART_INSTALL_REQUEST_TIMEOUT" envDefault:"6" description:"Context timeout for no gitops concurrent async deployments"` // in minutes
83-
DevtronChartArgoCdInstallRequestTimeout int `env:"DEVTRON_CHART_ARGO_CD_INSTALL_REQUEST_TIMEOUT" envDefault:"1" description:"Context timeout for gitops concurrent async deployments"` // in minutes
84-
ArgoCdManualSyncCronPipelineDeployedBefore int `env:"ARGO_APP_MANUAL_SYNC_TIME" envDefault:"3" description:"retry argocd app manual sync if the timeline is stuck in ARGOCD_SYNC_INITIATED state for more than this defined time (in mins)"` // in minutes
82+
DevtronChartHelmInstallRequestTimeout int `env:"DEVTRON_CHART_INSTALL_REQUEST_TIMEOUT" envDefault:"6" description:"Context timeout for no gitops concurrent async deployments"` // in minutes
83+
DevtronChartArgoCdInstallRequestTimeout int `env:"DEVTRON_CHART_ARGO_CD_INSTALL_REQUEST_TIMEOUT" envDefault:"1" description:"Context timeout for gitops concurrent async deployments"` // in minutes
84+
ArgoCdManualSyncCronPipelineDeployedBefore int `env:"ARGO_APP_MANUAL_SYNC_TIME" envDefault:"3" description:"retry argocd app manual sync if the timeline is stuck in ARGOCD_SYNC_INITIATED state for more than this defined time (in mins)"` // in minutes
8585
}
8686

8787
func GetAppServiceConfig() (*AppServiceConfig, error) {
@@ -555,10 +555,11 @@ func (impl *AppServiceImpl) UpdatePipelineStatusTimelineForApplicationChanges(ap
555555
if err != nil {
556556
impl.logger.Errorw("error in save/update pipeline status fetch detail", "err", err, "cdWfrId", runnerHistoryId)
557557
}
558+
syncStartTime := helper.GetSyncStartTime(app, statusTime)
558559
// creating cd pipeline status timeline
559560
timeline := &pipelineConfig.PipelineStatusTimeline{
560561
CdWorkflowRunnerId: runnerHistoryId,
561-
StatusTime: helper.GetSyncStartTime(app, statusTime),
562+
StatusTime: syncStartTime,
562563
AuditLog: sql.AuditLog{
563564
CreatedBy: 1,
564565
CreatedOn: time.Now(),
@@ -591,7 +592,8 @@ func (impl *AppServiceImpl) UpdatePipelineStatusTimelineForApplicationChanges(ap
591592
timeline.Id = 0
592593
timeline.Status = timelineStatus.TIMELINE_STATUS_KUBECTL_APPLY_SYNCED
593594
timeline.StatusDetail = app.Status.OperationState.Message
594-
timeline.StatusTime = helper.GetSyncFinishTime(app, statusTime)
595+
syncFinishTime := helper.GetSyncFinishTime(app, statusTime)
596+
timeline.StatusTime = syncFinishTime
595597
// checking and saving if this timeline is present or not because kubewatch may stream same objects multiple times
596598
err = impl.pipelineStatusTimelineService.SaveTimeline(timeline, nil)
597599
if err != nil {
@@ -610,6 +612,7 @@ func (impl *AppServiceImpl) UpdatePipelineStatusTimelineForApplicationChanges(ap
610612
haveNewTimeline = true
611613
timeline.Status = timelineStatus.TIMELINE_STATUS_APP_HEALTHY
612614
timeline.StatusDetail = "App status is Healthy."
615+
timeline.StatusTime = statusTime
613616
}
614617
if haveNewTimeline {
615618
// not checking if this status is already present or not because already checked for terminal status existence earlier
@@ -668,10 +671,11 @@ func (impl *AppServiceImpl) UpdatePipelineStatusTimelineForApplicationChanges(ap
668671
if err != nil {
669672
impl.logger.Errorw("error in save/update pipeline status fetch detail", "err", err, "installedAppVersionHistoryId", runnerHistoryId)
670673
}
674+
syncStartTime := helper.GetSyncStartTime(app, statusTime)
671675
// creating installedAppVersionHistory status timeline
672676
timeline := &pipelineConfig.PipelineStatusTimeline{
673677
InstalledAppVersionHistoryId: runnerHistoryId,
674-
StatusTime: helper.GetSyncStartTime(app, statusTime),
678+
StatusTime: syncStartTime,
675679
AuditLog: sql.AuditLog{
676680
CreatedBy: 1,
677681
CreatedOn: time.Now(),
@@ -704,7 +708,8 @@ func (impl *AppServiceImpl) UpdatePipelineStatusTimelineForApplicationChanges(ap
704708
timeline.Id = 0
705709
timeline.Status = timelineStatus.TIMELINE_STATUS_KUBECTL_APPLY_SYNCED
706710
timeline.StatusDetail = app.Status.OperationState.Message
707-
timeline.StatusTime = helper.GetSyncFinishTime(app, statusTime)
711+
syncFinishTime := helper.GetSyncFinishTime(app, statusTime)
712+
timeline.StatusTime = syncFinishTime
708713
// checking and saving if this timeline is present or not because kubewatch may stream same objects multiple times
709714
err = impl.pipelineStatusTimelineService.SaveTimeline(timeline, nil)
710715
if err != nil {
@@ -723,6 +728,7 @@ func (impl *AppServiceImpl) UpdatePipelineStatusTimelineForApplicationChanges(ap
723728
haveNewTimeline = true
724729
timeline.Status = timelineStatus.TIMELINE_STATUS_APP_HEALTHY
725730
timeline.StatusDetail = "App status is Healthy."
731+
timeline.StatusTime = statusTime
726732
}
727733
if haveNewTimeline {
728734
// not checking if this status is already present or not because already checked for terminal status existence earlier

pkg/app/status/PipelineStatusTimelineResourcesService.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,18 +92,24 @@ func (impl *PipelineStatusTimelineResourcesServiceImpl) SaveOrUpdatePipelineTime
9292
if application != nil && application.Status.OperationState != nil && application.Status.OperationState.SyncResult != nil {
9393
for _, resource := range application.Status.OperationState.SyncResult.Resources {
9494
if resource != nil {
95+
resourceStatus := string(resource.HookPhase)
96+
if len(resourceStatus) == 0 {
97+
resourceStatus = string(resource.Status)
98+
}
99+
//if resource is already present in the timelineResources, then update it
95100
if index, ok := oldTimelineResourceMap[resource.Name]; ok {
96-
timelineResources[index].ResourceStatus = string(resource.HookPhase)
101+
timelineResources[index].ResourceStatus = resourceStatus
97102
timelineResources[index].StatusMessage = resource.Message
98103
timelineResources[index].UpdatedBy = userId
99104
timelineResources[index].UpdatedOn = time.Now()
100105
timelineResourcesToBeUpdated = append(timelineResourcesToBeUpdated, timelineResources[index])
101106
} else {
107+
//if resource is not present in the timelineResources, then create a new one
102108
newTimelineResource := &pipelineConfig.PipelineStatusTimelineResources{
103109
ResourceName: resource.Name,
104110
ResourceKind: resource.Kind,
105111
ResourceGroup: resource.Group,
106-
ResourceStatus: string(resource.HookPhase),
112+
ResourceStatus: resourceStatus,
107113
StatusMessage: resource.Message,
108114
AuditLog: sql.AuditLog{
109115
CreatedBy: userId,

pkg/argoApplication/helper/deploymentStatusHelper.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
// GetSyncStartTime assumes that it is always called for calculating start time of latest git hash
1010
func GetSyncStartTime(app *v1alpha1.Application, defaultStartTime time.Time) time.Time {
1111
startTime := metav1.NewTime(defaultStartTime)
12+
// FIXME: this should be the git hash of the latest PCO
1213
gitHash := app.Status.Sync.Revision
1314
if app.Status.OperationState != nil {
1415
startTime = app.Status.OperationState.StartedAt
@@ -25,6 +26,7 @@ func GetSyncStartTime(app *v1alpha1.Application, defaultStartTime time.Time) tim
2526
// GetSyncFinishTime assumes that it is always called for calculating finish time of latest git hash
2627
func GetSyncFinishTime(app *v1alpha1.Application, defaultEndTime time.Time) time.Time {
2728
finishTime := metav1.NewTime(defaultEndTime)
29+
// FIXME: this should be the git hash of the latest PCO
2830
gitHash := app.Status.Sync.Revision
2931
if app.Status.OperationState != nil && app.Status.OperationState.FinishedAt != nil {
3032
finishTime = *app.Status.OperationState.FinishedAt

pkg/build/trigger/HandlerService.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1910,7 +1910,7 @@ func (impl *HandlerServiceImpl) DownloadCiWorkflowArtifacts(pipelineId int, buil
19101910
impl.ciWorkflowRepository.MigrateCiArtifactLocation(ciWorkflow.Id, key)
19111911
}
19121912
baseLogLocationPathConfig := impl.config.BaseLogLocationPath
1913-
blobStorageService := blob_storage.NewBlobStorageServiceImpl(nil)
1913+
blobStorageService := blob_storage.NewBlobStorageServiceImpl(impl.Logger)
19141914
destinationKey := filepath.Clean(filepath.Join(baseLogLocationPathConfig, item))
19151915
request := &blob_storage.BlobStorageRequest{
19161916
StorageType: impl.config.CloudProvider,

0 commit comments

Comments
 (0)