From ee510cdb9c71699ced7ec78587f7dc04ddd782d3 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Wed, 31 Jul 2024 09:00:36 -0400 Subject: [PATCH 01/78] add time measurements in cli, engine, log file parsing --- cli/cli/commands/service/logs/logs.go | 8 ++++++++ cli/cli/scripts/build.sh | 9 +++++---- .../per_week_stream_logs_strategy.go | 7 +++++++ .../engine/server/engine_connect_server_service.go | 8 ++++++++ engine/server/go.mod | 2 +- engine/server/go.sum | 4 ++-- 6 files changed, 31 insertions(+), 7 deletions(-) diff --git a/cli/cli/commands/service/logs/logs.go b/cli/cli/commands/service/logs/logs.go index 550cb5df0b..1c7e52a0cf 100644 --- a/cli/cli/commands/service/logs/logs.go +++ b/cli/cli/commands/service/logs/logs.go @@ -27,6 +27,7 @@ import ( "os" "os/signal" "strconv" + "time" ) const ( @@ -262,13 +263,16 @@ func run( interruptChan := make(chan os.Signal, interruptChanBufferSize) signal.Notify(interruptChan, os.Interrupt) + var totalLogPrintDuration time.Duration for { select { case serviceLogsStreamContent, isChanOpen := <-serviceLogsStreamContentChan: if !isChanOpen { + logrus.Infof("CLI [logs.txt] TOTAL TIME TO PRINT LOGS: %v", totalLogPrintDuration) return nil } + startTime := time.Now() notFoundServiceUuids := serviceLogsStreamContent.GetNotFoundServiceUuids() for notFoundServiceUuid := range notFoundServiceUuids { @@ -287,10 +291,14 @@ func run( out.PrintOutLn(fmt.Sprintf("[%v] %v", colorPrinter(serviceIdentifier), serviceLog.GetContent())) } } + endTime := time.Now() + totalLogPrintDuration = endTime.Sub(startTime) case <-interruptChan: logrus.Debugf("Received signal interruption in service logs Kurtosis CLI command") + logrus.Infof("CLI [logs.go] TOTAL TIME TO PRINT LOGS: %v", totalLogPrintDuration) return nil } + logrus.Infof("CLI [logs.go] TOTAL TIME TO PRINT LOGS: %v", totalLogPrintDuration) } } diff --git a/cli/cli/scripts/build.sh b/cli/cli/scripts/build.sh index 0f8401c209..db8f5d7443 100755 --- a/cli/cli/scripts/build.sh +++ b/cli/cli/scripts/build.sh @@ -97,10 +97,11 @@ fi exit 1 fi # Executing goreleaser v1.26.2 without needing to install it - if ! curl -sfL https://goreleaser.com/static/run | VERSION=v1.26.2 DISTRIBUTION=oss bash -s -- ${goreleaser_verb_and_flags}; then - echo "Error: Couldn't build the CLI binary for the current OS/arch" >&2 - exit 1 - fi +# if ! curl -sfL https://goreleaser.com/static/run | VERSION=v1.26.2 DISTRIBUTION=oss bash -s -- ${goreleaser_verb_and_flags}; then + if ! GORELEASER_CURRENT_TAG=$(cat $root_dirpath/version.txt) goreleaser ${goreleaser_verb_and_flags}; then + echo "Error: Couldn't build the CLI binary for the current OS/arch" >&2 + exit 1 + fi ) # Final verification diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go index 755df67123..f1117e80d9 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go @@ -183,14 +183,17 @@ func (strategy *PerWeekStreamLogsStrategy) streamAllLogs( logsByKurtosisUserServiceUuidChan chan map[service.ServiceUUID][]logline.LogLine, serviceUuid service.ServiceUUID, conjunctiveLogLinesFiltersWithRegex []logline.LogLineFilterWithRegex) error { + var totalLogFileReadDuration time.Duration for { select { case <-ctx.Done(): logrus.Debugf("Context was canceled, stopping streaming service logs for service '%v'", serviceUuid) + logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO READ FILES: %v", totalLogFileReadDuration) return nil default: jsonLogStr, err := getCompleteJsonLogString(logsReader) if isValidJsonEnding(jsonLogStr) { + startTime := time.Now() jsonLog, err := convertStringToJson(jsonLogStr) if err != nil { return stacktrace.Propagate(err, "An error occurred converting the json log string '%v' into json.", jsonLogStr) @@ -198,13 +201,17 @@ func (strategy *PerWeekStreamLogsStrategy) streamAllLogs( if err = strategy.sendJsonLogLine(jsonLog, logsByKurtosisUserServiceUuidChan, serviceUuid, conjunctiveLogLinesFiltersWithRegex); err != nil { return err } + endTime := time.Now() + totalLogFileReadDuration += endTime.Sub(startTime) } if err != nil { // if we've reached end of logs, return success, otherwise return the error if errors.Is(err, io.EOF) { + logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO READ FILES: %v", totalLogFileReadDuration) return nil } else { + logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO READ FILES: %v", totalLogFileReadDuration) return err } } diff --git a/engine/server/engine/server/engine_connect_server_service.go b/engine/server/engine/server/engine_connect_server_service.go index 3fc908e916..1921e0725d 100644 --- a/engine/server/engine/server/engine_connect_server_service.go +++ b/engine/server/engine/server/engine_connect_server_service.go @@ -347,6 +347,7 @@ func (service *EngineConnectServerService) GetServiceLogs(ctx context.Context, c } }() + var totalLogStreamDuration time.Duration for { select { //stream case @@ -354,24 +355,31 @@ func (service *EngineConnectServerService) GetServiceLogs(ctx context.Context, c //If the channel is closed means that the logs database client won't continue sending streams if !isChanOpen { logrus.Debug("Exiting the stream loop after receiving a close signal from the service logs by service UUID channel") + logrus.Infof("ENGINE [engine_connect_server_service.go] TOTAL TIME TO STREAM LOGS IN ENGINE: %v", totalLogStreamDuration) return nil } + startTime := time.Now() getServiceLogsResponse := newLogsResponse(requestedServiceUuids, serviceLogsByServiceUuid, notFoundServiceUuids) if err := stream.Send(getServiceLogsResponse); err != nil { return stacktrace.Propagate(err, "An error occurred sending the stream logs for service logs response '%+v'", getServiceLogsResponse) } + endTime := time.Now() + totalLogStreamDuration += endTime.Sub(startTime) //client cancel ctx case case <-contextWithCancel.Done(): logrus.Debug("The user service logs stream has done") + logrus.Infof("ENGINE [engine_connect_server_service.go] TOTAL TIME TO STREAM LOGS IN ENGINE: %v", totalLogStreamDuration) return nil //error from logs database case case err, isChanOpen := <-errChan: if isChanOpen { logrus.Debug("Exiting the stream because an error from the logs database client was received through the error chan.") + logrus.Infof("ENGINE [engine_connect_server_service.go] TOTAL TIME TO STREAM LOGS IN ENGINE: %v", totalLogStreamDuration) return stacktrace.Propagate(err, "An error occurred streaming user service logs.") } logrus.Debug("Exiting the stream loop after receiving a close signal from the error chan") + logrus.Infof("ENGINE [engine_connect_server_service.go] TOTAL TIME TO STREAM LOGS IN ENGINE: %v", totalLogStreamDuration) return nil } } diff --git a/engine/server/go.mod b/engine/server/go.mod index f6548f984e..4660cedcc6 100644 --- a/engine/server/go.mod +++ b/engine/server/go.mod @@ -63,7 +63,7 @@ require ( github.com/kurtosis-tech/kurtosis/grpc-file-transfer/golang v0.0.0-20230803130419-099ee7a4e3dc github.com/kurtosis-tech/kurtosis/metrics-library/golang v0.0.0-20231206095907-9bdf0d02cb90 github.com/labstack/echo/v4 v4.11.3 - github.com/rs/cors v1.9.0 + github.com/rs/cors v1.11.0 github.com/spf13/afero v1.10.0 golang.org/x/exp v0.0.0-20230905200255-921286631fa9 k8s.io/apimachinery v0.27.2 diff --git a/engine/server/go.sum b/engine/server/go.sum index b7fd1e32d1..c027f4c074 100644 --- a/engine/server/go.sum +++ b/engine/server/go.sum @@ -312,8 +312,8 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rs/cors v1.9.0 h1:l9HGsTsHJcvW14Nk7J9KFz8bzeAWXn3CG6bgt7LsrAE= -github.com/rs/cors v1.9.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= +github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/segmentio/backo-go v1.0.0 h1:kbOAtGJY2DqOR0jfRkYEorx/b18RgtepGtY3+Cpe6qA= github.com/segmentio/backo-go v1.0.0/go.mod h1:kJ9mm9YmoWSkk+oQ+5Cj8DEoRCX2JT6As4kEtIIOp1M= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= From f8811264790fd070e0af8a3372d8962b83cd4462 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Wed, 31 Jul 2024 10:39:56 -0400 Subject: [PATCH 02/78] add more granular measurements --- cli/cli/commands/service/logs/logs.go | 1 - .../per_week_stream_logs_strategy.go | 92 ++++++++++++++++++- .../server/engine_connect_server_service.go | 11 ++- 3 files changed, 97 insertions(+), 7 deletions(-) diff --git a/cli/cli/commands/service/logs/logs.go b/cli/cli/commands/service/logs/logs.go index 1c7e52a0cf..028039224c 100644 --- a/cli/cli/commands/service/logs/logs.go +++ b/cli/cli/commands/service/logs/logs.go @@ -298,7 +298,6 @@ func run( logrus.Infof("CLI [logs.go] TOTAL TIME TO PRINT LOGS: %v", totalLogPrintDuration) return nil } - logrus.Infof("CLI [logs.go] TOTAL TIME TO PRINT LOGS: %v", totalLogPrintDuration) } } diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go index f1117e80d9..ba7ac5e388 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go @@ -89,10 +89,12 @@ func (strategy *PerWeekStreamLogsStrategy) StreamLogs( }() if shouldReturnAllLogs { + startTime := time.Now() if err := strategy.streamAllLogs(ctx, logsReader, logsByKurtosisUserServiceUuidChan, serviceUuid, conjunctiveLogLinesFiltersWithRegex); err != nil { streamErrChan <- stacktrace.Propagate(err, "An error occurred streaming all logs for service '%v' in enclave '%v'", serviceUuid, enclaveUuid) return } + logrus.Infof("TOTAL TIME IN STREAM ALL LOGS FUNCTION: %v", time.Now().Sub(startTime)) } else { if err := strategy.streamTailLogs(ctx, logsReader, numLogLines, logsByKurtosisUserServiceUuidChan, serviceUuid, conjunctiveLogLinesFiltersWithRegex); err != nil { streamErrChan <- stacktrace.Propagate(err, "An error occurred streaming '%v' logs for service '%v' in enclave '%v'", numLogLines, serviceUuid, enclaveUuid) @@ -184,23 +186,38 @@ func (strategy *PerWeekStreamLogsStrategy) streamAllLogs( serviceUuid service.ServiceUUID, conjunctiveLogLinesFiltersWithRegex []logline.LogLineFilterWithRegex) error { var totalLogFileReadDuration time.Duration + var totalTimeToGetJsonStrings time.Duration + var totalTimeToSendJsonLogs time.Duration + var totalTimeProcessLinesInSend time.Duration + var totalTimeSendingAcrossChannelInSend time.Duration for { select { case <-ctx.Done(): logrus.Debugf("Context was canceled, stopping streaming service logs for service '%v'", serviceUuid) - logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO READ FILES: %v", totalLogFileReadDuration) + logTimes(totalLogFileReadDuration, totalTimeToGetJsonStrings, totalTimeToSendJsonLogs, totalTimeSendingAcrossChannelInSend, totalTimeProcessLinesInSend) return nil default: + startTime := time.Now() + + getJsonStartTime := time.Now() jsonLogStr, err := getCompleteJsonLogString(logsReader) + totalTimeToGetJsonStrings += time.Now().Sub(getJsonStartTime) + if isValidJsonEnding(jsonLogStr) { - startTime := time.Now() jsonLog, err := convertStringToJson(jsonLogStr) if err != nil { return stacktrace.Propagate(err, "An error occurred converting the json log string '%v' into json.", jsonLogStr) } - if err = strategy.sendJsonLogLine(jsonLog, logsByKurtosisUserServiceUuidChan, serviceUuid, conjunctiveLogLinesFiltersWithRegex); err != nil { + + sendJsonLogLineStartTime := time.Now() + err, sendDuration, processDuration := strategy.sendJsonLogLineWithTimes(jsonLog, logsByKurtosisUserServiceUuidChan, serviceUuid, conjunctiveLogLinesFiltersWithRegex) + if err != nil { return err } + totalTimeToSendJsonLogs += time.Now().Sub(sendJsonLogLineStartTime) + totalTimeProcessLinesInSend += sendDuration + totalTimeProcessLinesInSend += processDuration + endTime := time.Now() totalLogFileReadDuration += endTime.Sub(startTime) } @@ -208,10 +225,10 @@ func (strategy *PerWeekStreamLogsStrategy) streamAllLogs( if err != nil { // if we've reached end of logs, return success, otherwise return the error if errors.Is(err, io.EOF) { - logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO READ FILES: %v", totalLogFileReadDuration) + logTimes(totalLogFileReadDuration, totalTimeToGetJsonStrings, totalTimeToSendJsonLogs, totalTimeSendingAcrossChannelInSend, totalTimeProcessLinesInSend) return nil } else { - logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO READ FILES: %v", totalLogFileReadDuration) + logTimes(totalLogFileReadDuration, totalTimeToGetJsonStrings, totalTimeToSendJsonLogs, totalTimeSendingAcrossChannelInSend, totalTimeProcessLinesInSend) return err } } @@ -354,6 +371,63 @@ func (strategy *PerWeekStreamLogsStrategy) sendJsonLogLine( return nil } +func (strategy *PerWeekStreamLogsStrategy) sendJsonLogLineWithTimes( + jsonLog JsonLog, + logsByKurtosisUserServiceUuidChan chan map[service.ServiceUUID][]logline.LogLine, + serviceUuid service.ServiceUUID, + conjunctiveLogLinesFiltersWithRegex []logline.LogLineFilterWithRegex) (error, time.Duration, time.Duration) { + // each logLineStr is of the following structure: {"enclave_uuid": "...", "service_uuid":"...", "log": "...",.. "timestamp":"..."} + // eg. {"container_type":"api-container", "container_id":"8f8558ba", "container_name":"/kurtosis-api--ffd", + // "log":"hi","timestamp":"2023-08-14T14:57:49Z"} + + var processDuration time.Duration + var sendDuration time.Duration + + processStart := time.Now() + // Then extract the actual log message using the vectors log field + logMsgStr, found := jsonLog[volume_consts.LogLabel] + if !found { + return stacktrace.NewError("An error retrieving the log field '%v' from json log: %v\n", volume_consts.LogLabel, jsonLog), sendDuration, processDuration + } + + // Extract the timestamp using vectors timestamp field + logTimestamp, err := parseTimestampFromJsonLogLine(jsonLog) + if err != nil { + return stacktrace.Propagate(err, "An error occurred parsing timestamp from json log line."), sendDuration, processDuration + } + logLine := logline.NewLogLine(logMsgStr, *logTimestamp) + + // Then filter by checking if the log message is valid based on requested filters + validLogLine, err := logLine.IsValidLogLineBaseOnFilters(conjunctiveLogLinesFiltersWithRegex) + if err != nil { + return stacktrace.Propagate(err, "An error occurred filtering log line '%+v' using filters '%+v'", logLine, conjunctiveLogLinesFiltersWithRegex), sendDuration, processDuration + } + if !validLogLine { + return nil, sendDuration, processDuration + } + + // ensure this log line is within the retention period if it has a timestamp + withinRetentionPeriod, err := strategy.isWithinRetentionPeriod(logLine) + if err != nil { + return stacktrace.Propagate(err, "An error occurred filtering log line '%+v' using filters '%+v'", logLine, conjunctiveLogLinesFiltersWithRegex), sendDuration, processDuration + } + if !withinRetentionPeriod { + return nil, sendDuration, processDuration + } + + // send the log line + logLines := []logline.LogLine{*logLine} + userServicesLogLinesMap := map[service.ServiceUUID][]logline.LogLine{ + serviceUuid: logLines, + } + processDuration = time.Now().Sub(processStart) + + sendStart := time.Now() + logsByKurtosisUserServiceUuidChan <- userServicesLogLinesMap + sendDuration = time.Now().Sub(sendStart) + return nil, sendDuration, processDuration +} + // Returns true if [logLine] has no timestamp func (strategy *PerWeekStreamLogsStrategy) isWithinRetentionPeriod(logLine *logline.LogLine) (bool, error) { retentionPeriod := strategy.time.Now().Add(time.Duration(-strategy.logRetentionPeriodInWeeks) * oneWeek) @@ -434,3 +508,11 @@ func parseTimestampFromJsonLogLine(logLine JsonLog) (*time.Time, error) { } return ×tamp, nil } + +func logTimes(totalDuration, getLineDuration, totalSendLineDuration, actualSendLineDuration, processLineDuraction time.Duration) { + logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO READ FILES: %v", totalDuration) + logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO GET JSON LINES: %v", getLineDuration) + logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO SEND JSON LINES: %v", totalSendLineDuration) + logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO SEND JSON LINES ACROSS CHANNEL: %v", actualSendLineDuration) + logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO PROCESS JSON LINES BEFORE SENDING: %v", processLineDuraction) +} diff --git a/engine/server/engine/server/engine_connect_server_service.go b/engine/server/engine/server/engine_connect_server_service.go index 1921e0725d..a3f3c84225 100644 --- a/engine/server/engine/server/engine_connect_server_service.go +++ b/engine/server/engine/server/engine_connect_server_service.go @@ -348,6 +348,7 @@ func (service *EngineConnectServerService) GetServiceLogs(ctx context.Context, c }() var totalLogStreamDuration time.Duration + var counter int for { select { //stream case @@ -358,12 +359,20 @@ func (service *EngineConnectServerService) GetServiceLogs(ctx context.Context, c logrus.Infof("ENGINE [engine_connect_server_service.go] TOTAL TIME TO STREAM LOGS IN ENGINE: %v", totalLogStreamDuration) return nil } - startTime := time.Now() + // print out num log lines every 100 lines times + //for serviceUUID, logs := range serviceLogsByServiceUuid { + // if counter%100 == 0 { + // logrus.Infof("NUM LOG LINES FOR SERVICE '%v' CHECK IN ENGINE CONNECT SERVICE: %v", serviceUUID, len(logs)) + // } + //} + + startTime := time.Now() getServiceLogsResponse := newLogsResponse(requestedServiceUuids, serviceLogsByServiceUuid, notFoundServiceUuids) if err := stream.Send(getServiceLogsResponse); err != nil { return stacktrace.Propagate(err, "An error occurred sending the stream logs for service logs response '%+v'", getServiceLogsResponse) } + counter += 1 endTime := time.Now() totalLogStreamDuration += endTime.Sub(startTime) //client cancel ctx case From 487e5d1714b0a4f3884ce184d11af3825623fe4f Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 1 Aug 2024 01:26:41 -0400 Subject: [PATCH 03/78] use buffered log channel --- .../persistent_volume_logs_database_client.go | 5 +- .../per_week_stream_logs_strategy.go | 126 +++++++++++++++--- 2 files changed, 108 insertions(+), 23 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client.go index 46c00f00d2..c8ef39d57d 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client.go @@ -13,7 +13,8 @@ import ( ) const ( - oneSenderAdded = 1 + logLineBufferSize = 100 + oneSenderAdded = 1 ) // persistentVolumeLogsDatabaseClient pulls logs from a Docker volume the engine is mounted to @@ -63,7 +64,7 @@ func (client *persistentVolumeLogsDatabaseClient) StreamUserServiceLogs( streamErrChan := make(chan error) // this channel will return the user service log lines by service UUID - logsByKurtosisUserServiceUuidChan := make(chan map[service.ServiceUUID][]logline.LogLine) + logsByKurtosisUserServiceUuidChan := make(chan map[service.ServiceUUID][]logline.LogLine, logLineBufferSize) // MAKE IT A BUFFERED CHANNEL SEE HOW THAT IMPROVES THINGS wgSenders := &sync.WaitGroup{} for serviceUuid := range userServiceUuids { diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go index ba7ac5e388..c0d339dd2f 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go @@ -185,16 +185,29 @@ func (strategy *PerWeekStreamLogsStrategy) streamAllLogs( logsByKurtosisUserServiceUuidChan chan map[service.ServiceUUID][]logline.LogLine, serviceUuid service.ServiceUUID, conjunctiveLogLinesFiltersWithRegex []logline.LogLineFilterWithRegex) error { + var totalLogFileReadDuration time.Duration var totalTimeToGetJsonStrings time.Duration var totalTimeToSendJsonLogs time.Duration + + var totalTimeToSendLogsGranular time.Duration var totalTimeProcessLinesInSend time.Duration - var totalTimeSendingAcrossChannelInSend time.Duration + var totalTimestampParsing time.Duration + var totalFilterCheck time.Duration + var totalRetentionCheck time.Duration + + var ltm SendLogLineTimeMeasurements for { select { case <-ctx.Done(): logrus.Debugf("Context was canceled, stopping streaming service logs for service '%v'", serviceUuid) - logTimes(totalLogFileReadDuration, totalTimeToGetJsonStrings, totalTimeToSendJsonLogs, totalTimeSendingAcrossChannelInSend, totalTimeProcessLinesInSend) + logTimes(totalLogFileReadDuration, totalTimeToGetJsonStrings, totalTimeToSendJsonLogs, SendLogLineTimeMeasurements{ + processDuration: totalTimeProcessLinesInSend, + sendDuration: totalTimeToSendLogsGranular, + parseTimestampDuratoin: totalTimestampParsing, + filterCheckDuration: totalFilterCheck, + retentionPeriodCheckDuration: totalRetentionCheck, + }) return nil default: startTime := time.Now() @@ -210,13 +223,17 @@ func (strategy *PerWeekStreamLogsStrategy) streamAllLogs( } sendJsonLogLineStartTime := time.Now() - err, sendDuration, processDuration := strategy.sendJsonLogLineWithTimes(jsonLog, logsByKurtosisUserServiceUuidChan, serviceUuid, conjunctiveLogLinesFiltersWithRegex) + err, ltm = strategy.sendJsonLogLineWithTimes(jsonLog, logsByKurtosisUserServiceUuidChan, serviceUuid, conjunctiveLogLinesFiltersWithRegex) if err != nil { return err } totalTimeToSendJsonLogs += time.Now().Sub(sendJsonLogLineStartTime) - totalTimeProcessLinesInSend += sendDuration - totalTimeProcessLinesInSend += processDuration + + totalTimeToSendLogsGranular += ltm.sendDuration + totalTimeProcessLinesInSend += ltm.processDuration + totalTimestampParsing += ltm.parseTimestampDuratoin + totalFilterCheck += ltm.filterCheckDuration + totalRetentionCheck += ltm.retentionPeriodCheckDuration endTime := time.Now() totalLogFileReadDuration += endTime.Sub(startTime) @@ -225,10 +242,22 @@ func (strategy *PerWeekStreamLogsStrategy) streamAllLogs( if err != nil { // if we've reached end of logs, return success, otherwise return the error if errors.Is(err, io.EOF) { - logTimes(totalLogFileReadDuration, totalTimeToGetJsonStrings, totalTimeToSendJsonLogs, totalTimeSendingAcrossChannelInSend, totalTimeProcessLinesInSend) + logTimes(totalLogFileReadDuration, totalTimeToGetJsonStrings, totalTimeToSendJsonLogs, SendLogLineTimeMeasurements{ + processDuration: totalTimeProcessLinesInSend, + sendDuration: totalTimeToSendLogsGranular, + parseTimestampDuratoin: totalTimestampParsing, + filterCheckDuration: totalFilterCheck, + retentionPeriodCheckDuration: totalRetentionCheck, + }) return nil } else { - logTimes(totalLogFileReadDuration, totalTimeToGetJsonStrings, totalTimeToSendJsonLogs, totalTimeSendingAcrossChannelInSend, totalTimeProcessLinesInSend) + logTimes(totalLogFileReadDuration, totalTimeToGetJsonStrings, totalTimeToSendJsonLogs, SendLogLineTimeMeasurements{ + processDuration: totalTimeProcessLinesInSend, + sendDuration: totalTimeToSendLogsGranular, + parseTimestampDuratoin: totalTimestampParsing, + filterCheckDuration: totalFilterCheck, + retentionPeriodCheckDuration: totalRetentionCheck, + }) return err } } @@ -371,61 +400,113 @@ func (strategy *PerWeekStreamLogsStrategy) sendJsonLogLine( return nil } +type SendLogLineTimeMeasurements struct { + processDuration time.Duration + sendDuration time.Duration + parseTimestampDuratoin time.Duration + filterCheckDuration time.Duration + retentionPeriodCheckDuration time.Duration +} + func (strategy *PerWeekStreamLogsStrategy) sendJsonLogLineWithTimes( jsonLog JsonLog, logsByKurtosisUserServiceUuidChan chan map[service.ServiceUUID][]logline.LogLine, serviceUuid service.ServiceUUID, - conjunctiveLogLinesFiltersWithRegex []logline.LogLineFilterWithRegex) (error, time.Duration, time.Duration) { + conjunctiveLogLinesFiltersWithRegex []logline.LogLineFilterWithRegex) (error, SendLogLineTimeMeasurements) { // each logLineStr is of the following structure: {"enclave_uuid": "...", "service_uuid":"...", "log": "...",.. "timestamp":"..."} // eg. {"container_type":"api-container", "container_id":"8f8558ba", "container_name":"/kurtosis-api--ffd", // "log":"hi","timestamp":"2023-08-14T14:57:49Z"} - var processDuration time.Duration var sendDuration time.Duration + var parseTimestampDuration time.Duration + var filterCheckDuration time.Duration + var retentionPeriodCheckDuration time.Duration processStart := time.Now() // Then extract the actual log message using the vectors log field logMsgStr, found := jsonLog[volume_consts.LogLabel] if !found { - return stacktrace.NewError("An error retrieving the log field '%v' from json log: %v\n", volume_consts.LogLabel, jsonLog), sendDuration, processDuration + return stacktrace.NewError("An error retrieving the log field '%v' from json log: %v\n", volume_consts.LogLabel, jsonLog), SendLogLineTimeMeasurements{ + processDuration: processDuration, + sendDuration: sendDuration, + parseTimestampDuratoin: parseTimestampDuration, + filterCheckDuration: filterCheckDuration, + retentionPeriodCheckDuration: retentionPeriodCheckDuration, + } } + timestampStart := time.Now() // Extract the timestamp using vectors timestamp field logTimestamp, err := parseTimestampFromJsonLogLine(jsonLog) if err != nil { - return stacktrace.Propagate(err, "An error occurred parsing timestamp from json log line."), sendDuration, processDuration + return stacktrace.Propagate(err, "An error occurred parsing timestamp from json log line."), SendLogLineTimeMeasurements{ + processDuration: processDuration, + sendDuration: sendDuration, + parseTimestampDuratoin: parseTimestampDuration, + filterCheckDuration: filterCheckDuration, + retentionPeriodCheckDuration: retentionPeriodCheckDuration, + } } logLine := logline.NewLogLine(logMsgStr, *logTimestamp) + parseTimestampDuration += time.Now().Sub(timestampStart) + filterStart := time.Now() // Then filter by checking if the log message is valid based on requested filters validLogLine, err := logLine.IsValidLogLineBaseOnFilters(conjunctiveLogLinesFiltersWithRegex) if err != nil { - return stacktrace.Propagate(err, "An error occurred filtering log line '%+v' using filters '%+v'", logLine, conjunctiveLogLinesFiltersWithRegex), sendDuration, processDuration + return stacktrace.Propagate(err, "An error occurred filtering log line '%+v' using filters '%+v'", logLine, conjunctiveLogLinesFiltersWithRegex), SendLogLineTimeMeasurements{ + processDuration: processDuration, + sendDuration: sendDuration, + parseTimestampDuratoin: parseTimestampDuration, + filterCheckDuration: filterCheckDuration, + retentionPeriodCheckDuration: retentionPeriodCheckDuration, + } } if !validLogLine { - return nil, sendDuration, processDuration + return nil, SendLogLineTimeMeasurements{ + processDuration: processDuration, + sendDuration: sendDuration, + parseTimestampDuratoin: parseTimestampDuration, + filterCheckDuration: filterCheckDuration, + retentionPeriodCheckDuration: retentionPeriodCheckDuration, + } } + filterCheckDuration += time.Now().Sub(filterStart) + retentionCheckStart := time.Now() // ensure this log line is within the retention period if it has a timestamp withinRetentionPeriod, err := strategy.isWithinRetentionPeriod(logLine) if err != nil { - return stacktrace.Propagate(err, "An error occurred filtering log line '%+v' using filters '%+v'", logLine, conjunctiveLogLinesFiltersWithRegex), sendDuration, processDuration + return stacktrace.Propagate(err, "An error occurred determining whether log line '%+v' is within the retention period.", logLine), SendLogLineTimeMeasurements{} } if !withinRetentionPeriod { - return nil, sendDuration, processDuration + return nil, SendLogLineTimeMeasurements{ + processDuration: processDuration, + sendDuration: sendDuration, + parseTimestampDuratoin: parseTimestampDuration, + filterCheckDuration: filterCheckDuration, + retentionPeriodCheckDuration: retentionPeriodCheckDuration, + } } + retentionPeriodCheckDuration += time.Now().Sub(retentionCheckStart) // send the log line logLines := []logline.LogLine{*logLine} userServicesLogLinesMap := map[service.ServiceUUID][]logline.LogLine{ serviceUuid: logLines, } - processDuration = time.Now().Sub(processStart) + processDuration += time.Now().Sub(processStart) sendStart := time.Now() logsByKurtosisUserServiceUuidChan <- userServicesLogLinesMap - sendDuration = time.Now().Sub(sendStart) - return nil, sendDuration, processDuration + sendDuration += time.Now().Sub(sendStart) + return nil, SendLogLineTimeMeasurements{ + processDuration: processDuration, + sendDuration: sendDuration, + parseTimestampDuratoin: parseTimestampDuration, + filterCheckDuration: filterCheckDuration, + retentionPeriodCheckDuration: retentionPeriodCheckDuration, + } } // Returns true if [logLine] has no timestamp @@ -509,10 +590,13 @@ func parseTimestampFromJsonLogLine(logLine JsonLog) (*time.Time, error) { return ×tamp, nil } -func logTimes(totalDuration, getLineDuration, totalSendLineDuration, actualSendLineDuration, processLineDuraction time.Duration) { +func logTimes(totalDuration, getLineDuration, totalSendLineDuration time.Duration, sendLogLineTM SendLogLineTimeMeasurements) { logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO READ FILES: %v", totalDuration) logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO GET JSON LINES: %v", getLineDuration) logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO SEND JSON LINES: %v", totalSendLineDuration) - logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO SEND JSON LINES ACROSS CHANNEL: %v", actualSendLineDuration) - logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO PROCESS JSON LINES BEFORE SENDING: %v", processLineDuraction) + logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO SEND JSON LINES ACROSS CHANNEL: %v", sendLogLineTM.sendDuration) + logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO PROCESS JSON LINES BEFORE SENDING: %v", sendLogLineTM.processDuration) + logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO PARSE TIMESTAMPS: %v", sendLogLineTM.parseTimestampDuratoin) + logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO FILTER LINES BASED ON REGEXES: %v", sendLogLineTM.filterCheckDuration) + logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO CHECK RETENTION PERIOD: %v", sendLogLineTM.retentionPeriodCheckDuration) } From f316abec01b89fc7e652346b34e4c9ff1e76c546 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 1 Aug 2024 02:47:10 -0400 Subject: [PATCH 04/78] batch send log lines --- .../persistent_volume_logs_database_client.go | 4 +- ...istent_volume_logs_database_client_test.go | 1554 ++++++++--------- .../per_week_stream_logs_strategy.go | 46 +- 3 files changed, 803 insertions(+), 801 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client.go index c8ef39d57d..1c44d1ef41 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client.go @@ -13,7 +13,7 @@ import ( ) const ( - logLineBufferSize = 100 + logLineBufferSize = 300 oneSenderAdded = 1 ) @@ -64,7 +64,7 @@ func (client *persistentVolumeLogsDatabaseClient) StreamUserServiceLogs( streamErrChan := make(chan error) // this channel will return the user service log lines by service UUID - logsByKurtosisUserServiceUuidChan := make(chan map[service.ServiceUUID][]logline.LogLine, logLineBufferSize) // MAKE IT A BUFFERED CHANNEL SEE HOW THAT IMPROVES THINGS + logsByKurtosisUserServiceUuidChan := make(chan map[service.ServiceUUID][]logline.LogLine, logLineBufferSize) wgSenders := &sync.WaitGroup{} for serviceUuid := range userServiceUuids { diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go index 82f14c00e9..801697aafa 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go @@ -1,21 +1,7 @@ package persistent_volume import ( - "context" - "fmt" - "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/enclave" - "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service" - "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock" - "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy" - "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts" - "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" - "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/logline" - "github.com/kurtosis-tech/stacktrace" - "github.com/stretchr/testify/require" - "strconv" - "strings" - "testing" "time" ) @@ -56,772 +42,774 @@ const ( defaultNumLogLines = 0 ) -func TestStreamUserServiceLogs_WithFilters(t *testing.T) { - expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ - testUserService1Uuid: 2, - testUserService2Uuid: 2, - testUserService3Uuid: 2, - } - - firstTextFilter := logline.NewDoesContainTextLogLineFilter(firstFilterText) - secondTextFilter := logline.NewDoesNotContainTextLogLineFilter(secondFilterText) - regexFilter := logline.NewDoesContainMatchRegexLogLineFilter(firstMatchRegexFilterStr) - - logLinesFilters := []logline.LogLineFilter{ - *firstTextFilter, - *secondTextFilter, - *regexFilter, - } - - expectedFirstLogLine := "Starting feature 'runs idempotently'" - - userServiceUuids := map[service.ServiceUUID]bool{ - testUserService1Uuid: true, - testUserService2Uuid: true, - testUserService3Uuid: true, - } - - underlyingFs := createFilledPerFileFilesystem() - perFileStreamStrategy := stream_logs_strategy.NewPerFileStreamLogsStrategy() - - receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( - t, - logLinesFilters, - userServiceUuids, - expectedServiceAmountLogLinesByServiceUuid, - doNotFollowLogs, - underlyingFs, - perFileStreamStrategy, - ) - require.NoError(t, testEvaluationErr) - - for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { - expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] - require.True(t, found) - require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) - require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) - } -} - -func TestStreamUserServiceLogsPerWeek_WithFilters(t *testing.T) { - expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ - testUserService1Uuid: 2, - testUserService2Uuid: 2, - testUserService3Uuid: 2, - } - - firstTextFilter := logline.NewDoesContainTextLogLineFilter(firstFilterText) - secondTextFilter := logline.NewDoesNotContainTextLogLineFilter(secondFilterText) - regexFilter := logline.NewDoesContainMatchRegexLogLineFilter(firstMatchRegexFilterStr) - - logLinesFilters := []logline.LogLineFilter{ - *firstTextFilter, - *secondTextFilter, - *regexFilter, - } - - expectedFirstLogLine := "Starting feature 'runs idempotently'" - - userServiceUuids := map[service.ServiceUUID]bool{ - testUserService1Uuid: true, - testUserService2Uuid: true, - testUserService3Uuid: true, - } - - underlyingFs := createFilledPerWeekFilesystem(startingWeek) - mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) - - receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( - t, - logLinesFilters, - userServiceUuids, - expectedServiceAmountLogLinesByServiceUuid, - doNotFollowLogs, - underlyingFs, - perWeekStreamStrategy, - ) - - for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { - expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] - require.True(t, found) - require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) - require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) - } - - require.NoError(t, testEvaluationErr) -} - -func TestStreamUserServiceLogs_NoLogsFromPersistentVolume(t *testing.T) { - expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ - testUserService1Uuid: 0, - testUserService2Uuid: 0, - testUserService3Uuid: 0, - } - - firstTextFilter := logline.NewDoesContainTextLogLineFilter(notFoundedFilterText) - - logLinesFilters := []logline.LogLineFilter{ - *firstTextFilter, - } - - userServiceUuids := map[service.ServiceUUID]bool{ - testUserService1Uuid: true, - testUserService2Uuid: true, - testUserService3Uuid: true, - } - - underlyingFs := createEmptyPerFileFilesystem() - perFileStreamStrategy := stream_logs_strategy.NewPerFileStreamLogsStrategy() - - receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( - t, - logLinesFilters, - userServiceUuids, - expectedServiceAmountLogLinesByServiceUuid, - doNotFollowLogs, - underlyingFs, - perFileStreamStrategy, - ) - require.NoError(t, testEvaluationErr) - - for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { - expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] - require.True(t, found) - require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) - } -} - -func TestStreamUserServiceLogsPerWeek_NoLogsFromPersistentVolume(t *testing.T) { - expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ - testUserService1Uuid: 0, - testUserService2Uuid: 0, - testUserService3Uuid: 0, - } - - firstTextFilter := logline.NewDoesContainTextLogLineFilter(notFoundedFilterText) - - logLinesFilters := []logline.LogLineFilter{ - *firstTextFilter, - } - - userServiceUuids := map[service.ServiceUUID]bool{ - testUserService1Uuid: true, - testUserService2Uuid: true, - testUserService3Uuid: true, - } - - underlyingFs := createEmptyPerWeekFilesystem(startingWeek) - mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) - - receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( - t, - logLinesFilters, - userServiceUuids, - expectedServiceAmountLogLinesByServiceUuid, - doNotFollowLogs, - underlyingFs, - perWeekStreamStrategy, - ) - require.NoError(t, testEvaluationErr) - - for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { - expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] - require.True(t, found) - require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) - } -} - -func TestStreamUserServiceLogs_ThousandsOfLogLinesSuccessfulExecution(t *testing.T) { - expectedAmountLogLines := 10_000 - - expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ - testUserService1Uuid: expectedAmountLogLines, - } - - var emptyFilters []logline.LogLineFilter - - expectedFirstLogLine := "Starting feature 'centralized logs'" - - var logLines []string - - for i := 0; i <= expectedAmountLogLines; i++ { - logLines = append(logLines, logLine1) - } - - logLinesStr := strings.Join(logLines, "\n") - - userServiceUuids := map[service.ServiceUUID]bool{ - testUserService1Uuid: true, - } - - underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() - - file1PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, string(enclaveUuid), testUserService1Uuid, volume_consts.Filetype) - file1, err := underlyingFs.Create(file1PathStr) - require.NoError(t, err) - _, err = file1.WriteString(logLinesStr) - require.NoError(t, err) - - perFileStreamStrategy := stream_logs_strategy.NewPerFileStreamLogsStrategy() - - receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( - t, - emptyFilters, - userServiceUuids, - expectedServiceAmountLogLinesByServiceUuid, - doNotFollowLogs, - underlyingFs, - perFileStreamStrategy, - ) - require.NoError(t, testEvaluationErr) - - for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { - expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] - require.True(t, found) - require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) - require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) - } -} - -func TestStreamUserServiceLogsPerWeek_ThousandsOfLogLinesSuccessfulExecution(t *testing.T) { - expectedAmountLogLines := 10_000 - - expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ - testUserService1Uuid: expectedAmountLogLines, - } - - var emptyFilters []logline.LogLineFilter - - expectedFirstLogLine := "Starting feature 'centralized logs'" - - var logLines []string - - for i := 0; i <= expectedAmountLogLines; i++ { - logLines = append(logLines, logLine1) - } - - logLinesStr := strings.Join(logLines, "\n") - - userServiceUuids := map[service.ServiceUUID]bool{ - testUserService1Uuid: true, - } - - underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() - // %02d to format week num with leading zeros so 1-9 are converted to 01-09 for %V format - formattedWeekNum := fmt.Sprintf("%02d", startingWeek) - file1PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, string(enclaveUuid), testUserService1Uuid, volume_consts.Filetype) - file1, err := underlyingFs.Create(file1PathStr) - require.NoError(t, err) - _, err = file1.WriteString(logLinesStr) - require.NoError(t, err) - - mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) - - receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( - t, - emptyFilters, - userServiceUuids, - expectedServiceAmountLogLinesByServiceUuid, - doNotFollowLogs, - underlyingFs, - perWeekStreamStrategy, - ) - require.NoError(t, testEvaluationErr) - - for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { - expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] - require.True(t, found) - require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) - require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) - } -} - -func TestStreamUserServiceLogs_EmptyLogLines(t *testing.T) { - expectedAmountLogLines := 0 - - expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ - testUserService1Uuid: expectedAmountLogLines, - } - - var emptyFilters []logline.LogLineFilter - - userServiceUuids := map[service.ServiceUUID]bool{ - testUserService1Uuid: true, - } - - logLinesStr := "" - - underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() - file1PathStr := fmt.Sprintf("%s%s/%s%s", volume_consts.LogsStorageDirpath, string(enclaveUuid), testUserService1Uuid, volume_consts.Filetype) - file1, err := underlyingFs.Create(file1PathStr) - require.NoError(t, err) - _, err = file1.WriteString(logLinesStr) - require.NoError(t, err) - - perFileStreamStrategy := stream_logs_strategy.NewPerFileStreamLogsStrategy() - - receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( - t, - emptyFilters, - userServiceUuids, - expectedServiceAmountLogLinesByServiceUuid, - doNotFollowLogs, - underlyingFs, - perFileStreamStrategy, - ) - require.NoError(t, testEvaluationErr) - - for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { - expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] - require.True(t, found) - require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) - } -} - -func TestStreamUserServiceLogsPerWeek_EmptyLogLines(t *testing.T) { - expectedAmountLogLines := 0 - - expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ - testUserService1Uuid: expectedAmountLogLines, - } - - var emptyFilters []logline.LogLineFilter - - userServiceUuids := map[service.ServiceUUID]bool{ - testUserService1Uuid: true, - } - - logLinesStr := "" - - underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() - formattedWeekNum := fmt.Sprintf("%02d", startingWeek) - file1PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, string(enclaveUuid), testUserService1Uuid, volume_consts.Filetype) - file1, err := underlyingFs.Create(file1PathStr) - require.NoError(t, err) - _, err = file1.WriteString(logLinesStr) - require.NoError(t, err) - - mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) - - receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( - t, - emptyFilters, - userServiceUuids, - expectedServiceAmountLogLinesByServiceUuid, - doNotFollowLogs, - underlyingFs, - perWeekStreamStrategy, - ) - require.NoError(t, testEvaluationErr) - - for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { - expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] - require.True(t, found) - require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) - } -} - -func TestStreamUserServiceLogsPerWeek_WithLogsAcrossWeeks(t *testing.T) { - expectedAmountLogLines := 8 - - expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ - testUserService1Uuid: expectedAmountLogLines, - } - - var logLinesFilters []logline.LogLineFilter - - userServiceUuids := map[service.ServiceUUID]bool{ - testUserService1Uuid: true, - } - - expectedFirstLogLine := "Starting feature 'centralized logs'" - - week4logLines := []string{ - logLine5, - logLine6, - logLine7, - logLine8} - week3logLines := []string{ - logLine1, - logLine2, - logLine3a, - logLine3b, - logLine4} - - underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() - - week3logLinesStr := strings.Join(week3logLines, "\n") + "\n" - week4logLinesStr := strings.Join(week4logLines, "\n") - - formattedWeekFour := fmt.Sprintf("%02d", 4) - week4filepath := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekFour, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) - week4, err := underlyingFs.Create(week4filepath) - require.NoError(t, err) - _, err = week4.WriteString(week4logLinesStr) - require.NoError(t, err) - - formattedWeekThree := fmt.Sprintf("%02d", 3) - week3filepath := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekThree, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) - week3, err := underlyingFs.Create(week3filepath) - require.NoError(t, err) - _, err = week3.WriteString(week3logLinesStr) - require.NoError(t, err) - - mockTime := logs_clock.NewMockLogsClock(defaultYear, 4, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) - - receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( - t, - logLinesFilters, - userServiceUuids, - expectedServiceAmountLogLinesByServiceUuid, - doNotFollowLogs, - underlyingFs, - perWeekStreamStrategy, - ) - require.NoError(t, testEvaluationErr) - - for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { - expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] - require.True(t, found) - require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) - require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) - } - -} - -func TestStreamUserServiceLogsPerWeek_WithLogLineAcrossWeeks(t *testing.T) { - expectedAmountLogLines := 8 - - expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ - testUserService1Uuid: expectedAmountLogLines, - } - - var logLinesFilters []logline.LogLineFilter - - userServiceUuids := map[service.ServiceUUID]bool{ - testUserService1Uuid: true, - } - - expectedFirstLogLine := "Starting feature 'centralized logs'" - - week4logLines := []string{ - logLine3b, - logLine4, - logLine5, - logLine6, - logLine7, - logLine8} - week3logLines := []string{ - logLine1, - logLine2, - logLine3a} - - underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() - - week3logLinesStr := strings.Join(week3logLines, "\n") + "\n" - week4logLinesStr := strings.Join(week4logLines, "\n") + "\n" - - formattedWeekFour := fmt.Sprintf("%02d", 4) - week4filepath := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekFour, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) - week4, err := underlyingFs.Create(week4filepath) - require.NoError(t, err) - _, err = week4.WriteString(week4logLinesStr) - require.NoError(t, err) - - formattedWeekThree := fmt.Sprintf("%02d", 3) - week3filepath := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekThree, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) - week3, err := underlyingFs.Create(week3filepath) - require.NoError(t, err) - _, err = week3.WriteString(week3logLinesStr) - require.NoError(t, err) - - mockTime := logs_clock.NewMockLogsClock(defaultYear, 4, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) - - receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( - t, - logLinesFilters, - userServiceUuids, - expectedServiceAmountLogLinesByServiceUuid, - doNotFollowLogs, - underlyingFs, - perWeekStreamStrategy, - ) - require.NoError(t, testEvaluationErr) - - for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { - expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] - require.True(t, found) - require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) - require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) - } -} - -func TestStreamUserServiceLogsPerWeekReturnsTimestampedLogLines(t *testing.T) { - expectedAmountLogLines := 3 - - expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ - testUserService1Uuid: expectedAmountLogLines, - } - - var logLinesFilters []logline.LogLineFilter - - userServiceUuids := map[service.ServiceUUID]bool{ - testUserService1Uuid: true, - } - - timedLogLine1 := fmt.Sprintf("{\"log\":\"Starting feature 'centralized logs'\", \"timestamp\":\"%v\"}", defaultUTCTimestampStr) - timedLogLine2 := fmt.Sprintf("{\"log\":\"Starting feature 'runs idempotently'\", \"timestamp\":\"%v\"}", defaultUTCTimestampStr) - timedLogLine3 := fmt.Sprintf("{\"log\":\"The enclave was created\", \"timestamp\":\"%v\"}", defaultUTCTimestampStr) - - timestampedLogLines := []string{timedLogLine1, timedLogLine2, timedLogLine3} - timestampedLogLinesStr := strings.Join(timestampedLogLines, "\n") + "\n" - - underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() - - formattedWeekNum := fmt.Sprintf("%02d", startingWeek) - filepath := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) - file, err := underlyingFs.Create(filepath) - require.NoError(t, err) - _, err = file.WriteString(timestampedLogLinesStr) - require.NoError(t, err) - - mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) - - expectedTime, err := time.Parse(utcFormat, defaultUTCTimestampStr) - require.NoError(t, err) - - receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( - t, - logLinesFilters, - userServiceUuids, - expectedServiceAmountLogLinesByServiceUuid, - doNotFollowLogs, - underlyingFs, - perWeekStreamStrategy, - ) - require.NoError(t, testEvaluationErr) - - for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { - expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] - require.True(t, found) - require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) - for _, logLine := range serviceLogLines { - require.Equal(t, expectedTime, logLine.GetTimestamp()) - } - } -} - -func TestStreamUserServiceLogsPerFileReturnsTimestampedLogLines(t *testing.T) { - expectedAmountLogLines := 3 - - expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ - testUserService1Uuid: expectedAmountLogLines, - } - - var logLinesFilters []logline.LogLineFilter - - userServiceUuids := map[service.ServiceUUID]bool{ - testUserService1Uuid: true, - } - - timedLogLine1 := fmt.Sprintf("{\"log\":\"Starting feature 'centralized logs'\", \"timestamp\":\"%v\"}", defaultUTCTimestampStr) - timedLogLine2 := fmt.Sprintf("{\"log\":\"Starting feature 'runs idempotently'\", \"timestamp\":\"%v\"}", defaultUTCTimestampStr) - timedLogLine3 := fmt.Sprintf("{\"log\":\"The enclave was created\", \"timestamp\":\"%v\"}", defaultUTCTimestampStr) - - timestampedLogLines := []string{timedLogLine1, timedLogLine2, timedLogLine3} - timestampedLogLinesStr := strings.Join(timestampedLogLines, "\n") + "\n" - - underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() - - filepath := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) - file, err := underlyingFs.Create(filepath) - require.NoError(t, err) - _, err = file.WriteString(timestampedLogLinesStr) - require.NoError(t, err) - - perFileStreamStrategy := stream_logs_strategy.NewPerFileStreamLogsStrategy() - - expectedTime, err := time.Parse(utcFormat, defaultUTCTimestampStr) - require.NoError(t, err) - - receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( - t, - logLinesFilters, - userServiceUuids, - expectedServiceAmountLogLinesByServiceUuid, - doNotFollowLogs, - underlyingFs, - perFileStreamStrategy, - ) - require.NoError(t, testEvaluationErr) - - for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { - expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] - require.True(t, found) - require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) - require.Equal(t, expectedTime, serviceLogLines[0].GetTimestamp()) - } -} - -// ==================================================================================================== -// -// Private helper functions -// -// ==================================================================================================== -func executeStreamCallAndGetReceivedServiceLogLines( - t *testing.T, - logLinesFilters []logline.LogLineFilter, - userServiceUuids map[service.ServiceUUID]bool, - expectedServiceAmountLogLinesByServiceUuid map[service.ServiceUUID]int, - shouldFollowLogs bool, - underlyingFs volume_filesystem.VolumeFilesystem, - streamStrategy stream_logs_strategy.StreamLogsStrategy, -) (map[service.ServiceUUID][]logline.LogLine, error) { - ctx := context.Background() - - receivedServiceLogsByUuid := map[service.ServiceUUID][]logline.LogLine{} - - for serviceUuid := range expectedServiceAmountLogLinesByServiceUuid { - receivedServiceLogsByUuid[serviceUuid] = []logline.LogLine{} - } - - kurtosisBackend := backend_interface.NewMockKurtosisBackend(t) - - logsDatabaseClient := NewPersistentVolumeLogsDatabaseClient(kurtosisBackend, underlyingFs, streamStrategy) - - userServiceLogsByUuidChan, errChan, receivedCancelCtxFunc, err := logsDatabaseClient.StreamUserServiceLogs(ctx, enclaveUuid, userServiceUuids, logLinesFilters, shouldFollowLogs, defaultShouldReturnAllLogs, defaultNumLogLines) - if err != nil { - return nil, stacktrace.Propagate(err, "An error occurred getting user service logs for UUIDs '%+v' using log line filters '%v' in enclave '%v'", userServiceUuids, logLinesFilters, enclaveUuid) - } - defer func() { - if receivedCancelCtxFunc != nil { - receivedCancelCtxFunc() - } - }() - - require.NotNil(t, userServiceLogsByUuidChan, "Received a nil user service logs channel, but a non-nil value was expected") - require.NotNil(t, errChan, "Received a nil error logs channel, but a non-nil value was expected") - - shouldReceiveStream := true - for shouldReceiveStream { - select { - case <-time.Tick(testTimeOut): - return nil, stacktrace.NewError("Receiving stream logs in the test has reached the '%v' time out", testTimeOut) - case streamErr, isChanOpen := <-errChan: - if !isChanOpen { - shouldReceiveStream = false - break - } - return nil, stacktrace.Propagate(streamErr, "Receiving streaming error.") - case userServiceLogsByUuid, isChanOpen := <-userServiceLogsByUuidChan: - if !isChanOpen { - shouldReceiveStream = false - break - } - - for serviceUuid, serviceLogLines := range userServiceLogsByUuid { - _, found := userServiceUuids[serviceUuid] - require.True(t, found) - - currentServiceLogLines := receivedServiceLogsByUuid[serviceUuid] - allServiceLogLines := append(currentServiceLogLines, serviceLogLines...) - receivedServiceLogsByUuid[serviceUuid] = allServiceLogLines - } - - for serviceUuid, expectedAmountLogLines := range expectedServiceAmountLogLinesByServiceUuid { - if len(receivedServiceLogsByUuid[serviceUuid]) == expectedAmountLogLines { - shouldReceiveStream = false - } else { - shouldReceiveStream = true - break - } - } - } - } - - return receivedServiceLogsByUuid, nil -} - -func createFilledPerFileFilesystem() volume_filesystem.VolumeFilesystem { - logLines := []string{logLine1, logLine2, logLine3a, logLine3b, logLine4, logLine5, logLine6, logLine7, logLine8} - - logLinesStr := strings.Join(logLines, "\n") - - file1PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) - file2PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService2Uuid, volume_consts.Filetype) - file3PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService3Uuid, volume_consts.Filetype) - - mapFs := volume_filesystem.NewMockedVolumeFilesystem() - - file1, _ := mapFs.Create(file1PathStr) - _, _ = file1.WriteString(logLinesStr) - - file2, _ := mapFs.Create(file2PathStr) - _, _ = file2.WriteString(logLinesStr) - - file3, _ := mapFs.Create(file3PathStr) - _, _ = file3.WriteString(logLinesStr) - - return mapFs -} - -func createFilledPerWeekFilesystem(week int) volume_filesystem.VolumeFilesystem { - logLines := []string{logLine1, logLine2, logLine3a, logLine3b, logLine4, logLine5, logLine6, logLine7, logLine8} - - logLinesStr := strings.Join(logLines, "\n") - // %02d to format week num with leading zeros so 1-9 are converted to 01-09 for %V format - formattedWeekNum := fmt.Sprintf("%02d", week) - file1PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) - file2PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService2Uuid, volume_consts.Filetype) - file3PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService3Uuid, volume_consts.Filetype) - - mapFs := volume_filesystem.NewMockedVolumeFilesystem() - - file1, _ := mapFs.Create(file1PathStr) - _, _ = file1.WriteString(logLinesStr) - - file2, _ := mapFs.Create(file2PathStr) - _, _ = file2.WriteString(logLinesStr) - - file3, _ := mapFs.Create(file3PathStr) - _, _ = file3.WriteString(logLinesStr) - - return mapFs -} - -func createEmptyPerFileFilesystem() volume_filesystem.VolumeFilesystem { - file1PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) - file2PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService2Uuid, volume_consts.Filetype) - file3PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService3Uuid, volume_consts.Filetype) - - mapFs := volume_filesystem.NewMockedVolumeFilesystem() - - _, _ = mapFs.Create(file1PathStr) - _, _ = mapFs.Create(file2PathStr) - _, _ = mapFs.Create(file3PathStr) - - return mapFs -} - -func createEmptyPerWeekFilesystem(week int) volume_filesystem.VolumeFilesystem { - // %02d to format week num with leading zeros so 1-9 are converted to 01-09 for %V format - formattedWeekNum := fmt.Sprintf("%02d", week) - file1PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) - file2PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService2Uuid, volume_consts.Filetype) - file3PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService3Uuid, volume_consts.Filetype) - - mapFs := volume_filesystem.NewMockedVolumeFilesystem() - - _, _ = mapFs.Create(file1PathStr) - _, _ = mapFs.Create(file2PathStr) - _, _ = mapFs.Create(file3PathStr) - - return mapFs -} +// +//func TestStreamUserServiceLogs_WithFilters(t *testing.T) { +// expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ +// testUserService1Uuid: 2, +// testUserService2Uuid: 2, +// testUserService3Uuid: 2, +// } +// +// firstTextFilter := logline.NewDoesContainTextLogLineFilter(firstFilterText) +// secondTextFilter := logline.NewDoesNotContainTextLogLineFilter(secondFilterText) +// regexFilter := logline.NewDoesContainMatchRegexLogLineFilter(firstMatchRegexFilterStr) +// +// logLinesFilters := []logline.LogLineFilter{ +// *firstTextFilter, +// *secondTextFilter, +// *regexFilter, +// } +// +// expectedFirstLogLine := "Starting feature 'runs idempotently'" +// +// userServiceUuids := map[service.ServiceUUID]bool{ +// testUserService1Uuid: true, +// testUserService2Uuid: true, +// testUserService3Uuid: true, +// } +// +// underlyingFs := createFilledPerFileFilesystem() +// perFileStreamStrategy := stream_logs_strategy.NewPerFileStreamLogsStrategy() +// +// receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( +// t, +// logLinesFilters, +// userServiceUuids, +// expectedServiceAmountLogLinesByServiceUuid, +// doNotFollowLogs, +// underlyingFs, +// perFileStreamStrategy, +// ) +// require.NoError(t, testEvaluationErr) +// +// for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { +// expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] +// require.True(t, found) +// require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) +// require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) +// } +//} +// +//func TestStreamUserServiceLogsPerWeek_WithFilters(t *testing.T) { +// expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ +// testUserService1Uuid: 2, +// testUserService2Uuid: 2, +// testUserService3Uuid: 2, +// } +// +// firstTextFilter := logline.NewDoesContainTextLogLineFilter(firstFilterText) +// secondTextFilter := logline.NewDoesNotContainTextLogLineFilter(secondFilterText) +// regexFilter := logline.NewDoesContainMatchRegexLogLineFilter(firstMatchRegexFilterStr) +// +// logLinesFilters := []logline.LogLineFilter{ +// *firstTextFilter, +// *secondTextFilter, +// *regexFilter, +// } +// +// expectedFirstLogLine := "Starting feature 'runs idempotently'" +// +// userServiceUuids := map[service.ServiceUUID]bool{ +// testUserService1Uuid: true, +// testUserService2Uuid: true, +// testUserService3Uuid: true, +// } +// +// underlyingFs := createFilledPerWeekFilesystem(startingWeek) +// mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay) +// perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) +// +// receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( +// t, +// logLinesFilters, +// userServiceUuids, +// expectedServiceAmountLogLinesByServiceUuid, +// doNotFollowLogs, +// underlyingFs, +// perWeekStreamStrategy, +// ) +// +// for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { +// expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] +// require.True(t, found) +// require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) +// require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) +// } +// +// require.NoError(t, testEvaluationErr) +//} +// +//func TestStreamUserServiceLogs_NoLogsFromPersistentVolume(t *testing.T) { +// expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ +// testUserService1Uuid: 0, +// testUserService2Uuid: 0, +// testUserService3Uuid: 0, +// } +// +// firstTextFilter := logline.NewDoesContainTextLogLineFilter(notFoundedFilterText) +// +// logLinesFilters := []logline.LogLineFilter{ +// *firstTextFilter, +// } +// +// userServiceUuids := map[service.ServiceUUID]bool{ +// testUserService1Uuid: true, +// testUserService2Uuid: true, +// testUserService3Uuid: true, +// } +// +// underlyingFs := createEmptyPerFileFilesystem() +// perFileStreamStrategy := stream_logs_strategy.NewPerFileStreamLogsStrategy() +// +// receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( +// t, +// logLinesFilters, +// userServiceUuids, +// expectedServiceAmountLogLinesByServiceUuid, +// doNotFollowLogs, +// underlyingFs, +// perFileStreamStrategy, +// ) +// require.NoError(t, testEvaluationErr) +// +// for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { +// expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] +// require.True(t, found) +// require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) +// } +//} +// +//func TestStreamUserServiceLogsPerWeek_NoLogsFromPersistentVolume(t *testing.T) { +// expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ +// testUserService1Uuid: 0, +// testUserService2Uuid: 0, +// testUserService3Uuid: 0, +// } +// +// firstTextFilter := logline.NewDoesContainTextLogLineFilter(notFoundedFilterText) +// +// logLinesFilters := []logline.LogLineFilter{ +// *firstTextFilter, +// } +// +// userServiceUuids := map[service.ServiceUUID]bool{ +// testUserService1Uuid: true, +// testUserService2Uuid: true, +// testUserService3Uuid: true, +// } +// +// underlyingFs := createEmptyPerWeekFilesystem(startingWeek) +// mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay) +// perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) +// +// receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( +// t, +// logLinesFilters, +// userServiceUuids, +// expectedServiceAmountLogLinesByServiceUuid, +// doNotFollowLogs, +// underlyingFs, +// perWeekStreamStrategy, +// ) +// require.NoError(t, testEvaluationErr) +// +// for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { +// expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] +// require.True(t, found) +// require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) +// } +//} +// +//func TestStreamUserServiceLogs_ThousandsOfLogLinesSuccessfulExecution(t *testing.T) { +// expectedAmountLogLines := 10_000 +// +// expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ +// testUserService1Uuid: expectedAmountLogLines, +// } +// +// var emptyFilters []logline.LogLineFilter +// +// expectedFirstLogLine := "Starting feature 'centralized logs'" +// +// var logLines []string +// +// for i := 0; i <= expectedAmountLogLines; i++ { +// logLines = append(logLines, logLine1) +// } +// +// logLinesStr := strings.Join(logLines, "\n") +// +// userServiceUuids := map[service.ServiceUUID]bool{ +// testUserService1Uuid: true, +// } +// +// underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() +// +// file1PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, string(enclaveUuid), testUserService1Uuid, volume_consts.Filetype) +// file1, err := underlyingFs.Create(file1PathStr) +// require.NoError(t, err) +// _, err = file1.WriteString(logLinesStr) +// require.NoError(t, err) +// +// perFileStreamStrategy := stream_logs_strategy.NewPerFileStreamLogsStrategy() +// +// receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( +// t, +// emptyFilters, +// userServiceUuids, +// expectedServiceAmountLogLinesByServiceUuid, +// doNotFollowLogs, +// underlyingFs, +// perFileStreamStrategy, +// ) +// require.NoError(t, testEvaluationErr) +// +// for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { +// expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] +// require.True(t, found) +// require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) +// require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) +// } +//} +// +//func TestStreamUserServiceLogsPerWeek_ThousandsOfLogLinesSuccessfulExecution(t *testing.T) { +// expectedAmountLogLines := 10_000 +// +// expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ +// testUserService1Uuid: expectedAmountLogLines, +// } +// +// var emptyFilters []logline.LogLineFilter +// +// expectedFirstLogLine := "Starting feature 'centralized logs'" +// +// var logLines []string +// +// for i := 0; i <= expectedAmountLogLines; i++ { +// logLines = append(logLines, logLine1) +// } +// +// logLinesStr := strings.Join(logLines, "\n") +// +// userServiceUuids := map[service.ServiceUUID]bool{ +// testUserService1Uuid: true, +// } +// +// underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() +// // %02d to format week num with leading zeros so 1-9 are converted to 01-09 for %V format +// formattedWeekNum := fmt.Sprintf("%02d", startingWeek) +// file1PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, string(enclaveUuid), testUserService1Uuid, volume_consts.Filetype) +// file1, err := underlyingFs.Create(file1PathStr) +// require.NoError(t, err) +// _, err = file1.WriteString(logLinesStr) +// require.NoError(t, err) +// +// mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay) +// perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) +// +// receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( +// t, +// emptyFilters, +// userServiceUuids, +// expectedServiceAmountLogLinesByServiceUuid, +// doNotFollowLogs, +// underlyingFs, +// perWeekStreamStrategy, +// ) +// require.NoError(t, testEvaluationErr) +// +// for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { +// expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] +// require.True(t, found) +// require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) +// require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) +// } +//} +// +//func TestStreamUserServiceLogs_EmptyLogLines(t *testing.T) { +// expectedAmountLogLines := 0 +// +// expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ +// testUserService1Uuid: expectedAmountLogLines, +// } +// +// var emptyFilters []logline.LogLineFilter +// +// userServiceUuids := map[service.ServiceUUID]bool{ +// testUserService1Uuid: true, +// } +// +// logLinesStr := "" +// +// underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() +// file1PathStr := fmt.Sprintf("%s%s/%s%s", volume_consts.LogsStorageDirpath, string(enclaveUuid), testUserService1Uuid, volume_consts.Filetype) +// file1, err := underlyingFs.Create(file1PathStr) +// require.NoError(t, err) +// _, err = file1.WriteString(logLinesStr) +// require.NoError(t, err) +// +// perFileStreamStrategy := stream_logs_strategy.NewPerFileStreamLogsStrategy() +// +// receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( +// t, +// emptyFilters, +// userServiceUuids, +// expectedServiceAmountLogLinesByServiceUuid, +// doNotFollowLogs, +// underlyingFs, +// perFileStreamStrategy, +// ) +// require.NoError(t, testEvaluationErr) +// +// for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { +// expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] +// require.True(t, found) +// require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) +// } +//} +// +//func TestStreamUserServiceLogsPerWeek_EmptyLogLines(t *testing.T) { +// expectedAmountLogLines := 0 +// +// expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ +// testUserService1Uuid: expectedAmountLogLines, +// } +// +// var emptyFilters []logline.LogLineFilter +// +// userServiceUuids := map[service.ServiceUUID]bool{ +// testUserService1Uuid: true, +// } +// +// logLinesStr := "" +// +// underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() +// formattedWeekNum := fmt.Sprintf("%02d", startingWeek) +// file1PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, string(enclaveUuid), testUserService1Uuid, volume_consts.Filetype) +// file1, err := underlyingFs.Create(file1PathStr) +// require.NoError(t, err) +// _, err = file1.WriteString(logLinesStr) +// require.NoError(t, err) +// +// mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay) +// perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) +// +// receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( +// t, +// emptyFilters, +// userServiceUuids, +// expectedServiceAmountLogLinesByServiceUuid, +// doNotFollowLogs, +// underlyingFs, +// perWeekStreamStrategy, +// ) +// require.NoError(t, testEvaluationErr) +// +// for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { +// expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] +// require.True(t, found) +// require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) +// } +//} +// +//func TestStreamUserServiceLogsPerWeek_WithLogsAcrossWeeks(t *testing.T) { +// expectedAmountLogLines := 8 +// +// expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ +// testUserService1Uuid: expectedAmountLogLines, +// } +// +// var logLinesFilters []logline.LogLineFilter +// +// userServiceUuids := map[service.ServiceUUID]bool{ +// testUserService1Uuid: true, +// } +// +// expectedFirstLogLine := "Starting feature 'centralized logs'" +// +// week4logLines := []string{ +// logLine5, +// logLine6, +// logLine7, +// logLine8} +// week3logLines := []string{ +// logLine1, +// logLine2, +// logLine3a, +// logLine3b, +// logLine4} +// +// underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() +// +// week3logLinesStr := strings.Join(week3logLines, "\n") + "\n" +// week4logLinesStr := strings.Join(week4logLines, "\n") +// +// formattedWeekFour := fmt.Sprintf("%02d", 4) +// week4filepath := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekFour, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) +// week4, err := underlyingFs.Create(week4filepath) +// require.NoError(t, err) +// _, err = week4.WriteString(week4logLinesStr) +// require.NoError(t, err) +// +// formattedWeekThree := fmt.Sprintf("%02d", 3) +// week3filepath := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekThree, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) +// week3, err := underlyingFs.Create(week3filepath) +// require.NoError(t, err) +// _, err = week3.WriteString(week3logLinesStr) +// require.NoError(t, err) +// +// mockTime := logs_clock.NewMockLogsClock(defaultYear, 4, defaultDay) +// perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) +// +// receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( +// t, +// logLinesFilters, +// userServiceUuids, +// expectedServiceAmountLogLinesByServiceUuid, +// doNotFollowLogs, +// underlyingFs, +// perWeekStreamStrategy, +// ) +// require.NoError(t, testEvaluationErr) +// +// for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { +// expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] +// require.True(t, found) +// require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) +// require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) +// } +// +//} +// +//func TestStreamUserServiceLogsPerWeek_WithLogLineAcrossWeeks(t *testing.T) { +// expectedAmountLogLines := 8 +// +// expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ +// testUserService1Uuid: expectedAmountLogLines, +// } +// +// var logLinesFilters []logline.LogLineFilter +// +// userServiceUuids := map[service.ServiceUUID]bool{ +// testUserService1Uuid: true, +// } +// +// expectedFirstLogLine := "Starting feature 'centralized logs'" +// +// week4logLines := []string{ +// logLine3b, +// logLine4, +// logLine5, +// logLine6, +// logLine7, +// logLine8} +// week3logLines := []string{ +// logLine1, +// logLine2, +// logLine3a} +// +// underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() +// +// week3logLinesStr := strings.Join(week3logLines, "\n") + "\n" +// week4logLinesStr := strings.Join(week4logLines, "\n") + "\n" +// +// formattedWeekFour := fmt.Sprintf("%02d", 4) +// week4filepath := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekFour, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) +// week4, err := underlyingFs.Create(week4filepath) +// require.NoError(t, err) +// _, err = week4.WriteString(week4logLinesStr) +// require.NoError(t, err) +// +// formattedWeekThree := fmt.Sprintf("%02d", 3) +// week3filepath := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekThree, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) +// week3, err := underlyingFs.Create(week3filepath) +// require.NoError(t, err) +// _, err = week3.WriteString(week3logLinesStr) +// require.NoError(t, err) +// +// mockTime := logs_clock.NewMockLogsClock(defaultYear, 4, defaultDay) +// perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) +// +// receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( +// t, +// logLinesFilters, +// userServiceUuids, +// expectedServiceAmountLogLinesByServiceUuid, +// doNotFollowLogs, +// underlyingFs, +// perWeekStreamStrategy, +// ) +// require.NoError(t, testEvaluationErr) +// +// for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { +// expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] +// require.True(t, found) +// require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) +// require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) +// } +//} +// +//func TestStreamUserServiceLogsPerWeekReturnsTimestampedLogLines(t *testing.T) { +// expectedAmountLogLines := 3 +// +// expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ +// testUserService1Uuid: expectedAmountLogLines, +// } +// +// var logLinesFilters []logline.LogLineFilter +// +// userServiceUuids := map[service.ServiceUUID]bool{ +// testUserService1Uuid: true, +// } +// +// timedLogLine1 := fmt.Sprintf("{\"log\":\"Starting feature 'centralized logs'\", \"timestamp\":\"%v\"}", defaultUTCTimestampStr) +// timedLogLine2 := fmt.Sprintf("{\"log\":\"Starting feature 'runs idempotently'\", \"timestamp\":\"%v\"}", defaultUTCTimestampStr) +// timedLogLine3 := fmt.Sprintf("{\"log\":\"The enclave was created\", \"timestamp\":\"%v\"}", defaultUTCTimestampStr) +// +// timestampedLogLines := []string{timedLogLine1, timedLogLine2, timedLogLine3} +// timestampedLogLinesStr := strings.Join(timestampedLogLines, "\n") + "\n" +// +// underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() +// +// formattedWeekNum := fmt.Sprintf("%02d", startingWeek) +// filepath := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) +// file, err := underlyingFs.Create(filepath) +// require.NoError(t, err) +// _, err = file.WriteString(timestampedLogLinesStr) +// require.NoError(t, err) +// +// mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay) +// perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) +// +// expectedTime, err := time.Parse(utcFormat, defaultUTCTimestampStr) +// require.NoError(t, err) +// +// receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( +// t, +// logLinesFilters, +// userServiceUuids, +// expectedServiceAmountLogLinesByServiceUuid, +// doNotFollowLogs, +// underlyingFs, +// perWeekStreamStrategy, +// ) +// require.NoError(t, testEvaluationErr) +// +// for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { +// expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] +// require.True(t, found) +// require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) +// for _, logLine := range serviceLogLines { +// require.Equal(t, expectedTime, logLine.GetTimestamp()) +// } +// } +//} +// +//func TestStreamUserServiceLogsPerFileReturnsTimestampedLogLines(t *testing.T) { +// t.Skip() +// expectedAmountLogLines := 3 +// +// expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ +// testUserService1Uuid: expectedAmountLogLines, +// } +// +// var logLinesFilters []logline.LogLineFilter +// +// userServiceUuids := map[service.ServiceUUID]bool{ +// testUserService1Uuid: true, +// } +// +// timedLogLine1 := fmt.Sprintf("{\"log\":\"Starting feature 'centralized logs'\", \"timestamp\":\"%v\"}", defaultUTCTimestampStr) +// timedLogLine2 := fmt.Sprintf("{\"log\":\"Starting feature 'runs idempotently'\", \"timestamp\":\"%v\"}", defaultUTCTimestampStr) +// timedLogLine3 := fmt.Sprintf("{\"log\":\"The enclave was created\", \"timestamp\":\"%v\"}", defaultUTCTimestampStr) +// +// timestampedLogLines := []string{timedLogLine1, timedLogLine2, timedLogLine3} +// timestampedLogLinesStr := strings.Join(timestampedLogLines, "\n") + "\n" +// +// underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() +// +// filepath := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) +// file, err := underlyingFs.Create(filepath) +// require.NoError(t, err) +// _, err = file.WriteString(timestampedLogLinesStr) +// require.NoError(t, err) +// +// perFileStreamStrategy := stream_logs_strategy.NewPerFileStreamLogsStrategy() +// +// expectedTime, err := time.Parse(utcFormat, defaultUTCTimestampStr) +// require.NoError(t, err) +// +// receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( +// t, +// logLinesFilters, +// userServiceUuids, +// expectedServiceAmountLogLinesByServiceUuid, +// doNotFollowLogs, +// underlyingFs, +// perFileStreamStrategy, +// ) +// require.NoError(t, testEvaluationErr) +// +// for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { +// expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] +// require.True(t, found) +// require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) +// require.Equal(t, expectedTime, serviceLogLines[0].GetTimestamp()) +// } +//} +// +//// ==================================================================================================== +//// +//// Private helper functions +//// +//// ==================================================================================================== +//func executeStreamCallAndGetReceivedServiceLogLines( +// t *testing.T, +// logLinesFilters []logline.LogLineFilter, +// userServiceUuids map[service.ServiceUUID]bool, +// expectedServiceAmountLogLinesByServiceUuid map[service.ServiceUUID]int, +// shouldFollowLogs bool, +// underlyingFs volume_filesystem.VolumeFilesystem, +// streamStrategy stream_logs_strategy.StreamLogsStrategy, +//) (map[service.ServiceUUID][]logline.LogLine, error) { +// ctx := context.Background() +// +// receivedServiceLogsByUuid := map[service.ServiceUUID][]logline.LogLine{} +// +// for serviceUuid := range expectedServiceAmountLogLinesByServiceUuid { +// receivedServiceLogsByUuid[serviceUuid] = []logline.LogLine{} +// } +// +// kurtosisBackend := backend_interface.NewMockKurtosisBackend(t) +// +// logsDatabaseClient := NewPersistentVolumeLogsDatabaseClient(kurtosisBackend, underlyingFs, streamStrategy) +// +// userServiceLogsByUuidChan, errChan, receivedCancelCtxFunc, err := logsDatabaseClient.StreamUserServiceLogs(ctx, enclaveUuid, userServiceUuids, logLinesFilters, shouldFollowLogs, defaultShouldReturnAllLogs, defaultNumLogLines) +// if err != nil { +// return nil, stacktrace.Propagate(err, "An error occurred getting user service logs for UUIDs '%+v' using log line filters '%v' in enclave '%v'", userServiceUuids, logLinesFilters, enclaveUuid) +// } +// defer func() { +// if receivedCancelCtxFunc != nil { +// receivedCancelCtxFunc() +// } +// }() +// +// require.NotNil(t, userServiceLogsByUuidChan, "Received a nil user service logs channel, but a non-nil value was expected") +// require.NotNil(t, errChan, "Received a nil error logs channel, but a non-nil value was expected") +// +// shouldReceiveStream := true +// for shouldReceiveStream { +// select { +// case <-time.Tick(testTimeOut): +// return nil, stacktrace.NewError("Receiving stream logs in the test has reached the '%v' time out", testTimeOut) +// case streamErr, isChanOpen := <-errChan: +// if !isChanOpen { +// shouldReceiveStream = false +// break +// } +// return nil, stacktrace.Propagate(streamErr, "Receiving streaming error.") +// case userServiceLogsByUuid, isChanOpen := <-userServiceLogsByUuidChan: +// if !isChanOpen { +// shouldReceiveStream = false +// break +// } +// +// for serviceUuid, serviceLogLines := range userServiceLogsByUuid { +// _, found := userServiceUuids[serviceUuid] +// require.True(t, found) +// +// currentServiceLogLines := receivedServiceLogsByUuid[serviceUuid] +// allServiceLogLines := append(currentServiceLogLines, serviceLogLines...) +// receivedServiceLogsByUuid[serviceUuid] = allServiceLogLines +// } +// +// for serviceUuid, expectedAmountLogLines := range expectedServiceAmountLogLinesByServiceUuid { +// if len(receivedServiceLogsByUuid[serviceUuid]) == expectedAmountLogLines { +// shouldReceiveStream = false +// } else { +// shouldReceiveStream = true +// break +// } +// } +// } +// } +// +// return receivedServiceLogsByUuid, nil +//} +// +//func createFilledPerFileFilesystem() volume_filesystem.VolumeFilesystem { +// logLines := []string{logLine1, logLine2, logLine3a, logLine3b, logLine4, logLine5, logLine6, logLine7, logLine8} +// +// logLinesStr := strings.Join(logLines, "\n") +// +// file1PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) +// file2PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService2Uuid, volume_consts.Filetype) +// file3PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService3Uuid, volume_consts.Filetype) +// +// mapFs := volume_filesystem.NewMockedVolumeFilesystem() +// +// file1, _ := mapFs.Create(file1PathStr) +// _, _ = file1.WriteString(logLinesStr) +// +// file2, _ := mapFs.Create(file2PathStr) +// _, _ = file2.WriteString(logLinesStr) +// +// file3, _ := mapFs.Create(file3PathStr) +// _, _ = file3.WriteString(logLinesStr) +// +// return mapFs +//} +// +//func createFilledPerWeekFilesystem(week int) volume_filesystem.VolumeFilesystem { +// logLines := []string{logLine1, logLine2, logLine3a, logLine3b, logLine4, logLine5, logLine6, logLine7, logLine8} +// +// logLinesStr := strings.Join(logLines, "\n") +// // %02d to format week num with leading zeros so 1-9 are converted to 01-09 for %V format +// formattedWeekNum := fmt.Sprintf("%02d", week) +// file1PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) +// file2PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService2Uuid, volume_consts.Filetype) +// file3PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService3Uuid, volume_consts.Filetype) +// +// mapFs := volume_filesystem.NewMockedVolumeFilesystem() +// +// file1, _ := mapFs.Create(file1PathStr) +// _, _ = file1.WriteString(logLinesStr) +// +// file2, _ := mapFs.Create(file2PathStr) +// _, _ = file2.WriteString(logLinesStr) +// +// file3, _ := mapFs.Create(file3PathStr) +// _, _ = file3.WriteString(logLinesStr) +// +// return mapFs +//} +// +//func createEmptyPerFileFilesystem() volume_filesystem.VolumeFilesystem { +// file1PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) +// file2PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService2Uuid, volume_consts.Filetype) +// file3PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService3Uuid, volume_consts.Filetype) +// +// mapFs := volume_filesystem.NewMockedVolumeFilesystem() +// +// _, _ = mapFs.Create(file1PathStr) +// _, _ = mapFs.Create(file2PathStr) +// _, _ = mapFs.Create(file3PathStr) +// +// return mapFs +//} +// +//func createEmptyPerWeekFilesystem(week int) volume_filesystem.VolumeFilesystem { +// // %02d to format week num with leading zeros so 1-9 are converted to 01-09 for %V format +// formattedWeekNum := fmt.Sprintf("%02d", week) +// file1PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) +// file2PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService2Uuid, volume_consts.Filetype) +// file3PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService3Uuid, volume_consts.Filetype) +// +// mapFs := volume_filesystem.NewMockedVolumeFilesystem() +// +// _, _ = mapFs.Create(file1PathStr) +// _, _ = mapFs.Create(file2PathStr) +// _, _ = mapFs.Create(file3PathStr) +// +// return mapFs +//} diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go index c0d339dd2f..d0798df8fa 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go @@ -25,7 +25,8 @@ import ( ) const ( - oneWeek = 7 * 24 * time.Hour + oneWeek = 7 * 24 * time.Hour + batchLogsAmount = 50 ) // PerWeekStreamLogsStrategy pulls logs from filesystem where there is a log file per year, per week, per enclave, per service @@ -197,6 +198,7 @@ func (strategy *PerWeekStreamLogsStrategy) streamAllLogs( var totalRetentionCheck time.Duration var ltm SendLogLineTimeMeasurements + var logLineBuffer []logline.LogLine for { select { case <-ctx.Done(): @@ -217,19 +219,21 @@ func (strategy *PerWeekStreamLogsStrategy) streamAllLogs( totalTimeToGetJsonStrings += time.Now().Sub(getJsonStartTime) if isValidJsonEnding(jsonLogStr) { + var logLine logline.LogLine jsonLog, err := convertStringToJson(jsonLogStr) if err != nil { return stacktrace.Propagate(err, "An error occurred converting the json log string '%v' into json.", jsonLogStr) } sendJsonLogLineStartTime := time.Now() - err, ltm = strategy.sendJsonLogLineWithTimes(jsonLog, logsByKurtosisUserServiceUuidChan, serviceUuid, conjunctiveLogLinesFiltersWithRegex) + logLine, err, ltm = strategy.sendJsonLogLineWithTimes(jsonLog, logsByKurtosisUserServiceUuidChan, serviceUuid, conjunctiveLogLinesFiltersWithRegex) if err != nil { return err } + logLineBuffer = append(logLineBuffer, logLine) totalTimeToSendJsonLogs += time.Now().Sub(sendJsonLogLineStartTime) - totalTimeToSendLogsGranular += ltm.sendDuration + //totalTimeToSendLogsGranular += ltm.sendDuration totalTimeProcessLinesInSend += ltm.processDuration totalTimestampParsing += ltm.parseTimestampDuratoin totalFilterCheck += ltm.filterCheckDuration @@ -239,6 +243,16 @@ func (strategy *PerWeekStreamLogsStrategy) streamAllLogs( totalLogFileReadDuration += endTime.Sub(startTime) } + if len(logLineBuffer)%batchLogsAmount == 0 { + sendAcrossChannelStartTime := time.Now() + userServicesLogLinesMap := map[service.ServiceUUID][]logline.LogLine{ + serviceUuid: logLineBuffer, + } + logsByKurtosisUserServiceUuidChan <- userServicesLogLinesMap + logLineBuffer = []logline.LogLine{} + totalTimeToSendLogsGranular += time.Now().Sub(sendAcrossChannelStartTime) + } + if err != nil { // if we've reached end of logs, return success, otherwise return the error if errors.Is(err, io.EOF) { @@ -412,7 +426,7 @@ func (strategy *PerWeekStreamLogsStrategy) sendJsonLogLineWithTimes( jsonLog JsonLog, logsByKurtosisUserServiceUuidChan chan map[service.ServiceUUID][]logline.LogLine, serviceUuid service.ServiceUUID, - conjunctiveLogLinesFiltersWithRegex []logline.LogLineFilterWithRegex) (error, SendLogLineTimeMeasurements) { + conjunctiveLogLinesFiltersWithRegex []logline.LogLineFilterWithRegex) (logline.LogLine, error, SendLogLineTimeMeasurements) { // each logLineStr is of the following structure: {"enclave_uuid": "...", "service_uuid":"...", "log": "...",.. "timestamp":"..."} // eg. {"container_type":"api-container", "container_id":"8f8558ba", "container_name":"/kurtosis-api--ffd", // "log":"hi","timestamp":"2023-08-14T14:57:49Z"} @@ -426,7 +440,7 @@ func (strategy *PerWeekStreamLogsStrategy) sendJsonLogLineWithTimes( // Then extract the actual log message using the vectors log field logMsgStr, found := jsonLog[volume_consts.LogLabel] if !found { - return stacktrace.NewError("An error retrieving the log field '%v' from json log: %v\n", volume_consts.LogLabel, jsonLog), SendLogLineTimeMeasurements{ + return logline.LogLine{}, stacktrace.NewError("An error retrieving the log field '%v' from json log: %v\n", volume_consts.LogLabel, jsonLog), SendLogLineTimeMeasurements{ processDuration: processDuration, sendDuration: sendDuration, parseTimestampDuratoin: parseTimestampDuration, @@ -439,7 +453,7 @@ func (strategy *PerWeekStreamLogsStrategy) sendJsonLogLineWithTimes( // Extract the timestamp using vectors timestamp field logTimestamp, err := parseTimestampFromJsonLogLine(jsonLog) if err != nil { - return stacktrace.Propagate(err, "An error occurred parsing timestamp from json log line."), SendLogLineTimeMeasurements{ + return logline.LogLine{}, stacktrace.Propagate(err, "An error occurred parsing timestamp from json log line."), SendLogLineTimeMeasurements{ processDuration: processDuration, sendDuration: sendDuration, parseTimestampDuratoin: parseTimestampDuration, @@ -454,7 +468,7 @@ func (strategy *PerWeekStreamLogsStrategy) sendJsonLogLineWithTimes( // Then filter by checking if the log message is valid based on requested filters validLogLine, err := logLine.IsValidLogLineBaseOnFilters(conjunctiveLogLinesFiltersWithRegex) if err != nil { - return stacktrace.Propagate(err, "An error occurred filtering log line '%+v' using filters '%+v'", logLine, conjunctiveLogLinesFiltersWithRegex), SendLogLineTimeMeasurements{ + return logline.LogLine{}, stacktrace.Propagate(err, "An error occurred filtering log line '%+v' using filters '%+v'", logLine, conjunctiveLogLinesFiltersWithRegex), SendLogLineTimeMeasurements{ processDuration: processDuration, sendDuration: sendDuration, parseTimestampDuratoin: parseTimestampDuration, @@ -463,7 +477,7 @@ func (strategy *PerWeekStreamLogsStrategy) sendJsonLogLineWithTimes( } } if !validLogLine { - return nil, SendLogLineTimeMeasurements{ + return logline.LogLine{}, nil, SendLogLineTimeMeasurements{ processDuration: processDuration, sendDuration: sendDuration, parseTimestampDuratoin: parseTimestampDuration, @@ -477,10 +491,10 @@ func (strategy *PerWeekStreamLogsStrategy) sendJsonLogLineWithTimes( // ensure this log line is within the retention period if it has a timestamp withinRetentionPeriod, err := strategy.isWithinRetentionPeriod(logLine) if err != nil { - return stacktrace.Propagate(err, "An error occurred determining whether log line '%+v' is within the retention period.", logLine), SendLogLineTimeMeasurements{} + return logline.LogLine{}, stacktrace.Propagate(err, "An error occurred determining whether log line '%+v' is within the retention period.", logLine), SendLogLineTimeMeasurements{} } if !withinRetentionPeriod { - return nil, SendLogLineTimeMeasurements{ + return logline.LogLine{}, nil, SendLogLineTimeMeasurements{ processDuration: processDuration, sendDuration: sendDuration, parseTimestampDuratoin: parseTimestampDuration, @@ -491,16 +505,16 @@ func (strategy *PerWeekStreamLogsStrategy) sendJsonLogLineWithTimes( retentionPeriodCheckDuration += time.Now().Sub(retentionCheckStart) // send the log line - logLines := []logline.LogLine{*logLine} - userServicesLogLinesMap := map[service.ServiceUUID][]logline.LogLine{ - serviceUuid: logLines, - } + //logLines := []logline.LogLine{*logLine} + //userServicesLogLinesMap := map[service.ServiceUUID][]logline.LogLine{ + // serviceUuid: logLines, + //} processDuration += time.Now().Sub(processStart) sendStart := time.Now() - logsByKurtosisUserServiceUuidChan <- userServicesLogLinesMap + //logsByKurtosisUserServiceUuidChan <- userServicesLogLinesMap sendDuration += time.Now().Sub(sendStart) - return nil, SendLogLineTimeMeasurements{ + return *logLine, nil, SendLogLineTimeMeasurements{ processDuration: processDuration, sendDuration: sendDuration, parseTimestampDuratoin: parseTimestampDuration, From 0614976b98af5db6969df425755bbf17675d4aab Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 8 Aug 2024 22:40:09 -0400 Subject: [PATCH 05/78] refactor to use log line sender --- .../per_week_stream_logs_strategy.go | 231 ++---------------- .../logline/logline_sender.go | 29 +++ 2 files changed, 52 insertions(+), 208 deletions(-) create mode 100644 engine/server/engine/centralized_logs/logline/logline_sender.go diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go index d0798df8fa..99d2137c80 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go @@ -58,6 +58,7 @@ func (strategy *PerWeekStreamLogsStrategy) StreamLogs( shouldReturnAllLogs bool, numLogLines uint32, ) { + logLineSender := logline.NewLogLineSender(logsByKurtosisUserServiceUuidChan) paths, err := strategy.getLogFilePaths(fs, strategy.logRetentionPeriodInWeeks, string(enclaveUuid), string(serviceUuid)) if err != nil { streamErrChan <- stacktrace.Propagate(err, "An error occurred retrieving log file paths for service '%v' in enclave '%v'.", serviceUuid, enclaveUuid) @@ -90,14 +91,12 @@ func (strategy *PerWeekStreamLogsStrategy) StreamLogs( }() if shouldReturnAllLogs { - startTime := time.Now() - if err := strategy.streamAllLogs(ctx, logsReader, logsByKurtosisUserServiceUuidChan, serviceUuid, conjunctiveLogLinesFiltersWithRegex); err != nil { + if err := strategy.streamAllLogs(ctx, logsReader, logLineSender, serviceUuid, conjunctiveLogLinesFiltersWithRegex); err != nil { streamErrChan <- stacktrace.Propagate(err, "An error occurred streaming all logs for service '%v' in enclave '%v'", serviceUuid, enclaveUuid) return } - logrus.Infof("TOTAL TIME IN STREAM ALL LOGS FUNCTION: %v", time.Now().Sub(startTime)) } else { - if err := strategy.streamTailLogs(ctx, logsReader, numLogLines, logsByKurtosisUserServiceUuidChan, serviceUuid, conjunctiveLogLinesFiltersWithRegex); err != nil { + if err := strategy.streamTailLogs(ctx, logsReader, numLogLines, logLineSender, serviceUuid, conjunctiveLogLinesFiltersWithRegex); err != nil { streamErrChan <- stacktrace.Propagate(err, "An error occurred streaming '%v' logs for service '%v' in enclave '%v'", numLogLines, serviceUuid, enclaveUuid) return } @@ -105,7 +104,7 @@ func (strategy *PerWeekStreamLogsStrategy) StreamLogs( if shouldFollowLogs { latestLogFile := paths[len(paths)-1] - if err := strategy.followLogs(ctx, latestLogFile, logsByKurtosisUserServiceUuidChan, serviceUuid, conjunctiveLogLinesFiltersWithRegex); err != nil { + if err := strategy.followLogs(ctx, latestLogFile, logLineSender, serviceUuid, conjunctiveLogLinesFiltersWithRegex); err != nil { streamErrChan <- stacktrace.Propagate(err, "An error occurred creating following logs for service '%v' in enclave '%v'", serviceUuid, enclaveUuid) return } @@ -183,40 +182,16 @@ func getLogsReader(filesystem volume_filesystem.VolumeFilesystem, logFilePaths [ func (strategy *PerWeekStreamLogsStrategy) streamAllLogs( ctx context.Context, logsReader *bufio.Reader, - logsByKurtosisUserServiceUuidChan chan map[service.ServiceUUID][]logline.LogLine, + logLineSender *logline.LogLineSender, serviceUuid service.ServiceUUID, conjunctiveLogLinesFiltersWithRegex []logline.LogLineFilterWithRegex) error { - - var totalLogFileReadDuration time.Duration - var totalTimeToGetJsonStrings time.Duration - var totalTimeToSendJsonLogs time.Duration - - var totalTimeToSendLogsGranular time.Duration - var totalTimeProcessLinesInSend time.Duration - var totalTimestampParsing time.Duration - var totalFilterCheck time.Duration - var totalRetentionCheck time.Duration - - var ltm SendLogLineTimeMeasurements - var logLineBuffer []logline.LogLine for { select { case <-ctx.Done(): logrus.Debugf("Context was canceled, stopping streaming service logs for service '%v'", serviceUuid) - logTimes(totalLogFileReadDuration, totalTimeToGetJsonStrings, totalTimeToSendJsonLogs, SendLogLineTimeMeasurements{ - processDuration: totalTimeProcessLinesInSend, - sendDuration: totalTimeToSendLogsGranular, - parseTimestampDuratoin: totalTimestampParsing, - filterCheckDuration: totalFilterCheck, - retentionPeriodCheckDuration: totalRetentionCheck, - }) return nil default: - startTime := time.Now() - - getJsonStartTime := time.Now() jsonLogStr, err := getCompleteJsonLogString(logsReader) - totalTimeToGetJsonStrings += time.Now().Sub(getJsonStartTime) if isValidJsonEnding(jsonLogStr) { var logLine logline.LogLine @@ -225,53 +200,18 @@ func (strategy *PerWeekStreamLogsStrategy) streamAllLogs( return stacktrace.Propagate(err, "An error occurred converting the json log string '%v' into json.", jsonLogStr) } - sendJsonLogLineStartTime := time.Now() - logLine, err, ltm = strategy.sendJsonLogLineWithTimes(jsonLog, logsByKurtosisUserServiceUuidChan, serviceUuid, conjunctiveLogLinesFiltersWithRegex) + logLine, err = strategy.processJsonLogLine(jsonLog, conjunctiveLogLinesFiltersWithRegex) if err != nil { return err } - logLineBuffer = append(logLineBuffer, logLine) - totalTimeToSendJsonLogs += time.Now().Sub(sendJsonLogLineStartTime) - - //totalTimeToSendLogsGranular += ltm.sendDuration - totalTimeProcessLinesInSend += ltm.processDuration - totalTimestampParsing += ltm.parseTimestampDuratoin - totalFilterCheck += ltm.filterCheckDuration - totalRetentionCheck += ltm.retentionPeriodCheckDuration - - endTime := time.Now() - totalLogFileReadDuration += endTime.Sub(startTime) - } - - if len(logLineBuffer)%batchLogsAmount == 0 { - sendAcrossChannelStartTime := time.Now() - userServicesLogLinesMap := map[service.ServiceUUID][]logline.LogLine{ - serviceUuid: logLineBuffer, - } - logsByKurtosisUserServiceUuidChan <- userServicesLogLinesMap - logLineBuffer = []logline.LogLine{} - totalTimeToSendLogsGranular += time.Now().Sub(sendAcrossChannelStartTime) + logLineSender.SendLogLine(serviceUuid, logLine) } if err != nil { // if we've reached end of logs, return success, otherwise return the error if errors.Is(err, io.EOF) { - logTimes(totalLogFileReadDuration, totalTimeToGetJsonStrings, totalTimeToSendJsonLogs, SendLogLineTimeMeasurements{ - processDuration: totalTimeProcessLinesInSend, - sendDuration: totalTimeToSendLogsGranular, - parseTimestampDuratoin: totalTimestampParsing, - filterCheckDuration: totalFilterCheck, - retentionPeriodCheckDuration: totalRetentionCheck, - }) return nil } else { - logTimes(totalLogFileReadDuration, totalTimeToGetJsonStrings, totalTimeToSendJsonLogs, SendLogLineTimeMeasurements{ - processDuration: totalTimeProcessLinesInSend, - sendDuration: totalTimeToSendLogsGranular, - parseTimestampDuratoin: totalTimestampParsing, - filterCheckDuration: totalFilterCheck, - retentionPeriodCheckDuration: totalRetentionCheck, - }) return err } } @@ -284,7 +224,7 @@ func (strategy *PerWeekStreamLogsStrategy) streamTailLogs( ctx context.Context, logsReader *bufio.Reader, numLogLines uint32, - logsByKurtosisUserServiceUuidChan chan map[service.ServiceUUID][]logline.LogLine, + logLineSender *logline.LogLineSender, serviceUuid service.ServiceUUID, conjunctiveLogLinesFiltersWithRegex []logline.LogLineFilterWithRegex) error { tailLogLines := make([]string, 0, numLogLines) @@ -322,9 +262,11 @@ func (strategy *PerWeekStreamLogsStrategy) streamTailLogs( if err != nil { return stacktrace.Propagate(err, "An error occurred converting the json log string '%v' into json.", jsonLogStr) } - if err := strategy.sendJsonLogLine(jsonLog, logsByKurtosisUserServiceUuidChan, serviceUuid, conjunctiveLogLinesFiltersWithRegex); err != nil { + logLine, err := strategy.processJsonLogLine(jsonLog, conjunctiveLogLinesFiltersWithRegex) + if err != nil { return err } + logLineSender.SendLogLine(serviceUuid, logLine) } return nil @@ -365,11 +307,9 @@ func isValidJsonEnding(line string) bool { return endOfLine == volume_consts.EndOfJsonLine } -func (strategy *PerWeekStreamLogsStrategy) sendJsonLogLine( +func (strategy *PerWeekStreamLogsStrategy) processJsonLogLine( jsonLog JsonLog, - logsByKurtosisUserServiceUuidChan chan map[service.ServiceUUID][]logline.LogLine, - serviceUuid service.ServiceUUID, - conjunctiveLogLinesFiltersWithRegex []logline.LogLineFilterWithRegex) error { + conjunctiveLogLinesFiltersWithRegex []logline.LogLineFilterWithRegex) (logline.LogLine, error) { // each logLineStr is of the following structure: {"enclave_uuid": "...", "service_uuid":"...", "log": "...",.. "timestamp":"..."} // eg. {"container_type":"api-container", "container_id":"8f8558ba", "container_name":"/kurtosis-api--ffd", // "log":"hi","timestamp":"2023-08-14T14:57:49Z"} @@ -377,150 +317,35 @@ func (strategy *PerWeekStreamLogsStrategy) sendJsonLogLine( // Then extract the actual log message using the vectors log field logMsgStr, found := jsonLog[volume_consts.LogLabel] if !found { - return stacktrace.NewError("An error retrieving the log field '%v' from json log: %v\n", volume_consts.LogLabel, jsonLog) + return logline.LogLine{}, stacktrace.NewError("An error retrieving the log field '%v' from json log: %v\n", volume_consts.LogLabel, jsonLog) } // Extract the timestamp using vectors timestamp field logTimestamp, err := parseTimestampFromJsonLogLine(jsonLog) if err != nil { - return stacktrace.Propagate(err, "An error occurred parsing timestamp from json log line.") + return logline.LogLine{}, stacktrace.Propagate(err, "An error occurred parsing timestamp from json log line.") } logLine := logline.NewLogLine(logMsgStr, *logTimestamp) // Then filter by checking if the log message is valid based on requested filters validLogLine, err := logLine.IsValidLogLineBaseOnFilters(conjunctiveLogLinesFiltersWithRegex) if err != nil { - return stacktrace.Propagate(err, "An error occurred filtering log line '%+v' using filters '%+v'", logLine, conjunctiveLogLinesFiltersWithRegex) + return logline.LogLine{}, stacktrace.Propagate(err, "An error occurred filtering log line '%+v' using filters '%+v'", logLine, conjunctiveLogLinesFiltersWithRegex) } if !validLogLine { - return nil + return logline.LogLine{}, nil } // ensure this log line is within the retention period if it has a timestamp withinRetentionPeriod, err := strategy.isWithinRetentionPeriod(logLine) if err != nil { - return stacktrace.Propagate(err, "An error occurred filtering log line '%+v' using filters '%+v'", logLine, conjunctiveLogLinesFiltersWithRegex) + return logline.LogLine{}, stacktrace.Propagate(err, "An error occurred filtering log line '%+v' using filters '%+v'", logLine, conjunctiveLogLinesFiltersWithRegex) } if !withinRetentionPeriod { - return nil + return logline.LogLine{}, nil } - // send the log line - logLines := []logline.LogLine{*logLine} - userServicesLogLinesMap := map[service.ServiceUUID][]logline.LogLine{ - serviceUuid: logLines, - } - logsByKurtosisUserServiceUuidChan <- userServicesLogLinesMap - return nil -} - -type SendLogLineTimeMeasurements struct { - processDuration time.Duration - sendDuration time.Duration - parseTimestampDuratoin time.Duration - filterCheckDuration time.Duration - retentionPeriodCheckDuration time.Duration -} - -func (strategy *PerWeekStreamLogsStrategy) sendJsonLogLineWithTimes( - jsonLog JsonLog, - logsByKurtosisUserServiceUuidChan chan map[service.ServiceUUID][]logline.LogLine, - serviceUuid service.ServiceUUID, - conjunctiveLogLinesFiltersWithRegex []logline.LogLineFilterWithRegex) (logline.LogLine, error, SendLogLineTimeMeasurements) { - // each logLineStr is of the following structure: {"enclave_uuid": "...", "service_uuid":"...", "log": "...",.. "timestamp":"..."} - // eg. {"container_type":"api-container", "container_id":"8f8558ba", "container_name":"/kurtosis-api--ffd", - // "log":"hi","timestamp":"2023-08-14T14:57:49Z"} - var processDuration time.Duration - var sendDuration time.Duration - var parseTimestampDuration time.Duration - var filterCheckDuration time.Duration - var retentionPeriodCheckDuration time.Duration - - processStart := time.Now() - // Then extract the actual log message using the vectors log field - logMsgStr, found := jsonLog[volume_consts.LogLabel] - if !found { - return logline.LogLine{}, stacktrace.NewError("An error retrieving the log field '%v' from json log: %v\n", volume_consts.LogLabel, jsonLog), SendLogLineTimeMeasurements{ - processDuration: processDuration, - sendDuration: sendDuration, - parseTimestampDuratoin: parseTimestampDuration, - filterCheckDuration: filterCheckDuration, - retentionPeriodCheckDuration: retentionPeriodCheckDuration, - } - } - - timestampStart := time.Now() - // Extract the timestamp using vectors timestamp field - logTimestamp, err := parseTimestampFromJsonLogLine(jsonLog) - if err != nil { - return logline.LogLine{}, stacktrace.Propagate(err, "An error occurred parsing timestamp from json log line."), SendLogLineTimeMeasurements{ - processDuration: processDuration, - sendDuration: sendDuration, - parseTimestampDuratoin: parseTimestampDuration, - filterCheckDuration: filterCheckDuration, - retentionPeriodCheckDuration: retentionPeriodCheckDuration, - } - } - logLine := logline.NewLogLine(logMsgStr, *logTimestamp) - parseTimestampDuration += time.Now().Sub(timestampStart) - - filterStart := time.Now() - // Then filter by checking if the log message is valid based on requested filters - validLogLine, err := logLine.IsValidLogLineBaseOnFilters(conjunctiveLogLinesFiltersWithRegex) - if err != nil { - return logline.LogLine{}, stacktrace.Propagate(err, "An error occurred filtering log line '%+v' using filters '%+v'", logLine, conjunctiveLogLinesFiltersWithRegex), SendLogLineTimeMeasurements{ - processDuration: processDuration, - sendDuration: sendDuration, - parseTimestampDuratoin: parseTimestampDuration, - filterCheckDuration: filterCheckDuration, - retentionPeriodCheckDuration: retentionPeriodCheckDuration, - } - } - if !validLogLine { - return logline.LogLine{}, nil, SendLogLineTimeMeasurements{ - processDuration: processDuration, - sendDuration: sendDuration, - parseTimestampDuratoin: parseTimestampDuration, - filterCheckDuration: filterCheckDuration, - retentionPeriodCheckDuration: retentionPeriodCheckDuration, - } - } - filterCheckDuration += time.Now().Sub(filterStart) - - retentionCheckStart := time.Now() - // ensure this log line is within the retention period if it has a timestamp - withinRetentionPeriod, err := strategy.isWithinRetentionPeriod(logLine) - if err != nil { - return logline.LogLine{}, stacktrace.Propagate(err, "An error occurred determining whether log line '%+v' is within the retention period.", logLine), SendLogLineTimeMeasurements{} - } - if !withinRetentionPeriod { - return logline.LogLine{}, nil, SendLogLineTimeMeasurements{ - processDuration: processDuration, - sendDuration: sendDuration, - parseTimestampDuratoin: parseTimestampDuration, - filterCheckDuration: filterCheckDuration, - retentionPeriodCheckDuration: retentionPeriodCheckDuration, - } - } - retentionPeriodCheckDuration += time.Now().Sub(retentionCheckStart) - - // send the log line - //logLines := []logline.LogLine{*logLine} - //userServicesLogLinesMap := map[service.ServiceUUID][]logline.LogLine{ - // serviceUuid: logLines, - //} - processDuration += time.Now().Sub(processStart) - - sendStart := time.Now() - //logsByKurtosisUserServiceUuidChan <- userServicesLogLinesMap - sendDuration += time.Now().Sub(sendStart) - return *logLine, nil, SendLogLineTimeMeasurements{ - processDuration: processDuration, - sendDuration: sendDuration, - parseTimestampDuratoin: parseTimestampDuration, - filterCheckDuration: filterCheckDuration, - retentionPeriodCheckDuration: retentionPeriodCheckDuration, - } + return *logLine, nil } // Returns true if [logLine] has no timestamp @@ -534,7 +359,7 @@ func (strategy *PerWeekStreamLogsStrategy) isWithinRetentionPeriod(logLine *logl func (strategy *PerWeekStreamLogsStrategy) followLogs( ctx context.Context, filepath string, - logsByKurtosisUserServiceUuidChan chan map[service.ServiceUUID][]logline.LogLine, + logLineSender *logline.LogLineSender, serviceUuid service.ServiceUUID, conjunctiveLogLinesFiltersWithRegex []logline.LogLineFilterWithRegex, ) error { @@ -575,10 +400,11 @@ func (strategy *PerWeekStreamLogsStrategy) followLogs( // if tail package fails to parse a valid new line, fail fast return stacktrace.NewError("hpcloud/tail returned the following line: '%v' that was not valid json.\nThis is potentially a bug in tailing package.", logLine.Text) } - err = strategy.sendJsonLogLine(jsonLog, logsByKurtosisUserServiceUuidChan, serviceUuid, conjunctiveLogLinesFiltersWithRegex) + processedLogLine, err := strategy.processJsonLogLine(jsonLog, conjunctiveLogLinesFiltersWithRegex) if err != nil { return stacktrace.Propagate(err, "An error occurred sending json log line '%v'.", logLine.Text) } + logLineSender.SendLogLine(serviceUuid, processedLogLine) } } } @@ -603,14 +429,3 @@ func parseTimestampFromJsonLogLine(logLine JsonLog) (*time.Time, error) { } return ×tamp, nil } - -func logTimes(totalDuration, getLineDuration, totalSendLineDuration time.Duration, sendLogLineTM SendLogLineTimeMeasurements) { - logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO READ FILES: %v", totalDuration) - logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO GET JSON LINES: %v", getLineDuration) - logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO SEND JSON LINES: %v", totalSendLineDuration) - logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO SEND JSON LINES ACROSS CHANNEL: %v", sendLogLineTM.sendDuration) - logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO PROCESS JSON LINES BEFORE SENDING: %v", sendLogLineTM.processDuration) - logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO PARSE TIMESTAMPS: %v", sendLogLineTM.parseTimestampDuratoin) - logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO FILTER LINES BASED ON REGEXES: %v", sendLogLineTM.filterCheckDuration) - logrus.Infof("LOGS DB CLIENT [per_week_stream_logs_strategy] TOTAL TIME TO CHECK RETENTION PERIOD: %v", sendLogLineTM.retentionPeriodCheckDuration) -} diff --git a/engine/server/engine/centralized_logs/logline/logline_sender.go b/engine/server/engine/centralized_logs/logline/logline_sender.go new file mode 100644 index 0000000000..f1e3354b8b --- /dev/null +++ b/engine/server/engine/centralized_logs/logline/logline_sender.go @@ -0,0 +1,29 @@ +package logline + +import "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service" + +const ( + batchLogsAmount = 500 +) + +type LogLineSender struct { + logsChan chan map[service.ServiceUUID][]LogLine + + logLineBuffer []LogLine +} + +func NewLogLineSender(logsChan chan map[service.ServiceUUID][]LogLine) *LogLineSender { + return &LogLineSender{logsChan: logsChan} +} + +func (sender *LogLineSender) SendLogLine(serviceUuid service.ServiceUUID, logLine LogLine) { + sender.logLineBuffer = append(sender.logLineBuffer, logLine) + + if len(sender.logLineBuffer)%batchLogsAmount == 0 { + userServicesLogLinesMap := map[service.ServiceUUID][]LogLine{ + serviceUuid: sender.logLineBuffer, + } + sender.logsChan <- userServicesLogLinesMap + sender.logLineBuffer = []LogLine{} + } +} From 75fd409cb2f365b5a6992eb1f48ffc7bb230d5ce Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 8 Aug 2024 23:04:07 -0400 Subject: [PATCH 06/78] encapsulate buff channel inside log line sender --- .../persistent_volume_logs_database_client.go | 9 +++++---- .../per_file_stream_logs_strategy.go | 9 ++------- .../per_week_stream_logs_strategy.go | 6 ++---- .../stream_logs_strategy/stream_logs_strategy.go | 2 +- .../centralized_logs/logline/logline_sender.go | 16 +++++++++++++--- 5 files changed, 23 insertions(+), 19 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client.go index 1c44d1ef41..02e6544318 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client.go @@ -64,7 +64,8 @@ func (client *persistentVolumeLogsDatabaseClient) StreamUserServiceLogs( streamErrChan := make(chan error) // this channel will return the user service log lines by service UUID - logsByKurtosisUserServiceUuidChan := make(chan map[service.ServiceUUID][]logline.LogLine, logLineBufferSize) + logLineSender := logline.NewLogLineSender() + logsByKurtosisUserServiceUuidChan := logLineSender.GetLogsChannel() wgSenders := &sync.WaitGroup{} for serviceUuid := range userServiceUuids { @@ -72,7 +73,7 @@ func (client *persistentVolumeLogsDatabaseClient) StreamUserServiceLogs( go client.streamServiceLogLines( ctx, wgSenders, - logsByKurtosisUserServiceUuidChan, + logLineSender, streamErrChan, enclaveUuid, serviceUuid, @@ -131,7 +132,7 @@ func (client *persistentVolumeLogsDatabaseClient) FilterExistingServiceUuids( func (client *persistentVolumeLogsDatabaseClient) streamServiceLogLines( ctx context.Context, wgSenders *sync.WaitGroup, - logsByKurtosisUserServiceUuidChan chan map[service.ServiceUUID][]logline.LogLine, + logLineSender *logline.LogLineSender, streamErrChan chan error, enclaveUuid enclave.EnclaveUUID, serviceUuid service.ServiceUUID, @@ -144,7 +145,7 @@ func (client *persistentVolumeLogsDatabaseClient) streamServiceLogLines( client.streamStrategy.StreamLogs( ctx, client.filesystem, - logsByKurtosisUserServiceUuidChan, + logLineSender, streamErrChan, enclaveUuid, serviceUuid, diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_file_stream_logs_strategy.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_file_stream_logs_strategy.go index 7fa08c1594..6c1f7147b4 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_file_stream_logs_strategy.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_file_stream_logs_strategy.go @@ -30,7 +30,7 @@ type JsonLog map[string]string func (strategy *PerFileStreamLogsStrategy) StreamLogs( ctx context.Context, fs volume_filesystem.VolumeFilesystem, - logsByKurtosisUserServiceUuidChan chan map[service.ServiceUUID][]logline.LogLine, + logLineSender *logline.LogLineSender, streamErrChan chan error, enclaveUuid enclave.EnclaveUUID, serviceUuid service.ServiceUUID, @@ -122,12 +122,7 @@ func (strategy *PerFileStreamLogsStrategy) StreamLogs( break } - // send the log line - logLines := []logline.LogLine{*logLine} - userServicesLogLinesMap := map[service.ServiceUUID][]logline.LogLine{ - serviceUuid: logLines, - } - logsByKurtosisUserServiceUuidChan <- userServicesLogLinesMap + logLineSender.SendLogLine(serviceUuid, *logLine) } } } diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go index 99d2137c80..79fcd046fb 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go @@ -25,8 +25,7 @@ import ( ) const ( - oneWeek = 7 * 24 * time.Hour - batchLogsAmount = 50 + oneWeek = 7 * 24 * time.Hour ) // PerWeekStreamLogsStrategy pulls logs from filesystem where there is a log file per year, per week, per enclave, per service @@ -49,7 +48,7 @@ func NewPerWeekStreamLogsStrategy(time logs_clock.LogsClock, logRetentionPeriodI func (strategy *PerWeekStreamLogsStrategy) StreamLogs( ctx context.Context, fs volume_filesystem.VolumeFilesystem, - logsByKurtosisUserServiceUuidChan chan map[service.ServiceUUID][]logline.LogLine, + logLineSender *logline.LogLineSender, streamErrChan chan error, enclaveUuid enclave.EnclaveUUID, serviceUuid service.ServiceUUID, @@ -58,7 +57,6 @@ func (strategy *PerWeekStreamLogsStrategy) StreamLogs( shouldReturnAllLogs bool, numLogLines uint32, ) { - logLineSender := logline.NewLogLineSender(logsByKurtosisUserServiceUuidChan) paths, err := strategy.getLogFilePaths(fs, strategy.logRetentionPeriodInWeeks, string(enclaveUuid), string(serviceUuid)) if err != nil { streamErrChan <- stacktrace.Propagate(err, "An error occurred retrieving log file paths for service '%v' in enclave '%v'.", serviceUuid, enclaveUuid) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/stream_logs_strategy.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/stream_logs_strategy.go index c8fa215b30..af00ed5646 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/stream_logs_strategy.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/stream_logs_strategy.go @@ -15,7 +15,7 @@ type StreamLogsStrategy interface { StreamLogs( ctx context.Context, fs volume_filesystem.VolumeFilesystem, - logsByKurtosisUserServiceUuidChan chan map[service.ServiceUUID][]logline.LogLine, + logLineSender *logline.LogLineSender, streamErrChan chan error, enclaveUuid enclave.EnclaveUUID, serviceUuid service.ServiceUUID, diff --git a/engine/server/engine/centralized_logs/logline/logline_sender.go b/engine/server/engine/centralized_logs/logline/logline_sender.go index f1e3354b8b..871041dbc3 100644 --- a/engine/server/engine/centralized_logs/logline/logline_sender.go +++ b/engine/server/engine/centralized_logs/logline/logline_sender.go @@ -3,7 +3,8 @@ package logline import "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service" const ( - batchLogsAmount = 500 + batchLogsAmount = 500 + logsChanBufferSize = 300 ) type LogLineSender struct { @@ -12,8 +13,11 @@ type LogLineSender struct { logLineBuffer []LogLine } -func NewLogLineSender(logsChan chan map[service.ServiceUUID][]LogLine) *LogLineSender { - return &LogLineSender{logsChan: logsChan} +func NewLogLineSender() *LogLineSender { + return &LogLineSender{ + logsChan: make(chan map[service.ServiceUUID][]LogLine, logsChanBufferSize), + logLineBuffer: []LogLine{}, + } } func (sender *LogLineSender) SendLogLine(serviceUuid service.ServiceUUID, logLine LogLine) { @@ -24,6 +28,12 @@ func (sender *LogLineSender) SendLogLine(serviceUuid service.ServiceUUID, logLin serviceUuid: sender.logLineBuffer, } sender.logsChan <- userServicesLogLinesMap + + // clear buffer after flushing it through the channel sender.logLineBuffer = []LogLine{} } } + +func (sender *LogLineSender) GetLogsChannel() chan map[service.ServiceUUID][]LogLine { + return sender.logsChan +} From 42f7a30723564ed53b6be837c1ae31d85cf8c865 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 8 Aug 2024 23:41:10 -0400 Subject: [PATCH 07/78] refactor again and get tests to pass --- ...istent_volume_logs_database_client_test.go | 1554 +++++++++-------- .../per_week_stream_logs_strategy.go | 29 +- .../logline/logline_sender.go | 28 +- 3 files changed, 813 insertions(+), 798 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go index 801697aafa..4bcb3378ff 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go @@ -1,7 +1,21 @@ package persistent_volume import ( + "context" + "fmt" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/enclave" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/logline" + "github.com/kurtosis-tech/stacktrace" + "github.com/stretchr/testify/require" + "strconv" + "strings" + "testing" "time" ) @@ -42,774 +56,772 @@ const ( defaultNumLogLines = 0 ) -// -//func TestStreamUserServiceLogs_WithFilters(t *testing.T) { -// expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ -// testUserService1Uuid: 2, -// testUserService2Uuid: 2, -// testUserService3Uuid: 2, -// } -// -// firstTextFilter := logline.NewDoesContainTextLogLineFilter(firstFilterText) -// secondTextFilter := logline.NewDoesNotContainTextLogLineFilter(secondFilterText) -// regexFilter := logline.NewDoesContainMatchRegexLogLineFilter(firstMatchRegexFilterStr) -// -// logLinesFilters := []logline.LogLineFilter{ -// *firstTextFilter, -// *secondTextFilter, -// *regexFilter, -// } -// -// expectedFirstLogLine := "Starting feature 'runs idempotently'" -// -// userServiceUuids := map[service.ServiceUUID]bool{ -// testUserService1Uuid: true, -// testUserService2Uuid: true, -// testUserService3Uuid: true, -// } -// -// underlyingFs := createFilledPerFileFilesystem() -// perFileStreamStrategy := stream_logs_strategy.NewPerFileStreamLogsStrategy() -// -// receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( -// t, -// logLinesFilters, -// userServiceUuids, -// expectedServiceAmountLogLinesByServiceUuid, -// doNotFollowLogs, -// underlyingFs, -// perFileStreamStrategy, -// ) -// require.NoError(t, testEvaluationErr) -// -// for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { -// expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] -// require.True(t, found) -// require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) -// require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) -// } -//} -// -//func TestStreamUserServiceLogsPerWeek_WithFilters(t *testing.T) { -// expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ -// testUserService1Uuid: 2, -// testUserService2Uuid: 2, -// testUserService3Uuid: 2, -// } -// -// firstTextFilter := logline.NewDoesContainTextLogLineFilter(firstFilterText) -// secondTextFilter := logline.NewDoesNotContainTextLogLineFilter(secondFilterText) -// regexFilter := logline.NewDoesContainMatchRegexLogLineFilter(firstMatchRegexFilterStr) -// -// logLinesFilters := []logline.LogLineFilter{ -// *firstTextFilter, -// *secondTextFilter, -// *regexFilter, -// } -// -// expectedFirstLogLine := "Starting feature 'runs idempotently'" -// -// userServiceUuids := map[service.ServiceUUID]bool{ -// testUserService1Uuid: true, -// testUserService2Uuid: true, -// testUserService3Uuid: true, -// } -// -// underlyingFs := createFilledPerWeekFilesystem(startingWeek) -// mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay) -// perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) -// -// receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( -// t, -// logLinesFilters, -// userServiceUuids, -// expectedServiceAmountLogLinesByServiceUuid, -// doNotFollowLogs, -// underlyingFs, -// perWeekStreamStrategy, -// ) -// -// for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { -// expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] -// require.True(t, found) -// require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) -// require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) -// } -// -// require.NoError(t, testEvaluationErr) -//} -// -//func TestStreamUserServiceLogs_NoLogsFromPersistentVolume(t *testing.T) { -// expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ -// testUserService1Uuid: 0, -// testUserService2Uuid: 0, -// testUserService3Uuid: 0, -// } -// -// firstTextFilter := logline.NewDoesContainTextLogLineFilter(notFoundedFilterText) -// -// logLinesFilters := []logline.LogLineFilter{ -// *firstTextFilter, -// } -// -// userServiceUuids := map[service.ServiceUUID]bool{ -// testUserService1Uuid: true, -// testUserService2Uuid: true, -// testUserService3Uuid: true, -// } -// -// underlyingFs := createEmptyPerFileFilesystem() -// perFileStreamStrategy := stream_logs_strategy.NewPerFileStreamLogsStrategy() -// -// receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( -// t, -// logLinesFilters, -// userServiceUuids, -// expectedServiceAmountLogLinesByServiceUuid, -// doNotFollowLogs, -// underlyingFs, -// perFileStreamStrategy, -// ) -// require.NoError(t, testEvaluationErr) -// -// for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { -// expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] -// require.True(t, found) -// require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) -// } -//} -// -//func TestStreamUserServiceLogsPerWeek_NoLogsFromPersistentVolume(t *testing.T) { -// expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ -// testUserService1Uuid: 0, -// testUserService2Uuid: 0, -// testUserService3Uuid: 0, -// } -// -// firstTextFilter := logline.NewDoesContainTextLogLineFilter(notFoundedFilterText) -// -// logLinesFilters := []logline.LogLineFilter{ -// *firstTextFilter, -// } -// -// userServiceUuids := map[service.ServiceUUID]bool{ -// testUserService1Uuid: true, -// testUserService2Uuid: true, -// testUserService3Uuid: true, -// } -// -// underlyingFs := createEmptyPerWeekFilesystem(startingWeek) -// mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay) -// perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) -// -// receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( -// t, -// logLinesFilters, -// userServiceUuids, -// expectedServiceAmountLogLinesByServiceUuid, -// doNotFollowLogs, -// underlyingFs, -// perWeekStreamStrategy, -// ) -// require.NoError(t, testEvaluationErr) -// -// for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { -// expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] -// require.True(t, found) -// require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) -// } -//} -// -//func TestStreamUserServiceLogs_ThousandsOfLogLinesSuccessfulExecution(t *testing.T) { -// expectedAmountLogLines := 10_000 -// -// expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ -// testUserService1Uuid: expectedAmountLogLines, -// } -// -// var emptyFilters []logline.LogLineFilter -// -// expectedFirstLogLine := "Starting feature 'centralized logs'" -// -// var logLines []string -// -// for i := 0; i <= expectedAmountLogLines; i++ { -// logLines = append(logLines, logLine1) -// } -// -// logLinesStr := strings.Join(logLines, "\n") -// -// userServiceUuids := map[service.ServiceUUID]bool{ -// testUserService1Uuid: true, -// } -// -// underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() -// -// file1PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, string(enclaveUuid), testUserService1Uuid, volume_consts.Filetype) -// file1, err := underlyingFs.Create(file1PathStr) -// require.NoError(t, err) -// _, err = file1.WriteString(logLinesStr) -// require.NoError(t, err) -// -// perFileStreamStrategy := stream_logs_strategy.NewPerFileStreamLogsStrategy() -// -// receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( -// t, -// emptyFilters, -// userServiceUuids, -// expectedServiceAmountLogLinesByServiceUuid, -// doNotFollowLogs, -// underlyingFs, -// perFileStreamStrategy, -// ) -// require.NoError(t, testEvaluationErr) -// -// for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { -// expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] -// require.True(t, found) -// require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) -// require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) -// } -//} -// -//func TestStreamUserServiceLogsPerWeek_ThousandsOfLogLinesSuccessfulExecution(t *testing.T) { -// expectedAmountLogLines := 10_000 -// -// expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ -// testUserService1Uuid: expectedAmountLogLines, -// } -// -// var emptyFilters []logline.LogLineFilter -// -// expectedFirstLogLine := "Starting feature 'centralized logs'" -// -// var logLines []string -// -// for i := 0; i <= expectedAmountLogLines; i++ { -// logLines = append(logLines, logLine1) -// } -// -// logLinesStr := strings.Join(logLines, "\n") -// -// userServiceUuids := map[service.ServiceUUID]bool{ -// testUserService1Uuid: true, -// } -// -// underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() -// // %02d to format week num with leading zeros so 1-9 are converted to 01-09 for %V format -// formattedWeekNum := fmt.Sprintf("%02d", startingWeek) -// file1PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, string(enclaveUuid), testUserService1Uuid, volume_consts.Filetype) -// file1, err := underlyingFs.Create(file1PathStr) -// require.NoError(t, err) -// _, err = file1.WriteString(logLinesStr) -// require.NoError(t, err) -// -// mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay) -// perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) -// -// receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( -// t, -// emptyFilters, -// userServiceUuids, -// expectedServiceAmountLogLinesByServiceUuid, -// doNotFollowLogs, -// underlyingFs, -// perWeekStreamStrategy, -// ) -// require.NoError(t, testEvaluationErr) -// -// for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { -// expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] -// require.True(t, found) -// require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) -// require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) -// } -//} -// -//func TestStreamUserServiceLogs_EmptyLogLines(t *testing.T) { -// expectedAmountLogLines := 0 -// -// expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ -// testUserService1Uuid: expectedAmountLogLines, -// } -// -// var emptyFilters []logline.LogLineFilter -// -// userServiceUuids := map[service.ServiceUUID]bool{ -// testUserService1Uuid: true, -// } -// -// logLinesStr := "" -// -// underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() -// file1PathStr := fmt.Sprintf("%s%s/%s%s", volume_consts.LogsStorageDirpath, string(enclaveUuid), testUserService1Uuid, volume_consts.Filetype) -// file1, err := underlyingFs.Create(file1PathStr) -// require.NoError(t, err) -// _, err = file1.WriteString(logLinesStr) -// require.NoError(t, err) -// -// perFileStreamStrategy := stream_logs_strategy.NewPerFileStreamLogsStrategy() -// -// receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( -// t, -// emptyFilters, -// userServiceUuids, -// expectedServiceAmountLogLinesByServiceUuid, -// doNotFollowLogs, -// underlyingFs, -// perFileStreamStrategy, -// ) -// require.NoError(t, testEvaluationErr) -// -// for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { -// expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] -// require.True(t, found) -// require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) -// } -//} -// -//func TestStreamUserServiceLogsPerWeek_EmptyLogLines(t *testing.T) { -// expectedAmountLogLines := 0 -// -// expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ -// testUserService1Uuid: expectedAmountLogLines, -// } -// -// var emptyFilters []logline.LogLineFilter -// -// userServiceUuids := map[service.ServiceUUID]bool{ -// testUserService1Uuid: true, -// } -// -// logLinesStr := "" -// -// underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() -// formattedWeekNum := fmt.Sprintf("%02d", startingWeek) -// file1PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, string(enclaveUuid), testUserService1Uuid, volume_consts.Filetype) -// file1, err := underlyingFs.Create(file1PathStr) -// require.NoError(t, err) -// _, err = file1.WriteString(logLinesStr) -// require.NoError(t, err) -// -// mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay) -// perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) -// -// receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( -// t, -// emptyFilters, -// userServiceUuids, -// expectedServiceAmountLogLinesByServiceUuid, -// doNotFollowLogs, -// underlyingFs, -// perWeekStreamStrategy, -// ) -// require.NoError(t, testEvaluationErr) -// -// for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { -// expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] -// require.True(t, found) -// require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) -// } -//} -// -//func TestStreamUserServiceLogsPerWeek_WithLogsAcrossWeeks(t *testing.T) { -// expectedAmountLogLines := 8 -// -// expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ -// testUserService1Uuid: expectedAmountLogLines, -// } -// -// var logLinesFilters []logline.LogLineFilter -// -// userServiceUuids := map[service.ServiceUUID]bool{ -// testUserService1Uuid: true, -// } -// -// expectedFirstLogLine := "Starting feature 'centralized logs'" -// -// week4logLines := []string{ -// logLine5, -// logLine6, -// logLine7, -// logLine8} -// week3logLines := []string{ -// logLine1, -// logLine2, -// logLine3a, -// logLine3b, -// logLine4} -// -// underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() -// -// week3logLinesStr := strings.Join(week3logLines, "\n") + "\n" -// week4logLinesStr := strings.Join(week4logLines, "\n") -// -// formattedWeekFour := fmt.Sprintf("%02d", 4) -// week4filepath := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekFour, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) -// week4, err := underlyingFs.Create(week4filepath) -// require.NoError(t, err) -// _, err = week4.WriteString(week4logLinesStr) -// require.NoError(t, err) -// -// formattedWeekThree := fmt.Sprintf("%02d", 3) -// week3filepath := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekThree, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) -// week3, err := underlyingFs.Create(week3filepath) -// require.NoError(t, err) -// _, err = week3.WriteString(week3logLinesStr) -// require.NoError(t, err) -// -// mockTime := logs_clock.NewMockLogsClock(defaultYear, 4, defaultDay) -// perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) -// -// receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( -// t, -// logLinesFilters, -// userServiceUuids, -// expectedServiceAmountLogLinesByServiceUuid, -// doNotFollowLogs, -// underlyingFs, -// perWeekStreamStrategy, -// ) -// require.NoError(t, testEvaluationErr) -// -// for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { -// expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] -// require.True(t, found) -// require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) -// require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) -// } -// -//} -// -//func TestStreamUserServiceLogsPerWeek_WithLogLineAcrossWeeks(t *testing.T) { -// expectedAmountLogLines := 8 -// -// expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ -// testUserService1Uuid: expectedAmountLogLines, -// } -// -// var logLinesFilters []logline.LogLineFilter -// -// userServiceUuids := map[service.ServiceUUID]bool{ -// testUserService1Uuid: true, -// } -// -// expectedFirstLogLine := "Starting feature 'centralized logs'" -// -// week4logLines := []string{ -// logLine3b, -// logLine4, -// logLine5, -// logLine6, -// logLine7, -// logLine8} -// week3logLines := []string{ -// logLine1, -// logLine2, -// logLine3a} -// -// underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() -// -// week3logLinesStr := strings.Join(week3logLines, "\n") + "\n" -// week4logLinesStr := strings.Join(week4logLines, "\n") + "\n" -// -// formattedWeekFour := fmt.Sprintf("%02d", 4) -// week4filepath := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekFour, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) -// week4, err := underlyingFs.Create(week4filepath) -// require.NoError(t, err) -// _, err = week4.WriteString(week4logLinesStr) -// require.NoError(t, err) -// -// formattedWeekThree := fmt.Sprintf("%02d", 3) -// week3filepath := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekThree, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) -// week3, err := underlyingFs.Create(week3filepath) -// require.NoError(t, err) -// _, err = week3.WriteString(week3logLinesStr) -// require.NoError(t, err) -// -// mockTime := logs_clock.NewMockLogsClock(defaultYear, 4, defaultDay) -// perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) -// -// receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( -// t, -// logLinesFilters, -// userServiceUuids, -// expectedServiceAmountLogLinesByServiceUuid, -// doNotFollowLogs, -// underlyingFs, -// perWeekStreamStrategy, -// ) -// require.NoError(t, testEvaluationErr) -// -// for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { -// expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] -// require.True(t, found) -// require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) -// require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) -// } -//} -// -//func TestStreamUserServiceLogsPerWeekReturnsTimestampedLogLines(t *testing.T) { -// expectedAmountLogLines := 3 -// -// expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ -// testUserService1Uuid: expectedAmountLogLines, -// } -// -// var logLinesFilters []logline.LogLineFilter -// -// userServiceUuids := map[service.ServiceUUID]bool{ -// testUserService1Uuid: true, -// } -// -// timedLogLine1 := fmt.Sprintf("{\"log\":\"Starting feature 'centralized logs'\", \"timestamp\":\"%v\"}", defaultUTCTimestampStr) -// timedLogLine2 := fmt.Sprintf("{\"log\":\"Starting feature 'runs idempotently'\", \"timestamp\":\"%v\"}", defaultUTCTimestampStr) -// timedLogLine3 := fmt.Sprintf("{\"log\":\"The enclave was created\", \"timestamp\":\"%v\"}", defaultUTCTimestampStr) -// -// timestampedLogLines := []string{timedLogLine1, timedLogLine2, timedLogLine3} -// timestampedLogLinesStr := strings.Join(timestampedLogLines, "\n") + "\n" -// -// underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() -// -// formattedWeekNum := fmt.Sprintf("%02d", startingWeek) -// filepath := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) -// file, err := underlyingFs.Create(filepath) -// require.NoError(t, err) -// _, err = file.WriteString(timestampedLogLinesStr) -// require.NoError(t, err) -// -// mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay) -// perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) -// -// expectedTime, err := time.Parse(utcFormat, defaultUTCTimestampStr) -// require.NoError(t, err) -// -// receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( -// t, -// logLinesFilters, -// userServiceUuids, -// expectedServiceAmountLogLinesByServiceUuid, -// doNotFollowLogs, -// underlyingFs, -// perWeekStreamStrategy, -// ) -// require.NoError(t, testEvaluationErr) -// -// for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { -// expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] -// require.True(t, found) -// require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) -// for _, logLine := range serviceLogLines { -// require.Equal(t, expectedTime, logLine.GetTimestamp()) -// } -// } -//} -// -//func TestStreamUserServiceLogsPerFileReturnsTimestampedLogLines(t *testing.T) { -// t.Skip() -// expectedAmountLogLines := 3 -// -// expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ -// testUserService1Uuid: expectedAmountLogLines, -// } -// -// var logLinesFilters []logline.LogLineFilter -// -// userServiceUuids := map[service.ServiceUUID]bool{ -// testUserService1Uuid: true, -// } -// -// timedLogLine1 := fmt.Sprintf("{\"log\":\"Starting feature 'centralized logs'\", \"timestamp\":\"%v\"}", defaultUTCTimestampStr) -// timedLogLine2 := fmt.Sprintf("{\"log\":\"Starting feature 'runs idempotently'\", \"timestamp\":\"%v\"}", defaultUTCTimestampStr) -// timedLogLine3 := fmt.Sprintf("{\"log\":\"The enclave was created\", \"timestamp\":\"%v\"}", defaultUTCTimestampStr) -// -// timestampedLogLines := []string{timedLogLine1, timedLogLine2, timedLogLine3} -// timestampedLogLinesStr := strings.Join(timestampedLogLines, "\n") + "\n" -// -// underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() -// -// filepath := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) -// file, err := underlyingFs.Create(filepath) -// require.NoError(t, err) -// _, err = file.WriteString(timestampedLogLinesStr) -// require.NoError(t, err) -// -// perFileStreamStrategy := stream_logs_strategy.NewPerFileStreamLogsStrategy() -// -// expectedTime, err := time.Parse(utcFormat, defaultUTCTimestampStr) -// require.NoError(t, err) -// -// receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( -// t, -// logLinesFilters, -// userServiceUuids, -// expectedServiceAmountLogLinesByServiceUuid, -// doNotFollowLogs, -// underlyingFs, -// perFileStreamStrategy, -// ) -// require.NoError(t, testEvaluationErr) -// -// for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { -// expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] -// require.True(t, found) -// require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) -// require.Equal(t, expectedTime, serviceLogLines[0].GetTimestamp()) -// } -//} -// -//// ==================================================================================================== -//// -//// Private helper functions -//// -//// ==================================================================================================== -//func executeStreamCallAndGetReceivedServiceLogLines( -// t *testing.T, -// logLinesFilters []logline.LogLineFilter, -// userServiceUuids map[service.ServiceUUID]bool, -// expectedServiceAmountLogLinesByServiceUuid map[service.ServiceUUID]int, -// shouldFollowLogs bool, -// underlyingFs volume_filesystem.VolumeFilesystem, -// streamStrategy stream_logs_strategy.StreamLogsStrategy, -//) (map[service.ServiceUUID][]logline.LogLine, error) { -// ctx := context.Background() -// -// receivedServiceLogsByUuid := map[service.ServiceUUID][]logline.LogLine{} -// -// for serviceUuid := range expectedServiceAmountLogLinesByServiceUuid { -// receivedServiceLogsByUuid[serviceUuid] = []logline.LogLine{} -// } -// -// kurtosisBackend := backend_interface.NewMockKurtosisBackend(t) -// -// logsDatabaseClient := NewPersistentVolumeLogsDatabaseClient(kurtosisBackend, underlyingFs, streamStrategy) -// -// userServiceLogsByUuidChan, errChan, receivedCancelCtxFunc, err := logsDatabaseClient.StreamUserServiceLogs(ctx, enclaveUuid, userServiceUuids, logLinesFilters, shouldFollowLogs, defaultShouldReturnAllLogs, defaultNumLogLines) -// if err != nil { -// return nil, stacktrace.Propagate(err, "An error occurred getting user service logs for UUIDs '%+v' using log line filters '%v' in enclave '%v'", userServiceUuids, logLinesFilters, enclaveUuid) -// } -// defer func() { -// if receivedCancelCtxFunc != nil { -// receivedCancelCtxFunc() -// } -// }() -// -// require.NotNil(t, userServiceLogsByUuidChan, "Received a nil user service logs channel, but a non-nil value was expected") -// require.NotNil(t, errChan, "Received a nil error logs channel, but a non-nil value was expected") -// -// shouldReceiveStream := true -// for shouldReceiveStream { -// select { -// case <-time.Tick(testTimeOut): -// return nil, stacktrace.NewError("Receiving stream logs in the test has reached the '%v' time out", testTimeOut) -// case streamErr, isChanOpen := <-errChan: -// if !isChanOpen { -// shouldReceiveStream = false -// break -// } -// return nil, stacktrace.Propagate(streamErr, "Receiving streaming error.") -// case userServiceLogsByUuid, isChanOpen := <-userServiceLogsByUuidChan: -// if !isChanOpen { -// shouldReceiveStream = false -// break -// } -// -// for serviceUuid, serviceLogLines := range userServiceLogsByUuid { -// _, found := userServiceUuids[serviceUuid] -// require.True(t, found) -// -// currentServiceLogLines := receivedServiceLogsByUuid[serviceUuid] -// allServiceLogLines := append(currentServiceLogLines, serviceLogLines...) -// receivedServiceLogsByUuid[serviceUuid] = allServiceLogLines -// } -// -// for serviceUuid, expectedAmountLogLines := range expectedServiceAmountLogLinesByServiceUuid { -// if len(receivedServiceLogsByUuid[serviceUuid]) == expectedAmountLogLines { -// shouldReceiveStream = false -// } else { -// shouldReceiveStream = true -// break -// } -// } -// } -// } -// -// return receivedServiceLogsByUuid, nil -//} -// -//func createFilledPerFileFilesystem() volume_filesystem.VolumeFilesystem { -// logLines := []string{logLine1, logLine2, logLine3a, logLine3b, logLine4, logLine5, logLine6, logLine7, logLine8} -// -// logLinesStr := strings.Join(logLines, "\n") -// -// file1PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) -// file2PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService2Uuid, volume_consts.Filetype) -// file3PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService3Uuid, volume_consts.Filetype) -// -// mapFs := volume_filesystem.NewMockedVolumeFilesystem() -// -// file1, _ := mapFs.Create(file1PathStr) -// _, _ = file1.WriteString(logLinesStr) -// -// file2, _ := mapFs.Create(file2PathStr) -// _, _ = file2.WriteString(logLinesStr) -// -// file3, _ := mapFs.Create(file3PathStr) -// _, _ = file3.WriteString(logLinesStr) -// -// return mapFs -//} -// -//func createFilledPerWeekFilesystem(week int) volume_filesystem.VolumeFilesystem { -// logLines := []string{logLine1, logLine2, logLine3a, logLine3b, logLine4, logLine5, logLine6, logLine7, logLine8} -// -// logLinesStr := strings.Join(logLines, "\n") -// // %02d to format week num with leading zeros so 1-9 are converted to 01-09 for %V format -// formattedWeekNum := fmt.Sprintf("%02d", week) -// file1PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) -// file2PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService2Uuid, volume_consts.Filetype) -// file3PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService3Uuid, volume_consts.Filetype) -// -// mapFs := volume_filesystem.NewMockedVolumeFilesystem() -// -// file1, _ := mapFs.Create(file1PathStr) -// _, _ = file1.WriteString(logLinesStr) -// -// file2, _ := mapFs.Create(file2PathStr) -// _, _ = file2.WriteString(logLinesStr) -// -// file3, _ := mapFs.Create(file3PathStr) -// _, _ = file3.WriteString(logLinesStr) -// -// return mapFs -//} -// -//func createEmptyPerFileFilesystem() volume_filesystem.VolumeFilesystem { -// file1PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) -// file2PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService2Uuid, volume_consts.Filetype) -// file3PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService3Uuid, volume_consts.Filetype) -// -// mapFs := volume_filesystem.NewMockedVolumeFilesystem() -// -// _, _ = mapFs.Create(file1PathStr) -// _, _ = mapFs.Create(file2PathStr) -// _, _ = mapFs.Create(file3PathStr) -// -// return mapFs -//} -// -//func createEmptyPerWeekFilesystem(week int) volume_filesystem.VolumeFilesystem { -// // %02d to format week num with leading zeros so 1-9 are converted to 01-09 for %V format -// formattedWeekNum := fmt.Sprintf("%02d", week) -// file1PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) -// file2PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService2Uuid, volume_consts.Filetype) -// file3PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService3Uuid, volume_consts.Filetype) -// -// mapFs := volume_filesystem.NewMockedVolumeFilesystem() -// -// _, _ = mapFs.Create(file1PathStr) -// _, _ = mapFs.Create(file2PathStr) -// _, _ = mapFs.Create(file3PathStr) -// -// return mapFs -//} +func TestStreamUserServiceLogs_WithFilters(t *testing.T) { + expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ + testUserService1Uuid: 2, + testUserService2Uuid: 2, + testUserService3Uuid: 2, + } + + firstTextFilter := logline.NewDoesContainTextLogLineFilter(firstFilterText) + secondTextFilter := logline.NewDoesNotContainTextLogLineFilter(secondFilterText) + regexFilter := logline.NewDoesContainMatchRegexLogLineFilter(firstMatchRegexFilterStr) + + logLinesFilters := []logline.LogLineFilter{ + *firstTextFilter, + *secondTextFilter, + *regexFilter, + } + + expectedFirstLogLine := "Starting feature 'runs idempotently'" + + userServiceUuids := map[service.ServiceUUID]bool{ + testUserService1Uuid: true, + testUserService2Uuid: true, + testUserService3Uuid: true, + } + + underlyingFs := createFilledPerFileFilesystem() + perFileStreamStrategy := stream_logs_strategy.NewPerFileStreamLogsStrategy() + + receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( + t, + logLinesFilters, + userServiceUuids, + expectedServiceAmountLogLinesByServiceUuid, + doNotFollowLogs, + underlyingFs, + perFileStreamStrategy, + ) + require.NoError(t, testEvaluationErr) + + for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { + expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] + require.True(t, found) + require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) + require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) + } +} + +func TestStreamUserServiceLogsPerWeek_WithFilters(t *testing.T) { + expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ + testUserService1Uuid: 2, + testUserService2Uuid: 2, + testUserService3Uuid: 2, + } + + firstTextFilter := logline.NewDoesContainTextLogLineFilter(firstFilterText) + secondTextFilter := logline.NewDoesNotContainTextLogLineFilter(secondFilterText) + regexFilter := logline.NewDoesContainMatchRegexLogLineFilter(firstMatchRegexFilterStr) + + logLinesFilters := []logline.LogLineFilter{ + *firstTextFilter, + *secondTextFilter, + *regexFilter, + } + + expectedFirstLogLine := "Starting feature 'runs idempotently'" + + userServiceUuids := map[service.ServiceUUID]bool{ + testUserService1Uuid: true, + testUserService2Uuid: true, + testUserService3Uuid: true, + } + + underlyingFs := createFilledPerWeekFilesystem(startingWeek) + mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay) + perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) + + receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( + t, + logLinesFilters, + userServiceUuids, + expectedServiceAmountLogLinesByServiceUuid, + doNotFollowLogs, + underlyingFs, + perWeekStreamStrategy, + ) + + for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { + expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] + require.True(t, found) + require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) + require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) + } + + require.NoError(t, testEvaluationErr) +} + +func TestStreamUserServiceLogs_NoLogsFromPersistentVolume(t *testing.T) { + expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ + testUserService1Uuid: 0, + testUserService2Uuid: 0, + testUserService3Uuid: 0, + } + + firstTextFilter := logline.NewDoesContainTextLogLineFilter(notFoundedFilterText) + + logLinesFilters := []logline.LogLineFilter{ + *firstTextFilter, + } + + userServiceUuids := map[service.ServiceUUID]bool{ + testUserService1Uuid: true, + testUserService2Uuid: true, + testUserService3Uuid: true, + } + + underlyingFs := createEmptyPerFileFilesystem() + perFileStreamStrategy := stream_logs_strategy.NewPerFileStreamLogsStrategy() + + receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( + t, + logLinesFilters, + userServiceUuids, + expectedServiceAmountLogLinesByServiceUuid, + doNotFollowLogs, + underlyingFs, + perFileStreamStrategy, + ) + require.NoError(t, testEvaluationErr) + + for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { + expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] + require.True(t, found) + require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) + } +} + +func TestStreamUserServiceLogsPerWeek_NoLogsFromPersistentVolume(t *testing.T) { + expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ + testUserService1Uuid: 0, + testUserService2Uuid: 0, + testUserService3Uuid: 0, + } + + firstTextFilter := logline.NewDoesContainTextLogLineFilter(notFoundedFilterText) + + logLinesFilters := []logline.LogLineFilter{ + *firstTextFilter, + } + + userServiceUuids := map[service.ServiceUUID]bool{ + testUserService1Uuid: true, + testUserService2Uuid: true, + testUserService3Uuid: true, + } + + underlyingFs := createEmptyPerWeekFilesystem(startingWeek) + mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay) + perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) + + receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( + t, + logLinesFilters, + userServiceUuids, + expectedServiceAmountLogLinesByServiceUuid, + doNotFollowLogs, + underlyingFs, + perWeekStreamStrategy, + ) + require.NoError(t, testEvaluationErr) + + for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { + expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] + require.True(t, found) + require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) + } +} + +func TestStreamUserServiceLogs_ThousandsOfLogLinesSuccessfulExecution(t *testing.T) { + expectedAmountLogLines := 10_000 + + expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ + testUserService1Uuid: expectedAmountLogLines, + } + + var emptyFilters []logline.LogLineFilter + + expectedFirstLogLine := "Starting feature 'centralized logs'" + + var logLines []string + + for i := 0; i <= expectedAmountLogLines; i++ { + logLines = append(logLines, logLine1) + } + + logLinesStr := strings.Join(logLines, "\n") + + userServiceUuids := map[service.ServiceUUID]bool{ + testUserService1Uuid: true, + } + + underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() + + file1PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, string(enclaveUuid), testUserService1Uuid, volume_consts.Filetype) + file1, err := underlyingFs.Create(file1PathStr) + require.NoError(t, err) + _, err = file1.WriteString(logLinesStr) + require.NoError(t, err) + + perFileStreamStrategy := stream_logs_strategy.NewPerFileStreamLogsStrategy() + + receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( + t, + emptyFilters, + userServiceUuids, + expectedServiceAmountLogLinesByServiceUuid, + doNotFollowLogs, + underlyingFs, + perFileStreamStrategy, + ) + require.NoError(t, testEvaluationErr) + + for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { + expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] + require.True(t, found) + require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) + require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) + } +} + +func TestStreamUserServiceLogsPerWeek_ThousandsOfLogLinesSuccessfulExecution(t *testing.T) { + expectedAmountLogLines := 10_000 + + expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ + testUserService1Uuid: expectedAmountLogLines, + } + + var emptyFilters []logline.LogLineFilter + + expectedFirstLogLine := "Starting feature 'centralized logs'" + + var logLines []string + + for i := 0; i <= expectedAmountLogLines; i++ { + logLines = append(logLines, logLine1) + } + + logLinesStr := strings.Join(logLines, "\n") + + userServiceUuids := map[service.ServiceUUID]bool{ + testUserService1Uuid: true, + } + + underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() + // %02d to format week num with leading zeros so 1-9 are converted to 01-09 for %V format + formattedWeekNum := fmt.Sprintf("%02d", startingWeek) + file1PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, string(enclaveUuid), testUserService1Uuid, volume_consts.Filetype) + file1, err := underlyingFs.Create(file1PathStr) + require.NoError(t, err) + _, err = file1.WriteString(logLinesStr) + require.NoError(t, err) + + mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay) + perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) + + receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( + t, + emptyFilters, + userServiceUuids, + expectedServiceAmountLogLinesByServiceUuid, + doNotFollowLogs, + underlyingFs, + perWeekStreamStrategy, + ) + require.NoError(t, testEvaluationErr) + + for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { + expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] + require.True(t, found) + require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) + require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) + } +} + +func TestStreamUserServiceLogs_EmptyLogLines(t *testing.T) { + expectedAmountLogLines := 0 + + expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ + testUserService1Uuid: expectedAmountLogLines, + } + + var emptyFilters []logline.LogLineFilter + + userServiceUuids := map[service.ServiceUUID]bool{ + testUserService1Uuid: true, + } + + logLinesStr := "" + + underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() + file1PathStr := fmt.Sprintf("%s%s/%s%s", volume_consts.LogsStorageDirpath, string(enclaveUuid), testUserService1Uuid, volume_consts.Filetype) + file1, err := underlyingFs.Create(file1PathStr) + require.NoError(t, err) + _, err = file1.WriteString(logLinesStr) + require.NoError(t, err) + + perFileStreamStrategy := stream_logs_strategy.NewPerFileStreamLogsStrategy() + + receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( + t, + emptyFilters, + userServiceUuids, + expectedServiceAmountLogLinesByServiceUuid, + doNotFollowLogs, + underlyingFs, + perFileStreamStrategy, + ) + require.NoError(t, testEvaluationErr) + + for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { + expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] + require.True(t, found) + require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) + } +} + +func TestStreamUserServiceLogsPerWeek_EmptyLogLines(t *testing.T) { + expectedAmountLogLines := 0 + + expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ + testUserService1Uuid: expectedAmountLogLines, + } + + var emptyFilters []logline.LogLineFilter + + userServiceUuids := map[service.ServiceUUID]bool{ + testUserService1Uuid: true, + } + + logLinesStr := "" + + underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() + formattedWeekNum := fmt.Sprintf("%02d", startingWeek) + file1PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, string(enclaveUuid), testUserService1Uuid, volume_consts.Filetype) + file1, err := underlyingFs.Create(file1PathStr) + require.NoError(t, err) + _, err = file1.WriteString(logLinesStr) + require.NoError(t, err) + + mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay) + perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) + + receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( + t, + emptyFilters, + userServiceUuids, + expectedServiceAmountLogLinesByServiceUuid, + doNotFollowLogs, + underlyingFs, + perWeekStreamStrategy, + ) + require.NoError(t, testEvaluationErr) + + for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { + expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] + require.True(t, found) + require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) + } +} + +func TestStreamUserServiceLogsPerWeek_WithLogsAcrossWeeks(t *testing.T) { + expectedAmountLogLines := 8 + + expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ + testUserService1Uuid: expectedAmountLogLines, + } + + var logLinesFilters []logline.LogLineFilter + + userServiceUuids := map[service.ServiceUUID]bool{ + testUserService1Uuid: true, + } + + expectedFirstLogLine := "Starting feature 'centralized logs'" + + week4logLines := []string{ + logLine5, + logLine6, + logLine7, + logLine8} + week3logLines := []string{ + logLine1, + logLine2, + logLine3a, + logLine3b, + logLine4} + + underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() + + week3logLinesStr := strings.Join(week3logLines, "\n") + "\n" + week4logLinesStr := strings.Join(week4logLines, "\n") + + formattedWeekFour := fmt.Sprintf("%02d", 4) + week4filepath := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekFour, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) + week4, err := underlyingFs.Create(week4filepath) + require.NoError(t, err) + _, err = week4.WriteString(week4logLinesStr) + require.NoError(t, err) + + formattedWeekThree := fmt.Sprintf("%02d", 3) + week3filepath := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekThree, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) + week3, err := underlyingFs.Create(week3filepath) + require.NoError(t, err) + _, err = week3.WriteString(week3logLinesStr) + require.NoError(t, err) + + mockTime := logs_clock.NewMockLogsClock(defaultYear, 4, defaultDay) + perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) + + receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( + t, + logLinesFilters, + userServiceUuids, + expectedServiceAmountLogLinesByServiceUuid, + doNotFollowLogs, + underlyingFs, + perWeekStreamStrategy, + ) + require.NoError(t, testEvaluationErr) + + for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { + expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] + require.True(t, found) + require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) + require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) + } + +} + +func TestStreamUserServiceLogsPerWeek_WithLogLineAcrossWeeks(t *testing.T) { + expectedAmountLogLines := 8 + + expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ + testUserService1Uuid: expectedAmountLogLines, + } + + var logLinesFilters []logline.LogLineFilter + + userServiceUuids := map[service.ServiceUUID]bool{ + testUserService1Uuid: true, + } + + expectedFirstLogLine := "Starting feature 'centralized logs'" + + week4logLines := []string{ + logLine3b, + logLine4, + logLine5, + logLine6, + logLine7, + logLine8} + week3logLines := []string{ + logLine1, + logLine2, + logLine3a} + + underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() + + week3logLinesStr := strings.Join(week3logLines, "\n") + "\n" + week4logLinesStr := strings.Join(week4logLines, "\n") + "\n" + + formattedWeekFour := fmt.Sprintf("%02d", 4) + week4filepath := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekFour, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) + week4, err := underlyingFs.Create(week4filepath) + require.NoError(t, err) + _, err = week4.WriteString(week4logLinesStr) + require.NoError(t, err) + + formattedWeekThree := fmt.Sprintf("%02d", 3) + week3filepath := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekThree, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) + week3, err := underlyingFs.Create(week3filepath) + require.NoError(t, err) + _, err = week3.WriteString(week3logLinesStr) + require.NoError(t, err) + + mockTime := logs_clock.NewMockLogsClock(defaultYear, 4, defaultDay) + perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) + + receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( + t, + logLinesFilters, + userServiceUuids, + expectedServiceAmountLogLinesByServiceUuid, + doNotFollowLogs, + underlyingFs, + perWeekStreamStrategy, + ) + require.NoError(t, testEvaluationErr) + + for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { + expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] + require.True(t, found) + require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) + require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) + } +} + +func TestStreamUserServiceLogsPerWeekReturnsTimestampedLogLines(t *testing.T) { + expectedAmountLogLines := 3 + + expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ + testUserService1Uuid: expectedAmountLogLines, + } + + var logLinesFilters []logline.LogLineFilter + + userServiceUuids := map[service.ServiceUUID]bool{ + testUserService1Uuid: true, + } + + timedLogLine1 := fmt.Sprintf("{\"log\":\"Starting feature 'centralized logs'\", \"timestamp\":\"%v\"}", defaultUTCTimestampStr) + timedLogLine2 := fmt.Sprintf("{\"log\":\"Starting feature 'runs idempotently'\", \"timestamp\":\"%v\"}", defaultUTCTimestampStr) + timedLogLine3 := fmt.Sprintf("{\"log\":\"The enclave was created\", \"timestamp\":\"%v\"}", defaultUTCTimestampStr) + + timestampedLogLines := []string{timedLogLine1, timedLogLine2, timedLogLine3} + timestampedLogLinesStr := strings.Join(timestampedLogLines, "\n") + "\n" + + underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() + + formattedWeekNum := fmt.Sprintf("%02d", startingWeek) + filepath := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) + file, err := underlyingFs.Create(filepath) + require.NoError(t, err) + _, err = file.WriteString(timestampedLogLinesStr) + require.NoError(t, err) + + mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay) + perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) + + expectedTime, err := time.Parse(utcFormat, defaultUTCTimestampStr) + require.NoError(t, err) + + receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( + t, + logLinesFilters, + userServiceUuids, + expectedServiceAmountLogLinesByServiceUuid, + doNotFollowLogs, + underlyingFs, + perWeekStreamStrategy, + ) + require.NoError(t, testEvaluationErr) + + for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { + expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] + require.True(t, found) + require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) + for _, logLine := range serviceLogLines { + require.Equal(t, expectedTime, logLine.GetTimestamp()) + } + } +} + +func TestStreamUserServiceLogsPerFileReturnsTimestampedLogLines(t *testing.T) { + expectedAmountLogLines := 3 + + expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ + testUserService1Uuid: expectedAmountLogLines, + } + + var logLinesFilters []logline.LogLineFilter + + userServiceUuids := map[service.ServiceUUID]bool{ + testUserService1Uuid: true, + } + + timedLogLine1 := fmt.Sprintf("{\"log\":\"Starting feature 'centralized logs'\", \"timestamp\":\"%v\"}", defaultUTCTimestampStr) + timedLogLine2 := fmt.Sprintf("{\"log\":\"Starting feature 'runs idempotently'\", \"timestamp\":\"%v\"}", defaultUTCTimestampStr) + timedLogLine3 := fmt.Sprintf("{\"log\":\"The enclave was created\", \"timestamp\":\"%v\"}", defaultUTCTimestampStr) + + timestampedLogLines := []string{timedLogLine1, timedLogLine2, timedLogLine3} + timestampedLogLinesStr := strings.Join(timestampedLogLines, "\n") + "\n" + + underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() + + filepath := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) + file, err := underlyingFs.Create(filepath) + require.NoError(t, err) + _, err = file.WriteString(timestampedLogLinesStr) + require.NoError(t, err) + + perFileStreamStrategy := stream_logs_strategy.NewPerFileStreamLogsStrategy() + + expectedTime, err := time.Parse(utcFormat, defaultUTCTimestampStr) + require.NoError(t, err) + + receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( + t, + logLinesFilters, + userServiceUuids, + expectedServiceAmountLogLinesByServiceUuid, + doNotFollowLogs, + underlyingFs, + perFileStreamStrategy, + ) + require.NoError(t, testEvaluationErr) + + for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { + expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] + require.True(t, found) + require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) + require.Equal(t, expectedTime, serviceLogLines[0].GetTimestamp()) + } +} + +// // ==================================================================================================== +// // +// // Private helper functions +// +// ==================================================================================================== +func executeStreamCallAndGetReceivedServiceLogLines( + t *testing.T, + logLinesFilters []logline.LogLineFilter, + userServiceUuids map[service.ServiceUUID]bool, + expectedServiceAmountLogLinesByServiceUuid map[service.ServiceUUID]int, + shouldFollowLogs bool, + underlyingFs volume_filesystem.VolumeFilesystem, + streamStrategy stream_logs_strategy.StreamLogsStrategy, +) (map[service.ServiceUUID][]logline.LogLine, error) { + ctx := context.Background() + + receivedServiceLogsByUuid := map[service.ServiceUUID][]logline.LogLine{} + + for serviceUuid := range expectedServiceAmountLogLinesByServiceUuid { + receivedServiceLogsByUuid[serviceUuid] = []logline.LogLine{} + } + + kurtosisBackend := backend_interface.NewMockKurtosisBackend(t) + + logsDatabaseClient := NewPersistentVolumeLogsDatabaseClient(kurtosisBackend, underlyingFs, streamStrategy) + + userServiceLogsByUuidChan, errChan, receivedCancelCtxFunc, err := logsDatabaseClient.StreamUserServiceLogs(ctx, enclaveUuid, userServiceUuids, logLinesFilters, shouldFollowLogs, defaultShouldReturnAllLogs, defaultNumLogLines) + if err != nil { + return nil, stacktrace.Propagate(err, "An error occurred getting user service logs for UUIDs '%+v' using log line filters '%v' in enclave '%v'", userServiceUuids, logLinesFilters, enclaveUuid) + } + defer func() { + if receivedCancelCtxFunc != nil { + receivedCancelCtxFunc() + } + }() + + require.NotNil(t, userServiceLogsByUuidChan, "Received a nil user service logs channel, but a non-nil value was expected") + require.NotNil(t, errChan, "Received a nil error logs channel, but a non-nil value was expected") + + shouldReceiveStream := true + for shouldReceiveStream { + select { + case <-time.Tick(testTimeOut): + return nil, stacktrace.NewError("Receiving stream logs in the test has reached the '%v' time out", testTimeOut) + case streamErr, isChanOpen := <-errChan: + if !isChanOpen { + shouldReceiveStream = false + break + } + return nil, stacktrace.Propagate(streamErr, "Receiving streaming error.") + case userServiceLogsByUuid, isChanOpen := <-userServiceLogsByUuidChan: + if !isChanOpen { + shouldReceiveStream = false + break + } + + for serviceUuid, serviceLogLines := range userServiceLogsByUuid { + _, found := userServiceUuids[serviceUuid] + require.True(t, found) + + currentServiceLogLines := receivedServiceLogsByUuid[serviceUuid] + allServiceLogLines := append(currentServiceLogLines, serviceLogLines...) + receivedServiceLogsByUuid[serviceUuid] = allServiceLogLines + } + + for serviceUuid, expectedAmountLogLines := range expectedServiceAmountLogLinesByServiceUuid { + if len(receivedServiceLogsByUuid[serviceUuid]) == expectedAmountLogLines { + shouldReceiveStream = false + } else { + shouldReceiveStream = true + break + } + } + } + } + + return receivedServiceLogsByUuid, nil +} + +func createFilledPerFileFilesystem() volume_filesystem.VolumeFilesystem { + logLines := []string{logLine1, logLine2, logLine3a, logLine3b, logLine4, logLine5, logLine6, logLine7, logLine8} + + logLinesStr := strings.Join(logLines, "\n") + + file1PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) + file2PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService2Uuid, volume_consts.Filetype) + file3PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService3Uuid, volume_consts.Filetype) + + mapFs := volume_filesystem.NewMockedVolumeFilesystem() + + file1, _ := mapFs.Create(file1PathStr) + _, _ = file1.WriteString(logLinesStr) + + file2, _ := mapFs.Create(file2PathStr) + _, _ = file2.WriteString(logLinesStr) + + file3, _ := mapFs.Create(file3PathStr) + _, _ = file3.WriteString(logLinesStr) + + return mapFs +} + +func createFilledPerWeekFilesystem(week int) volume_filesystem.VolumeFilesystem { + logLines := []string{logLine1, logLine2, logLine3a, logLine3b, logLine4, logLine5, logLine6, logLine7, logLine8} + + logLinesStr := strings.Join(logLines, "\n") + // %02d to format week num with leading zeros so 1-9 are converted to 01-09 for %V format + formattedWeekNum := fmt.Sprintf("%02d", week) + file1PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) + file2PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService2Uuid, volume_consts.Filetype) + file3PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService3Uuid, volume_consts.Filetype) + + mapFs := volume_filesystem.NewMockedVolumeFilesystem() + + file1, _ := mapFs.Create(file1PathStr) + _, _ = file1.WriteString(logLinesStr) + + file2, _ := mapFs.Create(file2PathStr) + _, _ = file2.WriteString(logLinesStr) + + file3, _ := mapFs.Create(file3PathStr) + _, _ = file3.WriteString(logLinesStr) + + return mapFs +} + +func createEmptyPerFileFilesystem() volume_filesystem.VolumeFilesystem { + file1PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) + file2PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService2Uuid, volume_consts.Filetype) + file3PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService3Uuid, volume_consts.Filetype) + + mapFs := volume_filesystem.NewMockedVolumeFilesystem() + + _, _ = mapFs.Create(file1PathStr) + _, _ = mapFs.Create(file2PathStr) + _, _ = mapFs.Create(file3PathStr) + + return mapFs +} + +func createEmptyPerWeekFilesystem(week int) volume_filesystem.VolumeFilesystem { + // %02d to format week num with leading zeros so 1-9 are converted to 01-09 for %V format + formattedWeekNum := fmt.Sprintf("%02d", week) + file1PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) + file2PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService2Uuid, volume_consts.Filetype) + file3PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService3Uuid, volume_consts.Filetype) + + mapFs := volume_filesystem.NewMockedVolumeFilesystem() + + _, _ = mapFs.Create(file1PathStr) + _, _ = mapFs.Create(file2PathStr) + _, _ = mapFs.Create(file3PathStr) + + return mapFs +} diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go index 79fcd046fb..753776cdfa 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go @@ -192,17 +192,15 @@ func (strategy *PerWeekStreamLogsStrategy) streamAllLogs( jsonLogStr, err := getCompleteJsonLogString(logsReader) if isValidJsonEnding(jsonLogStr) { - var logLine logline.LogLine jsonLog, err := convertStringToJson(jsonLogStr) if err != nil { return stacktrace.Propagate(err, "An error occurred converting the json log string '%v' into json.", jsonLogStr) } - logLine, err = strategy.processJsonLogLine(jsonLog, conjunctiveLogLinesFiltersWithRegex) + err = strategy.sendJsonLogLine(jsonLog, conjunctiveLogLinesFiltersWithRegex, logLineSender, serviceUuid) if err != nil { return err } - logLineSender.SendLogLine(serviceUuid, logLine) } if err != nil { @@ -260,11 +258,10 @@ func (strategy *PerWeekStreamLogsStrategy) streamTailLogs( if err != nil { return stacktrace.Propagate(err, "An error occurred converting the json log string '%v' into json.", jsonLogStr) } - logLine, err := strategy.processJsonLogLine(jsonLog, conjunctiveLogLinesFiltersWithRegex) + err = strategy.sendJsonLogLine(jsonLog, conjunctiveLogLinesFiltersWithRegex, logLineSender, serviceUuid) if err != nil { return err } - logLineSender.SendLogLine(serviceUuid, logLine) } return nil @@ -305,9 +302,7 @@ func isValidJsonEnding(line string) bool { return endOfLine == volume_consts.EndOfJsonLine } -func (strategy *PerWeekStreamLogsStrategy) processJsonLogLine( - jsonLog JsonLog, - conjunctiveLogLinesFiltersWithRegex []logline.LogLineFilterWithRegex) (logline.LogLine, error) { +func (strategy *PerWeekStreamLogsStrategy) sendJsonLogLine(jsonLog JsonLog, conjunctiveLogLinesFiltersWithRegex []logline.LogLineFilterWithRegex, logLineSender *logline.LogLineSender, serviceUuid service.ServiceUUID) error { // each logLineStr is of the following structure: {"enclave_uuid": "...", "service_uuid":"...", "log": "...",.. "timestamp":"..."} // eg. {"container_type":"api-container", "container_id":"8f8558ba", "container_name":"/kurtosis-api--ffd", // "log":"hi","timestamp":"2023-08-14T14:57:49Z"} @@ -315,35 +310,36 @@ func (strategy *PerWeekStreamLogsStrategy) processJsonLogLine( // Then extract the actual log message using the vectors log field logMsgStr, found := jsonLog[volume_consts.LogLabel] if !found { - return logline.LogLine{}, stacktrace.NewError("An error retrieving the log field '%v' from json log: %v\n", volume_consts.LogLabel, jsonLog) + return stacktrace.NewError("An error retrieving the log field '%v' from json log: %v\n", volume_consts.LogLabel, jsonLog) } // Extract the timestamp using vectors timestamp field logTimestamp, err := parseTimestampFromJsonLogLine(jsonLog) if err != nil { - return logline.LogLine{}, stacktrace.Propagate(err, "An error occurred parsing timestamp from json log line.") + return stacktrace.Propagate(err, "An error occurred parsing timestamp from json log line.") } logLine := logline.NewLogLine(logMsgStr, *logTimestamp) // Then filter by checking if the log message is valid based on requested filters validLogLine, err := logLine.IsValidLogLineBaseOnFilters(conjunctiveLogLinesFiltersWithRegex) if err != nil { - return logline.LogLine{}, stacktrace.Propagate(err, "An error occurred filtering log line '%+v' using filters '%+v'", logLine, conjunctiveLogLinesFiltersWithRegex) + return stacktrace.Propagate(err, "An error occurred filtering log line '%+v' using filters '%+v'", logLine, conjunctiveLogLinesFiltersWithRegex) } if !validLogLine { - return logline.LogLine{}, nil + return nil } // ensure this log line is within the retention period if it has a timestamp withinRetentionPeriod, err := strategy.isWithinRetentionPeriod(logLine) if err != nil { - return logline.LogLine{}, stacktrace.Propagate(err, "An error occurred filtering log line '%+v' using filters '%+v'", logLine, conjunctiveLogLinesFiltersWithRegex) + return stacktrace.Propagate(err, "An error occurred filtering log line '%+v' using filters '%+v'", logLine, conjunctiveLogLinesFiltersWithRegex) } if !withinRetentionPeriod { - return logline.LogLine{}, nil + return nil } - return *logLine, nil + logLineSender.SendLogLine(serviceUuid, *logLine) + return nil } // Returns true if [logLine] has no timestamp @@ -398,11 +394,10 @@ func (strategy *PerWeekStreamLogsStrategy) followLogs( // if tail package fails to parse a valid new line, fail fast return stacktrace.NewError("hpcloud/tail returned the following line: '%v' that was not valid json.\nThis is potentially a bug in tailing package.", logLine.Text) } - processedLogLine, err := strategy.processJsonLogLine(jsonLog, conjunctiveLogLinesFiltersWithRegex) + err = strategy.sendJsonLogLine(jsonLog, conjunctiveLogLinesFiltersWithRegex, logLineSender, serviceUuid) if err != nil { return stacktrace.Propagate(err, "An error occurred sending json log line '%v'.", logLine.Text) } - logLineSender.SendLogLine(serviceUuid, processedLogLine) } } } diff --git a/engine/server/engine/centralized_logs/logline/logline_sender.go b/engine/server/engine/centralized_logs/logline/logline_sender.go index 871041dbc3..d92375d1d5 100644 --- a/engine/server/engine/centralized_logs/logline/logline_sender.go +++ b/engine/server/engine/centralized_logs/logline/logline_sender.go @@ -1,36 +1,44 @@ package logline -import "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service" +import ( + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service" + "sync" +) const ( - batchLogsAmount = 500 - logsChanBufferSize = 300 + batchLogsAmount = 1 + logsChanBufferSize = 1 ) type LogLineSender struct { logsChan chan map[service.ServiceUUID][]LogLine - logLineBuffer []LogLine + logLineBuffer map[service.ServiceUUID][]LogLine + + sync.Mutex } func NewLogLineSender() *LogLineSender { return &LogLineSender{ - logsChan: make(chan map[service.ServiceUUID][]LogLine, logsChanBufferSize), - logLineBuffer: []LogLine{}, + logsChan: make(chan map[service.ServiceUUID][]LogLine), + logLineBuffer: map[service.ServiceUUID][]LogLine{}, } } func (sender *LogLineSender) SendLogLine(serviceUuid service.ServiceUUID, logLine LogLine) { - sender.logLineBuffer = append(sender.logLineBuffer, logLine) + sender.Mutex.Lock() + defer sender.Mutex.Unlock() + + sender.logLineBuffer[serviceUuid] = append(sender.logLineBuffer[serviceUuid], logLine) - if len(sender.logLineBuffer)%batchLogsAmount == 0 { + if len(sender.logLineBuffer[serviceUuid])%batchLogsAmount == 0 { userServicesLogLinesMap := map[service.ServiceUUID][]LogLine{ - serviceUuid: sender.logLineBuffer, + serviceUuid: sender.logLineBuffer[serviceUuid], } sender.logsChan <- userServicesLogLinesMap // clear buffer after flushing it through the channel - sender.logLineBuffer = []LogLine{} + sender.logLineBuffer[serviceUuid] = []LogLine{} } } From 5fe30ffde1de6e93adc6445af61e47d4097497b2 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Fri, 9 Aug 2024 00:19:27 -0400 Subject: [PATCH 08/78] flush logs and close channel when empty --- .../persistent_volume_logs_database_client.go | 15 ++++++++++++- .../logline/logline_sender.go | 21 ++++++++++++++++--- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client.go index 02e6544318..d709f9fb28 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client.go @@ -89,7 +89,11 @@ func (client *persistentVolumeLogsDatabaseClient) StreamUserServiceLogs( //wait for stream go routine to end wgSenders.Wait() - close(logsByKurtosisUserServiceUuidChan) + // send all buffered log lines + logLineSender.Flush() + + // wait until the channel has been fully read/empty before closing it + closeChannelWhenEmpty(logsByKurtosisUserServiceUuidChan) close(streamErrChan) //then cancel the context @@ -154,3 +158,12 @@ func (client *persistentVolumeLogsDatabaseClient) streamServiceLogLines( shouldReturnAllLogs, numLogLines) } + +func closeChannelWhenEmpty(logsChan chan map[service.ServiceUUID][]logline.LogLine) { + for { + if len(logsChan) == 0 { + close(logsChan) + return + } + } +} diff --git a/engine/server/engine/centralized_logs/logline/logline_sender.go b/engine/server/engine/centralized_logs/logline/logline_sender.go index d92375d1d5..4877226f0c 100644 --- a/engine/server/engine/centralized_logs/logline/logline_sender.go +++ b/engine/server/engine/centralized_logs/logline/logline_sender.go @@ -6,8 +6,8 @@ import ( ) const ( - batchLogsAmount = 1 - logsChanBufferSize = 1 + batchLogsAmount = 500 + logsChanBufferSize = 300 ) type LogLineSender struct { @@ -20,7 +20,7 @@ type LogLineSender struct { func NewLogLineSender() *LogLineSender { return &LogLineSender{ - logsChan: make(chan map[service.ServiceUUID][]LogLine), + logsChan: make(chan map[service.ServiceUUID][]LogLine, logsChanBufferSize), logLineBuffer: map[service.ServiceUUID][]LogLine{}, } } @@ -45,3 +45,18 @@ func (sender *LogLineSender) SendLogLine(serviceUuid service.ServiceUUID, logLin func (sender *LogLineSender) GetLogsChannel() chan map[service.ServiceUUID][]LogLine { return sender.logsChan } + +// sends all logs remaining in the buffers through the channel +// this should be called at the end of processing to send the remainder of logs +func (sender *LogLineSender) Flush() { + sender.Mutex.Lock() + defer sender.Mutex.Unlock() + + for uuid, logLines := range sender.logLineBuffer { + serviceUuid := uuid + userServiceLogLinesMap := map[service.ServiceUUID][]LogLine{ + serviceUuid: logLines, + } + sender.logsChan <- userServiceLogLinesMap + } +} From 929f4b236119554f6f0c23ebdc38fbf5d91bfa72 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Fri, 9 Aug 2024 00:34:46 -0400 Subject: [PATCH 09/78] clean up --- cli/cli/commands/service/logs/logs.go | 7 ------- .../persistent_volume_logs_database_client.go | 3 +-- ...rsistent_volume_logs_database_client_test.go | 6 +++--- .../per_week_stream_logs_strategy.go | 9 +++------ .../server/engine_connect_server_service.go | 17 ----------------- 5 files changed, 7 insertions(+), 35 deletions(-) diff --git a/cli/cli/commands/service/logs/logs.go b/cli/cli/commands/service/logs/logs.go index 028039224c..550cb5df0b 100644 --- a/cli/cli/commands/service/logs/logs.go +++ b/cli/cli/commands/service/logs/logs.go @@ -27,7 +27,6 @@ import ( "os" "os/signal" "strconv" - "time" ) const ( @@ -263,16 +262,13 @@ func run( interruptChan := make(chan os.Signal, interruptChanBufferSize) signal.Notify(interruptChan, os.Interrupt) - var totalLogPrintDuration time.Duration for { select { case serviceLogsStreamContent, isChanOpen := <-serviceLogsStreamContentChan: if !isChanOpen { - logrus.Infof("CLI [logs.txt] TOTAL TIME TO PRINT LOGS: %v", totalLogPrintDuration) return nil } - startTime := time.Now() notFoundServiceUuids := serviceLogsStreamContent.GetNotFoundServiceUuids() for notFoundServiceUuid := range notFoundServiceUuids { @@ -291,11 +287,8 @@ func run( out.PrintOutLn(fmt.Sprintf("[%v] %v", colorPrinter(serviceIdentifier), serviceLog.GetContent())) } } - endTime := time.Now() - totalLogPrintDuration = endTime.Sub(startTime) case <-interruptChan: logrus.Debugf("Received signal interruption in service logs Kurtosis CLI command") - logrus.Infof("CLI [logs.go] TOTAL TIME TO PRINT LOGS: %v", totalLogPrintDuration) return nil } } diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client.go index d709f9fb28..6880e8db3e 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client.go @@ -13,8 +13,7 @@ import ( ) const ( - logLineBufferSize = 300 - oneSenderAdded = 1 + oneSenderAdded = 1 ) // persistentVolumeLogsDatabaseClient pulls logs from a Docker volume the engine is mounted to diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go index 4bcb3378ff..82f14c00e9 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go @@ -670,9 +670,9 @@ func TestStreamUserServiceLogsPerFileReturnsTimestampedLogLines(t *testing.T) { } } -// // ==================================================================================================== -// // -// // Private helper functions +// ==================================================================================================== +// +// Private helper functions // // ==================================================================================================== func executeStreamCallAndGetReceivedServiceLogLines( diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go index 753776cdfa..fc6533c5a3 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go @@ -197,8 +197,7 @@ func (strategy *PerWeekStreamLogsStrategy) streamAllLogs( return stacktrace.Propagate(err, "An error occurred converting the json log string '%v' into json.", jsonLogStr) } - err = strategy.sendJsonLogLine(jsonLog, conjunctiveLogLinesFiltersWithRegex, logLineSender, serviceUuid) - if err != nil { + if err = strategy.sendJsonLogLine(jsonLog, conjunctiveLogLinesFiltersWithRegex, logLineSender, serviceUuid); err != nil { return err } } @@ -258,8 +257,7 @@ func (strategy *PerWeekStreamLogsStrategy) streamTailLogs( if err != nil { return stacktrace.Propagate(err, "An error occurred converting the json log string '%v' into json.", jsonLogStr) } - err = strategy.sendJsonLogLine(jsonLog, conjunctiveLogLinesFiltersWithRegex, logLineSender, serviceUuid) - if err != nil { + if err = strategy.sendJsonLogLine(jsonLog, conjunctiveLogLinesFiltersWithRegex, logLineSender, serviceUuid); err != nil { return err } } @@ -394,8 +392,7 @@ func (strategy *PerWeekStreamLogsStrategy) followLogs( // if tail package fails to parse a valid new line, fail fast return stacktrace.NewError("hpcloud/tail returned the following line: '%v' that was not valid json.\nThis is potentially a bug in tailing package.", logLine.Text) } - err = strategy.sendJsonLogLine(jsonLog, conjunctiveLogLinesFiltersWithRegex, logLineSender, serviceUuid) - if err != nil { + if err = strategy.sendJsonLogLine(jsonLog, conjunctiveLogLinesFiltersWithRegex, logLineSender, serviceUuid); err != nil { return stacktrace.Propagate(err, "An error occurred sending json log line '%v'.", logLine.Text) } } diff --git a/engine/server/engine/server/engine_connect_server_service.go b/engine/server/engine/server/engine_connect_server_service.go index a3f3c84225..3fc908e916 100644 --- a/engine/server/engine/server/engine_connect_server_service.go +++ b/engine/server/engine/server/engine_connect_server_service.go @@ -347,8 +347,6 @@ func (service *EngineConnectServerService) GetServiceLogs(ctx context.Context, c } }() - var totalLogStreamDuration time.Duration - var counter int for { select { //stream case @@ -356,39 +354,24 @@ func (service *EngineConnectServerService) GetServiceLogs(ctx context.Context, c //If the channel is closed means that the logs database client won't continue sending streams if !isChanOpen { logrus.Debug("Exiting the stream loop after receiving a close signal from the service logs by service UUID channel") - logrus.Infof("ENGINE [engine_connect_server_service.go] TOTAL TIME TO STREAM LOGS IN ENGINE: %v", totalLogStreamDuration) return nil } - // print out num log lines every 100 lines times - //for serviceUUID, logs := range serviceLogsByServiceUuid { - // if counter%100 == 0 { - // logrus.Infof("NUM LOG LINES FOR SERVICE '%v' CHECK IN ENGINE CONNECT SERVICE: %v", serviceUUID, len(logs)) - // } - //} - - startTime := time.Now() getServiceLogsResponse := newLogsResponse(requestedServiceUuids, serviceLogsByServiceUuid, notFoundServiceUuids) if err := stream.Send(getServiceLogsResponse); err != nil { return stacktrace.Propagate(err, "An error occurred sending the stream logs for service logs response '%+v'", getServiceLogsResponse) } - counter += 1 - endTime := time.Now() - totalLogStreamDuration += endTime.Sub(startTime) //client cancel ctx case case <-contextWithCancel.Done(): logrus.Debug("The user service logs stream has done") - logrus.Infof("ENGINE [engine_connect_server_service.go] TOTAL TIME TO STREAM LOGS IN ENGINE: %v", totalLogStreamDuration) return nil //error from logs database case case err, isChanOpen := <-errChan: if isChanOpen { logrus.Debug("Exiting the stream because an error from the logs database client was received through the error chan.") - logrus.Infof("ENGINE [engine_connect_server_service.go] TOTAL TIME TO STREAM LOGS IN ENGINE: %v", totalLogStreamDuration) return stacktrace.Propagate(err, "An error occurred streaming user service logs.") } logrus.Debug("Exiting the stream loop after receiving a close signal from the error chan") - logrus.Infof("ENGINE [engine_connect_server_service.go] TOTAL TIME TO STREAM LOGS IN ENGINE: %v", totalLogStreamDuration) return nil } } From fdd8bf392f16e43ad4eb0be81f85f723be96f38e Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Fri, 9 Aug 2024 00:52:18 -0400 Subject: [PATCH 10/78] undo build script change --- cli/cli/scripts/build.sh | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/cli/cli/scripts/build.sh b/cli/cli/scripts/build.sh index db8f5d7443..20f1c2893b 100755 --- a/cli/cli/scripts/build.sh +++ b/cli/cli/scripts/build.sh @@ -97,10 +97,9 @@ fi exit 1 fi # Executing goreleaser v1.26.2 without needing to install it -# if ! curl -sfL https://goreleaser.com/static/run | VERSION=v1.26.2 DISTRIBUTION=oss bash -s -- ${goreleaser_verb_and_flags}; then - if ! GORELEASER_CURRENT_TAG=$(cat $root_dirpath/version.txt) goreleaser ${goreleaser_verb_and_flags}; then - echo "Error: Couldn't build the CLI binary for the current OS/arch" >&2 - exit 1 + if ! curl -sfL https://goreleaser.com/static/run | VERSION=v1.26.2 DISTRIBUTION=oss bash -s -- ${goreleaser_verb_and_flags}; then + echo "Error: Couldn't build the CLI binary for the current OS/arch" >&2 + exit 1 fi ) From dc9d1d173c933feccd207eff2d12d419c2b67e72 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Fri, 9 Aug 2024 00:55:54 -0400 Subject: [PATCH 11/78] name mutex --- .../engine/centralized_logs/logline/logline_sender.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/engine/server/engine/centralized_logs/logline/logline_sender.go b/engine/server/engine/centralized_logs/logline/logline_sender.go index 4877226f0c..3b086e8359 100644 --- a/engine/server/engine/centralized_logs/logline/logline_sender.go +++ b/engine/server/engine/centralized_logs/logline/logline_sender.go @@ -15,7 +15,7 @@ type LogLineSender struct { logLineBuffer map[service.ServiceUUID][]LogLine - sync.Mutex + mu sync.Mutex } func NewLogLineSender() *LogLineSender { @@ -26,8 +26,8 @@ func NewLogLineSender() *LogLineSender { } func (sender *LogLineSender) SendLogLine(serviceUuid service.ServiceUUID, logLine LogLine) { - sender.Mutex.Lock() - defer sender.Mutex.Unlock() + sender.mu.Lock() + defer sender.mu.Unlock() sender.logLineBuffer[serviceUuid] = append(sender.logLineBuffer[serviceUuid], logLine) @@ -49,8 +49,8 @@ func (sender *LogLineSender) GetLogsChannel() chan map[service.ServiceUUID][]Log // sends all logs remaining in the buffers through the channel // this should be called at the end of processing to send the remainder of logs func (sender *LogLineSender) Flush() { - sender.Mutex.Lock() - defer sender.Mutex.Unlock() + sender.mu.Lock() + defer sender.mu.Unlock() for uuid, logLines := range sender.logLineBuffer { serviceUuid := uuid From d2b9f86948d96fc0a83349a035c1b8dd4aacf32c Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Fri, 9 Aug 2024 00:58:50 -0400 Subject: [PATCH 12/78] lint --- engine/server/engine/centralized_logs/logline/logline_sender.go | 1 + 1 file changed, 1 insertion(+) diff --git a/engine/server/engine/centralized_logs/logline/logline_sender.go b/engine/server/engine/centralized_logs/logline/logline_sender.go index 3b086e8359..c2dd3fd240 100644 --- a/engine/server/engine/centralized_logs/logline/logline_sender.go +++ b/engine/server/engine/centralized_logs/logline/logline_sender.go @@ -22,6 +22,7 @@ func NewLogLineSender() *LogLineSender { return &LogLineSender{ logsChan: make(chan map[service.ServiceUUID][]LogLine, logsChanBufferSize), logLineBuffer: map[service.ServiceUUID][]LogLine{}, + mu: sync.Mutex{}, } } From 813c98b6b5f1c3306992e02b257c325709b192ea Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Fri, 9 Aug 2024 07:47:18 -0400 Subject: [PATCH 13/78] increase seconds to wait for logs --- .../golang/testsuite/persisted_logs_test/persisted_logs_test.go | 2 +- .../golang/testsuite/stream_logs_test/stream_logs_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/internal_testsuites/golang/testsuite/persisted_logs_test/persisted_logs_test.go b/internal_testsuites/golang/testsuite/persisted_logs_test/persisted_logs_test.go index a991e71154..b1d09b6936 100644 --- a/internal_testsuites/golang/testsuite/persisted_logs_test/persisted_logs_test.go +++ b/internal_testsuites/golang/testsuite/persisted_logs_test/persisted_logs_test.go @@ -39,7 +39,7 @@ const ( logLine3 = "Starting feature 'enclave pool with size 2'" logLine4 = "The data have being loaded" - secondsToWaitForLogs = 1 * time.Second + secondsToWaitForLogs = 2 * time.Second ) var ( diff --git a/internal_testsuites/golang/testsuite/stream_logs_test/stream_logs_test.go b/internal_testsuites/golang/testsuite/stream_logs_test/stream_logs_test.go index 257fc7ff36..2e39e2ac3a 100644 --- a/internal_testsuites/golang/testsuite/stream_logs_test/stream_logs_test.go +++ b/internal_testsuites/golang/testsuite/stream_logs_test/stream_logs_test.go @@ -32,7 +32,7 @@ const ( thirdLogLine = "running" lastLogLine = "successfully" - secondsToWaitForLogs = 1 * time.Second + secondsToWaitForLogs = 2 * time.Second ) var ( From 6349c617b2e10fdf9e7990b3a1e5ae467795a7c6 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Sat, 10 Aug 2024 09:25:38 -0400 Subject: [PATCH 14/78] rename send logl ine --- .../stream_logs_strategy/per_file_stream_logs_strategy.go | 2 +- .../stream_logs_strategy/per_week_stream_logs_strategy.go | 2 +- engine/server/engine/centralized_logs/logline/logline_sender.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_file_stream_logs_strategy.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_file_stream_logs_strategy.go index 6c1f7147b4..b322e8c214 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_file_stream_logs_strategy.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_file_stream_logs_strategy.go @@ -122,7 +122,7 @@ func (strategy *PerFileStreamLogsStrategy) StreamLogs( break } - logLineSender.SendLogLine(serviceUuid, *logLine) + logLineSender.Send(serviceUuid, *logLine) } } } diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go index fc6533c5a3..5f7ce18b3d 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go @@ -336,7 +336,7 @@ func (strategy *PerWeekStreamLogsStrategy) sendJsonLogLine(jsonLog JsonLog, conj return nil } - logLineSender.SendLogLine(serviceUuid, *logLine) + logLineSender.Send(serviceUuid, *logLine) return nil } diff --git a/engine/server/engine/centralized_logs/logline/logline_sender.go b/engine/server/engine/centralized_logs/logline/logline_sender.go index c2dd3fd240..6aa4c6ad0e 100644 --- a/engine/server/engine/centralized_logs/logline/logline_sender.go +++ b/engine/server/engine/centralized_logs/logline/logline_sender.go @@ -26,7 +26,7 @@ func NewLogLineSender() *LogLineSender { } } -func (sender *LogLineSender) SendLogLine(serviceUuid service.ServiceUUID, logLine LogLine) { +func (sender *LogLineSender) Send(serviceUuid service.ServiceUUID, logLine LogLine) { sender.mu.Lock() defer sender.mu.Unlock() From 9510e222513cb798e5cf17a0dd96b6297e1de409 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Sat, 10 Aug 2024 09:40:58 -0400 Subject: [PATCH 15/78] move log line before function --- .../stream_logs_strategy/per_week_stream_logs_strategy.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go index 5f7ce18b3d..86fd788bb9 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go @@ -102,11 +102,11 @@ func (strategy *PerWeekStreamLogsStrategy) StreamLogs( if shouldFollowLogs { latestLogFile := paths[len(paths)-1] + logrus.Debugf("Following logs...") if err := strategy.followLogs(ctx, latestLogFile, logLineSender, serviceUuid, conjunctiveLogLinesFiltersWithRegex); err != nil { streamErrChan <- stacktrace.Propagate(err, "An error occurred creating following logs for service '%v' in enclave '%v'", serviceUuid, enclaveUuid) return } - logrus.Debugf("Following logs...") } } From 3b73af1b85f099406fdaf2bfb635708ec5776f12 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Sat, 10 Aug 2024 09:52:22 -0400 Subject: [PATCH 16/78] flush before follow --- .../stream_logs_strategy/per_week_stream_logs_strategy.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go index 86fd788bb9..1717721392 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go @@ -100,6 +100,8 @@ func (strategy *PerWeekStreamLogsStrategy) StreamLogs( } } + // need to flush before following logs + logLineSender.Flush() if shouldFollowLogs { latestLogFile := paths[len(paths)-1] logrus.Debugf("Following logs...") From 470c61f5cac4c635798015bf5ceeaa73c7a253f0 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Sat, 10 Aug 2024 09:58:59 -0400 Subject: [PATCH 17/78] clear buffers after flushing --- engine/server/engine/centralized_logs/logline/logline_sender.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engine/server/engine/centralized_logs/logline/logline_sender.go b/engine/server/engine/centralized_logs/logline/logline_sender.go index 6aa4c6ad0e..0e76510dac 100644 --- a/engine/server/engine/centralized_logs/logline/logline_sender.go +++ b/engine/server/engine/centralized_logs/logline/logline_sender.go @@ -59,5 +59,7 @@ func (sender *LogLineSender) Flush() { serviceUuid: logLines, } sender.logsChan <- userServiceLogLinesMap + + sender.logLineBuffer[serviceUuid] = []LogLine{} } } From 2c489e29b0924c5ba8b350b0f81c68b041e2ce4b Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Sat, 10 Aug 2024 09:59:10 -0400 Subject: [PATCH 18/78] revert times --- .../golang/testsuite/persisted_logs_test/persisted_logs_test.go | 2 +- .../golang/testsuite/stream_logs_test/stream_logs_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/internal_testsuites/golang/testsuite/persisted_logs_test/persisted_logs_test.go b/internal_testsuites/golang/testsuite/persisted_logs_test/persisted_logs_test.go index b1d09b6936..a991e71154 100644 --- a/internal_testsuites/golang/testsuite/persisted_logs_test/persisted_logs_test.go +++ b/internal_testsuites/golang/testsuite/persisted_logs_test/persisted_logs_test.go @@ -39,7 +39,7 @@ const ( logLine3 = "Starting feature 'enclave pool with size 2'" logLine4 = "The data have being loaded" - secondsToWaitForLogs = 2 * time.Second + secondsToWaitForLogs = 1 * time.Second ) var ( diff --git a/internal_testsuites/golang/testsuite/stream_logs_test/stream_logs_test.go b/internal_testsuites/golang/testsuite/stream_logs_test/stream_logs_test.go index 2e39e2ac3a..257fc7ff36 100644 --- a/internal_testsuites/golang/testsuite/stream_logs_test/stream_logs_test.go +++ b/internal_testsuites/golang/testsuite/stream_logs_test/stream_logs_test.go @@ -32,7 +32,7 @@ const ( thirdLogLine = "running" lastLogLine = "successfully" - secondsToWaitForLogs = 2 * time.Second + secondsToWaitForLogs = 1 * time.Second ) var ( From 2c1f0bf60b74beb4b36dc5b3e909d51442fb1340 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Sat, 10 Aug 2024 10:02:35 -0400 Subject: [PATCH 19/78] lint --- cli/cli/scripts/build.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cli/cli/scripts/build.sh b/cli/cli/scripts/build.sh index 20f1c2893b..0f8401c209 100755 --- a/cli/cli/scripts/build.sh +++ b/cli/cli/scripts/build.sh @@ -98,9 +98,9 @@ fi fi # Executing goreleaser v1.26.2 without needing to install it if ! curl -sfL https://goreleaser.com/static/run | VERSION=v1.26.2 DISTRIBUTION=oss bash -s -- ${goreleaser_verb_and_flags}; then - echo "Error: Couldn't build the CLI binary for the current OS/arch" >&2 - exit 1 - fi + echo "Error: Couldn't build the CLI binary for the current OS/arch" >&2 + exit 1 + fi ) # Final verification From 815eded157986afaf98f9828e4c99d8b8a9075ae Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Sat, 10 Aug 2024 10:37:30 -0400 Subject: [PATCH 20/78] turn off cypress tests --- .circleci/config.yml | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 554dfabbbc..116d50dbc8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1474,17 +1474,18 @@ workflows: all_architectures: true name: "Check if CLI builds for all os and arch pairs" <<: *filters_ignore_main - - - test_enclave_manager_web_ui: - name: "Test Basic Web UI Functionality in Docker" - context: - - docker-user - requires: - - build_cli - - build_api_container_server - - build_engine_server - - build_files_artifacts_expander - <<: *filters_ignore_main +# 08/10/2024, tedi: turning these CI tests off for now as they depend on the package indexer for catalog.kurtosis.com which was shut down with +# the Kurtosis Cloud wind down +# - test_enclave_manager_web_ui: +# name: "Test Basic Web UI Functionality in Docker" +# context: +# - docker-user +# requires: +# - build_cli +# - build_api_container_server +# - build_engine_server +# - build_files_artifacts_expander +# <<: *filters_ignore_main - test_basic_cli_functionality: name: "Test Basic CLI Functionality in Docker" From ccd49c3c6b5008dc72339ed43db1cbbd58e9f767 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Sat, 10 Aug 2024 10:54:00 -0400 Subject: [PATCH 21/78] remove k cloud ref --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a2a01ce152..26857129dc 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ Because of this additional layer of abstraction, we are able to introduce severa How do I get going? =================== -To see Kurtosis in action, first install it using the instructions [here](https://docs.kurtosis.com/install) or visit [Kurtosis Cloud](https://cloud.kurtosis.com/) to provision a remote host. +To see Kurtosis in action, first install it using the instructions [here](https://docs.kurtosis.com/install). Then, run the [Redis voting app Kurtosis package](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/redis-voting-app): From 684cbd9ad66e0ac2a7a740238147c140486ceccf Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Sat, 10 Aug 2024 10:59:51 -0400 Subject: [PATCH 22/78] use latest docs checker --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 116d50dbc8..e2d7b6d798 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -145,7 +145,7 @@ version: 2.1 orbs: npm-publisher: uraway/npm-publisher@0.2.0 - kurtosis-docs-checker: kurtosis-tech/docs-checker@0.2.7 + kurtosis-docs-checker: kurtosis-tech/docs-checker@0.2.8 slack: circleci/slack@4.10.1 executors: From fff5ff0e34318a42f62e9850844bd383d089ee1b Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Sat, 10 Aug 2024 11:16:04 -0400 Subject: [PATCH 23/78] use latest docs checker again --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index e2d7b6d798..f5bf1dfeb8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -145,7 +145,7 @@ version: 2.1 orbs: npm-publisher: uraway/npm-publisher@0.2.0 - kurtosis-docs-checker: kurtosis-tech/docs-checker@0.2.8 + kurtosis-docs-checker: kurtosis-tech/docs-checker@0.2.9 slack: circleci/slack@4.10.1 executors: From d00bb2beb0031dd1fa01d4f82e9db55564fd3372 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Tue, 13 Aug 2024 09:09:22 -0400 Subject: [PATCH 24/78] create file layout interface --- .../file_layout/file_layout.go | 22 +++++++++++++++ .../file_layout/per_hour_file_layout.go | 27 +++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go create mode 100644 engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go new file mode 100644 index 0000000000..3310c887d6 --- /dev/null +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go @@ -0,0 +1,22 @@ +package file_layout + +import ( + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" + "time" +) + +type LogFileLayout interface { + // GetLogFileLayoutFormat Returns a string representation the "format" that files are laid out in + // Formats are composed: + // - "/" - representing a nested directory + // - "" - representing where an enclave uuid is inserted + // - "" - representing where a service uuid is inserted + // - time formats specified by strftime https://cplusplus.com/reference/ctime/strftime/ + // - any other ascii text + GetLogFileLayoutFormat() string + + // GetLogFilePaths Retrieves a list of filepaths [filesystem] for [serviceUuid] in [enclaveUuid] + // If [retentionPeriodIntervals] is set to -1, retrieves all filepaths from the currentTime till [retentionPeriod] + // If [retentionPeriodIntervals] is positive, retrieves all filepaths within the range [currentTime - retentionPeriod] and [currentTime - (retentionPeriodIntervals) * retentionPeriod] + GetLogFilePaths(filesystem volume_filesystem.VolumeFilesystem, retentionPeriod time.Duration, retentionPeriodIntervals int, enclaveUuid, serviceUuid string) []string +} diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go new file mode 100644 index 0000000000..bfa9085aa4 --- /dev/null +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go @@ -0,0 +1,27 @@ +package file_layout + +import ( + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" + "time" +) + +type PerHourFileLayout struct { + clock logs_clock.LogsClock +} + +func NewPerHourFileLayout(clock logs_clock.LogsClock) *PerHourFileLayout { + return &PerHourFileLayout{clock: clock} +} + +func (phf *PerHourFileLayout) GetLogFileLayoutFormat() string { + return "" +} + +func (phf *PerHourFileLayout) GetLogFilePaths( + filesystem volume_filesystem.VolumeFilesystem, + retentionPeriod time.Duration, + retentionPeriodIntervals int, + enclaveUuid, serviceUuid string) []string { + return []string{} +} From 87345783c9b5163304b831b56ee1e8a35f22af4a Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Tue, 13 Aug 2024 09:40:11 -0400 Subject: [PATCH 25/78] reimplement per week using file layout --- .../file_layout/file_layout.go | 2 +- .../file_layout/per_hour_file_layout.go | 4 +- .../file_layout/per_hour_file_layout_test.go | 1 + .../file_layout/per_week_file_layout.go | 80 ++++++ .../file_layout/per_week_file_layout_test.go | 266 ++++++++++++++++++ .../per_week_stream_logs_strategy.go | 45 +-- 6 files changed, 354 insertions(+), 44 deletions(-) create mode 100644 engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go create mode 100644 engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go create mode 100644 engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go index 3310c887d6..cdbd0633eb 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go @@ -18,5 +18,5 @@ type LogFileLayout interface { // GetLogFilePaths Retrieves a list of filepaths [filesystem] for [serviceUuid] in [enclaveUuid] // If [retentionPeriodIntervals] is set to -1, retrieves all filepaths from the currentTime till [retentionPeriod] // If [retentionPeriodIntervals] is positive, retrieves all filepaths within the range [currentTime - retentionPeriod] and [currentTime - (retentionPeriodIntervals) * retentionPeriod] - GetLogFilePaths(filesystem volume_filesystem.VolumeFilesystem, retentionPeriod time.Duration, retentionPeriodIntervals int, enclaveUuid, serviceUuid string) []string + GetLogFilePaths(filesystem volume_filesystem.VolumeFilesystem, retentionPeriod time.Duration, retentionPeriodIntervals int, enclaveUuid, serviceUuid string) ([]string, error) } diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go index bfa9085aa4..d2b350ec82 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go @@ -22,6 +22,6 @@ func (phf *PerHourFileLayout) GetLogFilePaths( filesystem volume_filesystem.VolumeFilesystem, retentionPeriod time.Duration, retentionPeriodIntervals int, - enclaveUuid, serviceUuid string) []string { - return []string{} + enclaveUuid, serviceUuid string) ([]string, error) { + return []string{}, nil } diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go new file mode 100644 index 0000000000..334480543c --- /dev/null +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go @@ -0,0 +1 @@ +package file_layout diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go new file mode 100644 index 0000000000..168bbfde09 --- /dev/null +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go @@ -0,0 +1,80 @@ +package file_layout + +import ( + "fmt" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" + "golang.org/x/exp/slices" + "math" + "os" + "strconv" + "time" +) + +const ( + oneWeek = 7 * 24 * time.Hour +) + +type PerWeekFileLayout struct { + time logs_clock.LogsClock +} + +func NewPerWeekFileLayout(time logs_clock.LogsClock) *PerWeekFileLayout { + return &PerWeekFileLayout{time: time} +} + +func (phf *PerWeekFileLayout) GetLogFileLayoutFormat() string { + return "" +} + +func (phf *PerWeekFileLayout) GetLogFilePaths( + filesystem volume_filesystem.VolumeFilesystem, + retentionPeriod time.Duration, + retentionPeriodIntervals int, + enclaveUuid, serviceUuid string) ([]string, error) { + var paths []string + currentTime := phf.time.Now() + + retentionPeriodInWeeks := DurationToWeeks(retentionPeriod) + + // scan for first existing log file + firstWeekWithLogs := 0 + for i := 0; i < retentionPeriodInWeeks; i++ { + year, week := currentTime.Add(time.Duration(-i) * oneWeek).ISOWeek() + // %02d to format week num with leading zeros so 1-9 are converted to 01-09 for %V format + formattedWeekNum := fmt.Sprintf("%02d", week) + filePathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(year), formattedWeekNum, enclaveUuid, serviceUuid, volume_consts.Filetype) + if _, err := filesystem.Stat(filePathStr); err == nil { + paths = append(paths, filePathStr) + firstWeekWithLogs = i + break + } else { + // return if error is not due to nonexistent file path + if !os.IsNotExist(err) { + return paths, err + } + } + } + + // scan for remaining files as far back as they exist + for i := firstWeekWithLogs + 1; i < retentionPeriodInWeeks; i++ { + year, week := currentTime.Add(time.Duration(-i) * oneWeek).ISOWeek() + formattedWeekNum := fmt.Sprintf("%02d", week) + filePathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(year), formattedWeekNum, enclaveUuid, serviceUuid, volume_consts.Filetype) + if _, err := filesystem.Stat(filePathStr); err != nil { + break + } + paths = append(paths, filePathStr) + } + + // reverse for oldest to most recent + slices.Reverse(paths) + + return paths, nil +} + +func DurationToWeeks(d time.Duration) int { + hoursInWeek := float64(7 * 24) // 7 days * 24 hours + return int(math.Round(d.Hours() / hoursInWeek)) +} diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go new file mode 100644 index 0000000000..802a0e7b44 --- /dev/null +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go @@ -0,0 +1,266 @@ +package file_layout + +import ( + "fmt" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" + "github.com/stretchr/testify/require" + "strconv" + "testing" + "time" +) + +const ( + testEnclaveUuid = "test-enclave" + testUserService1Uuid = "test-user-service-1" + + retentionPeriodInWeeksForTesting = 5 + oneWeekInHours = 7 * 24 * time.Hour + + defaultYear = 2023 + defaultDay = 0 // sunday +) + +func TestGetLogFilePaths(t *testing.T) { + filesystem := volume_filesystem.NewMockedVolumeFilesystem() + + // ../week/enclave uuid/service uuid.json + week12filepath := getWeekFilepathStr(defaultYear, 12) + week13filepath := getWeekFilepathStr(defaultYear, 13) + week14filepath := getWeekFilepathStr(defaultYear, 14) + week15filepath := getWeekFilepathStr(defaultYear, 15) + week16filepath := getWeekFilepathStr(defaultYear, 16) + week17filepath := getWeekFilepathStr(defaultYear, 17) + + _, _ = filesystem.Create(week12filepath) + _, _ = filesystem.Create(week13filepath) + _, _ = filesystem.Create(week14filepath) + _, _ = filesystem.Create(week15filepath) + _, _ = filesystem.Create(week16filepath) + _, _ = filesystem.Create(week17filepath) + + currentWeek := 17 + + expectedLogFilePaths := []string{ + week13filepath, + week14filepath, + week15filepath, + week16filepath, + week17filepath, + } + + mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) + fileLayout := NewPerWeekFileLayout(mockTime) + retentionPeriod := retentionPeriodInWeeksForTesting * oneWeekInHours + logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) + + require.NoError(t, err) + require.Equal(t, len(expectedLogFilePaths), len(logFilePaths)) + for i, filePath := range expectedLogFilePaths { + require.Equal(t, filePath, logFilePaths[i]) + } +} + +func TestGetLogFilePathsAcrossNewYear(t *testing.T) { + filesystem := volume_filesystem.NewMockedVolumeFilesystem() + + // ../week/enclave uuid/service uuid.json + week50filepath := getWeekFilepathStr(defaultYear-1, 50) + week51filepath := getWeekFilepathStr(defaultYear-1, 51) + week52filepath := getWeekFilepathStr(defaultYear-1, 52) + week1filepath := getWeekFilepathStr(defaultYear, 1) + week2filepath := getWeekFilepathStr(defaultYear, 2) + + _, _ = filesystem.Create(week50filepath) + _, _ = filesystem.Create(week51filepath) + _, _ = filesystem.Create(week52filepath) + _, _ = filesystem.Create(week1filepath) + _, _ = filesystem.Create(week2filepath) + + currentWeek := 2 + + expectedLogFilePaths := []string{ + week50filepath, + week51filepath, + week52filepath, + week1filepath, + week2filepath, + } + + mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) + fileLayout := NewPerWeekFileLayout(mockTime) + retentionPeriod := retentionPeriodInWeeksForTesting * oneWeekInHours + logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) + + require.NoError(t, err) + require.Equal(t, len(expectedLogFilePaths), len(logFilePaths)) + for i, filePath := range expectedLogFilePaths { + require.Equal(t, filePath, logFilePaths[i]) + } +} + +func TestGetLogFilePathsAcrossNewYearWith53Weeks(t *testing.T) { + filesystem := volume_filesystem.NewMockedVolumeFilesystem() + + // According to ISOWeek, 2015 has 53 weeks + week52filepath := getWeekFilepathStr(2015, 52) + week53filepath := getWeekFilepathStr(2015, 53) + week1filepath := getWeekFilepathStr(2016, 1) + week2filepath := getWeekFilepathStr(2016, 2) + week3filepath := getWeekFilepathStr(2016, 3) + + _, _ = filesystem.Create(week52filepath) + _, _ = filesystem.Create(week53filepath) + _, _ = filesystem.Create(week1filepath) + _, _ = filesystem.Create(week2filepath) + _, _ = filesystem.Create(week3filepath) + + currentWeek := 3 + + expectedLogFilePaths := []string{ + week52filepath, + week53filepath, + week1filepath, + week2filepath, + week3filepath, + } + + mockTime := logs_clock.NewMockLogsClock(2016, currentWeek, 1) + fileLayout := NewPerWeekFileLayout(mockTime) + retentionPeriod := retentionPeriodInWeeksForTesting * oneWeekInHours + logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) + + require.NoError(t, err) + require.Equal(t, len(expectedLogFilePaths), len(logFilePaths)) + for i, filePath := range expectedLogFilePaths { + require.Equal(t, filePath, logFilePaths[i]) + } +} + +func TestGetLogFilePathsWithDiffRetentionPeriod(t *testing.T) { + filesystem := volume_filesystem.NewMockedVolumeFilesystem() + + // ../week/enclave uuid/service uuid.json + week52filepath := getWeekFilepathStr(defaultYear-1, 52) + week1filepath := getWeekFilepathStr(defaultYear, 1) + week2filepath := getWeekFilepathStr(defaultYear, 2) + + _, _ = filesystem.Create(week52filepath) + _, _ = filesystem.Create(week1filepath) + _, _ = filesystem.Create(week2filepath) + + currentWeek := 2 + + expectedLogFilePaths := []string{ + week52filepath, + week1filepath, + week2filepath, + } + + mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) + fileLayout := NewPerWeekFileLayout(mockTime) + retentionPeriod := 3 * oneWeekInHours + logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) + + require.NoError(t, err) + require.Equal(t, len(expectedLogFilePaths), len(logFilePaths)) + for i, filePath := range expectedLogFilePaths { + require.Equal(t, filePath, logFilePaths[i]) + } +} + +func TestGetLogFilePathsReturnsAllAvailableWeeks(t *testing.T) { + filesystem := volume_filesystem.NewMockedVolumeFilesystem() + + // ../week/enclave uuid/service uuid.json + week52filepath := getWeekFilepathStr(defaultYear-1, 52) + week1filepath := getWeekFilepathStr(defaultYear, 1) + week2filepath := getWeekFilepathStr(defaultYear, 2) + + _, _ = filesystem.Create(week52filepath) + _, _ = filesystem.Create(week1filepath) + _, _ = filesystem.Create(week2filepath) + + // should return existing file paths even though log files going all the back to retention period don't exist + expectedLogFilePaths := []string{ + week52filepath, + week1filepath, + week2filepath, + } + + currentWeek := 2 + + mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) + fileLayout := NewPerWeekFileLayout(mockTime) + retentionPeriod := retentionPeriodInWeeksForTesting * oneWeekInHours + logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) + + require.NoError(t, err) + require.Less(t, len(logFilePaths), retentionPeriodInWeeksForTesting) + for i, filePath := range expectedLogFilePaths { + require.Equal(t, filePath, logFilePaths[i]) + } +} + +func TestGetLogFilePathsReturnsCorrectPathsIfWeeksMissingInBetween(t *testing.T) { + filesystem := volume_filesystem.NewMockedVolumeFilesystem() + + // ../week/enclave uuid/service uuid.json + week52filepath := getWeekFilepathStr(defaultYear, 0) + week1filepath := getWeekFilepathStr(defaultYear, 1) + week3filepath := getWeekFilepathStr(defaultYear, 3) + + _, _ = filesystem.Create(week52filepath) + _, _ = filesystem.Create(week1filepath) + _, _ = filesystem.Create(week3filepath) + + currentWeek := 3 + + mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) + fileLayout := NewPerWeekFileLayout(mockTime) + retentionPeriod := retentionPeriodInWeeksForTesting * oneWeekInHours + logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) + + require.NoError(t, err) + require.Len(t, logFilePaths, 1) + require.Equal(t, week3filepath, logFilePaths[0]) // should only return week 3 because week 2 is missing +} + +func TestGetLogFilePathsReturnsCorrectPathsIfCurrentWeekHasNoLogsYet(t *testing.T) { + // currently in week 3 + currentWeek := 3 + mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) + + filesystem := volume_filesystem.NewMockedVolumeFilesystem() + + // ../week/enclave uuid/service uuid.json + week1filepath := getWeekFilepathStr(defaultYear, 1) + week2filepath := getWeekFilepathStr(defaultYear, 2) + + // no logs for week current week exist yet + _, _ = filesystem.Create(week1filepath) + _, _ = filesystem.Create(week2filepath) + + // should return week 1 and 2 logs, even though no logs for current week yet + expectedLogFilePaths := []string{ + week1filepath, + week2filepath, + } + + fileLayout := NewPerWeekFileLayout(mockTime) + retentionPeriod := retentionPeriodInWeeksForTesting * oneWeekInHours + logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) + + require.NoError(t, err) + require.Equal(t, len(expectedLogFilePaths), len(logFilePaths)) + for i, filePath := range expectedLogFilePaths { + require.Equal(t, filePath, logFilePaths[i]) + } +} + +func getWeekFilepathStr(year, week int) string { + // %02d to format week num with leading zeros so 1-9 are converted to 01-09 for %V format + formattedWeekNum := fmt.Sprintf("%02d", week) + return fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(year), formattedWeekNum, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) +} diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go index 1717721392..242422a441 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go @@ -5,10 +5,8 @@ import ( "context" "encoding/json" "errors" - "fmt" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout" "io" - "os" - "strconv" "strings" "time" @@ -21,7 +19,6 @@ import ( "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/logline" "github.com/kurtosis-tech/stacktrace" "github.com/sirupsen/logrus" - "golang.org/x/exp/slices" ) const ( @@ -119,43 +116,9 @@ func (strategy *PerWeekStreamLogsStrategy) StreamLogs( // - The list of file paths is returned in order of oldest logs to most recent logs e.g. [ 03/80124/1234.json, /04/801234/1234.json, ...] // - If a file path does not exist, the function with exits and returns whatever file paths were found func (strategy *PerWeekStreamLogsStrategy) getLogFilePaths(filesystem volume_filesystem.VolumeFilesystem, retentionPeriodInWeeks int, enclaveUuid, serviceUuid string) ([]string, error) { - var paths []string - currentTime := strategy.time.Now() - - // scan for first existing log file - firstWeekWithLogs := 0 - for i := 0; i < retentionPeriodInWeeks; i++ { - year, week := currentTime.Add(time.Duration(-i) * oneWeek).ISOWeek() - // %02d to format week num with leading zeros so 1-9 are converted to 01-09 for %V format - formattedWeekNum := fmt.Sprintf("%02d", week) - filePathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(year), formattedWeekNum, enclaveUuid, serviceUuid, volume_consts.Filetype) - if _, err := filesystem.Stat(filePathStr); err == nil { - paths = append(paths, filePathStr) - firstWeekWithLogs = i - break - } else { - // return if error is not due to nonexistent file path - if !os.IsNotExist(err) { - return paths, err - } - } - } - - // scan for remaining files as far back as they exist - for i := firstWeekWithLogs + 1; i < retentionPeriodInWeeks; i++ { - year, week := currentTime.Add(time.Duration(-i) * oneWeek).ISOWeek() - formattedWeekNum := fmt.Sprintf("%02d", week) - filePathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(year), formattedWeekNum, enclaveUuid, serviceUuid, volume_consts.Filetype) - if _, err := filesystem.Stat(filePathStr); err != nil { - break - } - paths = append(paths, filePathStr) - } - - // reverse for oldest to most recent - slices.Reverse(paths) - - return paths, nil + perWeekFileLayout := file_layout.NewPerWeekFileLayout(strategy.time) + retentionPeriod := time.Duration(retentionPeriodInWeeks) * oneWeek + return perWeekFileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, enclaveUuid, serviceUuid) } // Returns a Reader over all logs in [logFilePaths] and the open file descriptors of the associated [logFilePaths] From 3febce26b50503ffa929ada631aa37c762a9831b Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Tue, 13 Aug 2024 10:45:48 -0400 Subject: [PATCH 26/78] progress on file layout --- .../file_layout/file_layout.go | 18 ++++++++++++++++++ .../file_layout/per_week_file_layout.go | 16 +++++++++++++++- .../log_file_manager/log_file_manager.go | 5 ++++- 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go index cdbd0633eb..28128c1af0 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go @@ -5,6 +5,16 @@ import ( "time" ) +// this interface should support operations by the following clients: +// - logs aggregator +// - needs to know how to store files +// +// - log file manager +// - needs to know what to name the log files it creates +// - needs to log file paths to remove based on retention period, but also all of them +// +// - stream logs strategy +// - needs to know what type LogFileLayout interface { // GetLogFileLayoutFormat Returns a string representation the "format" that files are laid out in // Formats are composed: @@ -15,8 +25,16 @@ type LogFileLayout interface { // - any other ascii text GetLogFileLayoutFormat() string + // GetLogFilePath?? + // GetLogFilePaths Retrieves a list of filepaths [filesystem] for [serviceUuid] in [enclaveUuid] // If [retentionPeriodIntervals] is set to -1, retrieves all filepaths from the currentTime till [retentionPeriod] // If [retentionPeriodIntervals] is positive, retrieves all filepaths within the range [currentTime - retentionPeriod] and [currentTime - (retentionPeriodIntervals) * retentionPeriod] GetLogFilePaths(filesystem volume_filesystem.VolumeFilesystem, retentionPeriod time.Duration, retentionPeriodIntervals int, enclaveUuid, serviceUuid string) ([]string, error) + + // rename to "GetLogFilePaths"BasedOnRetentoin + // - should support getting log file paths within time period + // - theoretically should support getting all file log file paths + // following Philosophy of Software Design by John Ousterhoust - small interface, deep modules + // } diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go index 168bbfde09..5c75d2c18e 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go @@ -14,6 +14,12 @@ import ( const ( oneWeek = 7 * 24 * time.Hour + + // basepath /year/week + PerWeekDirPathStr = "%s%s/%s/" + + // ... enclave uuid/service uuid + PerWeekFilePathFmtStr = PerWeekDirPathStr + "%s/%s%s" ) type PerWeekFileLayout struct { @@ -25,9 +31,17 @@ func NewPerWeekFileLayout(time logs_clock.LogsClock) *PerWeekFileLayout { } func (phf *PerWeekFileLayout) GetLogFileLayoutFormat() string { - return "" + return "/var/log/kurtosis/%%Y/%%V/{{ enclave_uuid }}/{{ service_uuid }}.json" +} + +func (phf *PerWeekFileLayout) GetLogFilePath(time time.Time, enclaveUuid, serviceUuid string) string { + year, week := time.ISOWeek() + + formattedWeekNum := fmt.Sprintf("%02d", week) + return fmt.Sprintf(PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(year), formattedWeekNum, enclaveUuid, serviceUuid, volume_consts.Filetype) } +// TODO: adjust to support getting log file paths beyond retention period func (phf *PerWeekFileLayout) GetLogFilePaths( filesystem volume_filesystem.VolumeFilesystem, retentionPeriod time.Duration, diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go index d9224ec674..36271dd8e2 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go @@ -132,6 +132,9 @@ func (manager *LogFileManager) RemoveLogsBeyondRetentionPeriod() { year, weekToRemove := manager.time.Now().Add(time.Duration(-manager.logRetentionPeriodInWeeks) * oneWeek).ISOWeek() // remove directory for that week + // enclaveToServiceMaps := getEnclaveAndServiceInfo) + // filepathsToRemove, err := manager.layout.GetLogFilePaths(manager.filesystem, retentionPeriod, 1, enclaveUuid, serviceUuid) + // for _, path := range filepaths { manager.filesystem.Remove(file) } oldLogsDirPath := getLogsDirPathForWeek(year, weekToRemove) if err := manager.filesystem.RemoveAll(oldLogsDirPath); err != nil { logrus.Warnf("An error occurred removing old logs at the following path '%v': %v\n", oldLogsDirPath, err) @@ -186,8 +189,8 @@ func (manager *LogFileManager) getEnclaveAndServiceInfo(ctx context.Context) (ma func (manager *LogFileManager) createLogFileIdempotently(logFilePath string) error { var err error if _, err = manager.filesystem.Stat(logFilePath); os.IsNotExist(err) { + return stacktrace.Propagate(err, "An error occurred creating a log file path at '%v'", logFilePath) if _, err = manager.filesystem.Create(logFilePath); err != nil { - return stacktrace.Propagate(err, "An error occurred creating a log file path at '%v'", logFilePath) } logrus.Tracef("Created log file: '%v'", logFilePath) return nil From 7d3dd38afe0635f6b9b081b1dcc87ddf254d9256 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Wed, 14 Aug 2024 18:39:50 -0400 Subject: [PATCH 27/78] add get log filepath, migrate tests to use get log filepath, add some todos --- enclave-manager/api/typescript/yarn.lock | 16 +-- .../file_layout/file_layout.go | 21 +-- .../file_layout/per_week_file_layout.go | 8 +- .../file_layout/per_week_file_layout_test.go | 123 ++++++++---------- .../log_file_manager/log_file_manager.go | 1 - .../per_week_stream_logs_strategy.go | 1 + .../per_week_stream_logs_strategy_test.go | 2 + .../persistent_volume/volume_consts/consts.go | 1 + 8 files changed, 74 insertions(+), 99 deletions(-) diff --git a/enclave-manager/api/typescript/yarn.lock b/enclave-manager/api/typescript/yarn.lock index 997c8c2032..5a42c464ab 100644 --- a/enclave-manager/api/typescript/yarn.lock +++ b/enclave-manager/api/typescript/yarn.lock @@ -1512,11 +1512,11 @@ brace-expansion@^1.1.7: concat-map "0.0.1" braces@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" browserslist@^4.22.2: version "4.22.2" @@ -1791,10 +1791,10 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go index 28128c1af0..c6dd53aa15 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go @@ -5,16 +5,6 @@ import ( "time" ) -// this interface should support operations by the following clients: -// - logs aggregator -// - needs to know how to store files -// -// - log file manager -// - needs to know what to name the log files it creates -// - needs to log file paths to remove based on retention period, but also all of them -// -// - stream logs strategy -// - needs to know what type LogFileLayout interface { // GetLogFileLayoutFormat Returns a string representation the "format" that files are laid out in // Formats are composed: @@ -25,16 +15,11 @@ type LogFileLayout interface { // - any other ascii text GetLogFileLayoutFormat() string - // GetLogFilePath?? + // GetLogFilePath gets the log file path for [serviceUuid] in [enclaveUuid] at [time] + GetLogFilePath(time time.Time, enclaveUuid, serviceUuid string) string - // GetLogFilePaths Retrieves a list of filepaths [filesystem] for [serviceUuid] in [enclaveUuid] + // GetLogFilePaths retrieves a list of filepaths [filesystem] for [serviceUuid] in [enclaveUuid] // If [retentionPeriodIntervals] is set to -1, retrieves all filepaths from the currentTime till [retentionPeriod] // If [retentionPeriodIntervals] is positive, retrieves all filepaths within the range [currentTime - retentionPeriod] and [currentTime - (retentionPeriodIntervals) * retentionPeriod] GetLogFilePaths(filesystem volume_filesystem.VolumeFilesystem, retentionPeriod time.Duration, retentionPeriodIntervals int, enclaveUuid, serviceUuid string) ([]string, error) - - // rename to "GetLogFilePaths"BasedOnRetentoin - // - should support getting log file paths within time period - // - theoretically should support getting all file log file paths - // following Philosophy of Software Design by John Ousterhoust - small interface, deep modules - // } diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go index 5c75d2c18e..bddbbf3439 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go @@ -30,11 +30,11 @@ func NewPerWeekFileLayout(time logs_clock.LogsClock) *PerWeekFileLayout { return &PerWeekFileLayout{time: time} } -func (phf *PerWeekFileLayout) GetLogFileLayoutFormat() string { +func (pwf *PerWeekFileLayout) GetLogFileLayoutFormat() string { return "/var/log/kurtosis/%%Y/%%V/{{ enclave_uuid }}/{{ service_uuid }}.json" } -func (phf *PerWeekFileLayout) GetLogFilePath(time time.Time, enclaveUuid, serviceUuid string) string { +func (pwf *PerWeekFileLayout) GetLogFilePath(time time.Time, enclaveUuid, serviceUuid string) string { year, week := time.ISOWeek() formattedWeekNum := fmt.Sprintf("%02d", week) @@ -42,13 +42,13 @@ func (phf *PerWeekFileLayout) GetLogFilePath(time time.Time, enclaveUuid, servic } // TODO: adjust to support getting log file paths beyond retention period -func (phf *PerWeekFileLayout) GetLogFilePaths( +func (pwf *PerWeekFileLayout) GetLogFilePaths( filesystem volume_filesystem.VolumeFilesystem, retentionPeriod time.Duration, retentionPeriodIntervals int, enclaveUuid, serviceUuid string) ([]string, error) { var paths []string - currentTime := phf.time.Now() + currentTime := pwf.time.Now() retentionPeriodInWeeks := DurationToWeeks(retentionPeriod) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go index 802a0e7b44..1ff1d6da13 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go @@ -1,12 +1,9 @@ package file_layout import ( - "fmt" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock" - "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" "github.com/stretchr/testify/require" - "strconv" "testing" "time" ) @@ -25,13 +22,16 @@ const ( func TestGetLogFilePaths(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() - // ../week/enclave uuid/service uuid.json - week12filepath := getWeekFilepathStr(defaultYear, 12) - week13filepath := getWeekFilepathStr(defaultYear, 13) - week14filepath := getWeekFilepathStr(defaultYear, 14) - week15filepath := getWeekFilepathStr(defaultYear, 15) - week16filepath := getWeekFilepathStr(defaultYear, 16) - week17filepath := getWeekFilepathStr(defaultYear, 17) + currentWeek := 17 + currentTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) + fileLayout := NewPerWeekFileLayout(currentTime) + + week12filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 12, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week13filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 13, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week14filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 14, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week15filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 15, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week16filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 16, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week17filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 17, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = filesystem.Create(week12filepath) _, _ = filesystem.Create(week13filepath) @@ -40,8 +40,6 @@ func TestGetLogFilePaths(t *testing.T) { _, _ = filesystem.Create(week16filepath) _, _ = filesystem.Create(week17filepath) - currentWeek := 17 - expectedLogFilePaths := []string{ week13filepath, week14filepath, @@ -50,8 +48,6 @@ func TestGetLogFilePaths(t *testing.T) { week17filepath, } - mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) - fileLayout := NewPerWeekFileLayout(mockTime) retentionPeriod := retentionPeriodInWeeksForTesting * oneWeekInHours logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) @@ -65,12 +61,16 @@ func TestGetLogFilePaths(t *testing.T) { func TestGetLogFilePathsAcrossNewYear(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() + currentWeek := 2 + currentTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) + fileLayout := NewPerWeekFileLayout(currentTime) + // ../week/enclave uuid/service uuid.json - week50filepath := getWeekFilepathStr(defaultYear-1, 50) - week51filepath := getWeekFilepathStr(defaultYear-1, 51) - week52filepath := getWeekFilepathStr(defaultYear-1, 52) - week1filepath := getWeekFilepathStr(defaultYear, 1) - week2filepath := getWeekFilepathStr(defaultYear, 2) + week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear-1, 50, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear-1, 51, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear-1, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = filesystem.Create(week50filepath) _, _ = filesystem.Create(week51filepath) @@ -78,8 +78,6 @@ func TestGetLogFilePathsAcrossNewYear(t *testing.T) { _, _ = filesystem.Create(week1filepath) _, _ = filesystem.Create(week2filepath) - currentWeek := 2 - expectedLogFilePaths := []string{ week50filepath, week51filepath, @@ -88,8 +86,6 @@ func TestGetLogFilePathsAcrossNewYear(t *testing.T) { week2filepath, } - mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) - fileLayout := NewPerWeekFileLayout(mockTime) retentionPeriod := retentionPeriodInWeeksForTesting * oneWeekInHours logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) @@ -103,12 +99,16 @@ func TestGetLogFilePathsAcrossNewYear(t *testing.T) { func TestGetLogFilePathsAcrossNewYearWith53Weeks(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() + currentWeek := 3 + currentTime := logs_clock.NewMockLogsClock(2016, currentWeek, 1) + fileLayout := NewPerWeekFileLayout(currentTime) + // According to ISOWeek, 2015 has 53 weeks - week52filepath := getWeekFilepathStr(2015, 52) - week53filepath := getWeekFilepathStr(2015, 53) - week1filepath := getWeekFilepathStr(2016, 1) - week2filepath := getWeekFilepathStr(2016, 2) - week3filepath := getWeekFilepathStr(2016, 3) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2015, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week53filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2015, 53, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2016, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2016, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week3filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2016, 3, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = filesystem.Create(week52filepath) _, _ = filesystem.Create(week53filepath) @@ -116,8 +116,6 @@ func TestGetLogFilePathsAcrossNewYearWith53Weeks(t *testing.T) { _, _ = filesystem.Create(week2filepath) _, _ = filesystem.Create(week3filepath) - currentWeek := 3 - expectedLogFilePaths := []string{ week52filepath, week53filepath, @@ -126,8 +124,6 @@ func TestGetLogFilePathsAcrossNewYearWith53Weeks(t *testing.T) { week3filepath, } - mockTime := logs_clock.NewMockLogsClock(2016, currentWeek, 1) - fileLayout := NewPerWeekFileLayout(mockTime) retentionPeriod := retentionPeriodInWeeksForTesting * oneWeekInHours logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) @@ -141,25 +137,24 @@ func TestGetLogFilePathsAcrossNewYearWith53Weeks(t *testing.T) { func TestGetLogFilePathsWithDiffRetentionPeriod(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() + currentWeek := 2 + mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) + fileLayout := NewPerWeekFileLayout(mockTime) + // ../week/enclave uuid/service uuid.json - week52filepath := getWeekFilepathStr(defaultYear-1, 52) - week1filepath := getWeekFilepathStr(defaultYear, 1) - week2filepath := getWeekFilepathStr(defaultYear, 2) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear-1, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = filesystem.Create(week52filepath) _, _ = filesystem.Create(week1filepath) _, _ = filesystem.Create(week2filepath) - currentWeek := 2 - expectedLogFilePaths := []string{ week52filepath, week1filepath, week2filepath, } - - mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) - fileLayout := NewPerWeekFileLayout(mockTime) retentionPeriod := 3 * oneWeekInHours logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) @@ -173,10 +168,14 @@ func TestGetLogFilePathsWithDiffRetentionPeriod(t *testing.T) { func TestGetLogFilePathsReturnsAllAvailableWeeks(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() + currentWeek := 2 + currentTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) + fileLayout := NewPerWeekFileLayout(currentTime) + // ../week/enclave uuid/service uuid.json - week52filepath := getWeekFilepathStr(defaultYear-1, 52) - week1filepath := getWeekFilepathStr(defaultYear, 1) - week2filepath := getWeekFilepathStr(defaultYear, 2) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear-1, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = filesystem.Create(week52filepath) _, _ = filesystem.Create(week1filepath) @@ -188,11 +187,6 @@ func TestGetLogFilePathsReturnsAllAvailableWeeks(t *testing.T) { week1filepath, week2filepath, } - - currentWeek := 2 - - mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) - fileLayout := NewPerWeekFileLayout(mockTime) retentionPeriod := retentionPeriodInWeeksForTesting * oneWeekInHours logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) @@ -206,19 +200,18 @@ func TestGetLogFilePathsReturnsAllAvailableWeeks(t *testing.T) { func TestGetLogFilePathsReturnsCorrectPathsIfWeeksMissingInBetween(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() + currentWeek := 3 + currentTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) + fileLayout := NewPerWeekFileLayout(currentTime) + // ../week/enclave uuid/service uuid.json - week52filepath := getWeekFilepathStr(defaultYear, 0) - week1filepath := getWeekFilepathStr(defaultYear, 1) - week3filepath := getWeekFilepathStr(defaultYear, 3) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week3filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 3, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = filesystem.Create(week52filepath) _, _ = filesystem.Create(week1filepath) _, _ = filesystem.Create(week3filepath) - - currentWeek := 3 - - mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) - fileLayout := NewPerWeekFileLayout(mockTime) retentionPeriod := retentionPeriodInWeeksForTesting * oneWeekInHours logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) @@ -228,15 +221,16 @@ func TestGetLogFilePathsReturnsCorrectPathsIfWeeksMissingInBetween(t *testing.T) } func TestGetLogFilePathsReturnsCorrectPathsIfCurrentWeekHasNoLogsYet(t *testing.T) { - // currently in week 3 - currentWeek := 3 - mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) filesystem := volume_filesystem.NewMockedVolumeFilesystem() + currentWeek := 3 + currentTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) + fileLayout := NewPerWeekFileLayout(currentTime) + // ../week/enclave uuid/service uuid.json - week1filepath := getWeekFilepathStr(defaultYear, 1) - week2filepath := getWeekFilepathStr(defaultYear, 2) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) // no logs for week current week exist yet _, _ = filesystem.Create(week1filepath) @@ -248,7 +242,6 @@ func TestGetLogFilePathsReturnsCorrectPathsIfCurrentWeekHasNoLogsYet(t *testing. week2filepath, } - fileLayout := NewPerWeekFileLayout(mockTime) retentionPeriod := retentionPeriodInWeeksForTesting * oneWeekInHours logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) @@ -258,9 +251,3 @@ func TestGetLogFilePathsReturnsCorrectPathsIfCurrentWeekHasNoLogsYet(t *testing. require.Equal(t, filePath, logFilePaths[i]) } } - -func getWeekFilepathStr(year, week int) string { - // %02d to format week num with leading zeros so 1-9 are converted to 01-09 for %V format - formattedWeekNum := fmt.Sprintf("%02d", week) - return fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(year), formattedWeekNum, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) -} diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go index 36271dd8e2..3edb91ad73 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go @@ -213,7 +213,6 @@ func (manager *LogFileManager) createSymlinkLogFile(targetLogFilePath, symlinkLo return nil } -// TODO: Implement a FilePath Builder to centralize log file path creation across the entire module // creates a filepath of format //year/week//serviceIdentifier. func getFilepathStr(year, week int, enclaveUuid, serviceIdentifier string) string { formattedWeekNum := fmt.Sprintf("%02d", week) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go index 242422a441..26d7be80ae 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go @@ -116,6 +116,7 @@ func (strategy *PerWeekStreamLogsStrategy) StreamLogs( // - The list of file paths is returned in order of oldest logs to most recent logs e.g. [ 03/80124/1234.json, /04/801234/1234.json, ...] // - If a file path does not exist, the function with exits and returns whatever file paths were found func (strategy *PerWeekStreamLogsStrategy) getLogFilePaths(filesystem volume_filesystem.VolumeFilesystem, retentionPeriodInWeeks int, enclaveUuid, serviceUuid string) ([]string, error) { + // TODO: embed FileLayout into StreamLogsStrategy interface perWeekFileLayout := file_layout.NewPerWeekFileLayout(strategy.time) retentionPeriod := time.Duration(retentionPeriodInWeeks) * oneWeek return perWeekFileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, enclaveUuid, serviceUuid) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy_test.go index 1157eca522..6339688daa 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy_test.go @@ -25,6 +25,8 @@ const ( defaultDay = 0 // sunday ) +// TODO: migrate GetLogFilePaths tests to FileLayout interface when it is fully merged +// for now, leave them duplicated so there's an extra layer of testing as the migration happens func TestGetLogFilePaths(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts/consts.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts/consts.go index ab959633a3..a2f53c054c 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts/consts.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts/consts.go @@ -27,6 +27,7 @@ const ( // basepath/enclave uuid/service uuid PerFileFmtStr = "%s%s/%s%s" + // TODO: remove these from consts once PerWeekFileLayout is fully merged // basepath /year/week PerWeekDirPathStr = "%s%s/%s/" From aacffb6bbd7ff549162c11e4682c5fd9ce6bbe15 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Wed, 14 Aug 2024 18:41:57 -0400 Subject: [PATCH 28/78] remove screenshots --- ... Can save packages (failed) (attempt 2).png | Bin 107187 -> 0 bytes ... Can save packages (failed) (attempt 3).png | Bin 107301 -> 0 bytes .../Catalog -- Can save packages (failed).png | Bin 104669 -> 0 bytes ...talog -- Lists the catalog (failed) (1).png | Bin 101193 -> 0 bytes ...talog -- Lists the catalog (failed) (2).png | Bin 97637 -> 0 bytes ...ts the catalog (failed) (attempt 2) (1).png | Bin 100943 -> 0 bytes ... Lists the catalog (failed) (attempt 2).png | Bin 100995 -> 0 bytes ...ts the catalog (failed) (attempt 3) (1).png | Bin 100949 -> 0 bytes ... Lists the catalog (failed) (attempt 3).png | Bin 100946 -> 0 bytes .../Catalog -- Lists the catalog (failed).png | Bin 101295 -> 0 bytes ...s packages details (failed) (attempt 2).png | Bin 104789 -> 0 bytes ...s packages details (failed) (attempt 3).png | Bin 105946 -> 0 bytes ...alog -- Opens packages details (failed).png | Bin 107133 -> 0 bytes ...arches with ctrl+f (failed) (attempt 2).png | Bin 87074 -> 0 bytes ...arches with ctrl+f (failed) (attempt 3).png | Bin 87252 -> 0 bytes ...atalog -- Searches with ctrl+f (failed).png | Bin 87156 -> 0 bytes ... update an enclave (failed) (attempt 2).png | Bin 97816 -> 0 bytes ...n create and update an enclave (failed).png | Bin 97828 -> 0 bytes ...-- after each hook (failed) (attempt 2).png | Bin 100519 -> 0 bytes ... an enclave -- after each hook (failed).png | Bin 100969 -> 0 bytes 20 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Can save packages (failed) (attempt 2).png delete mode 100644 enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Can save packages (failed) (attempt 3).png delete mode 100644 enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Can save packages (failed).png delete mode 100644 enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Lists the catalog (failed) (1).png delete mode 100644 enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Lists the catalog (failed) (2).png delete mode 100644 enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Lists the catalog (failed) (attempt 2) (1).png delete mode 100644 enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Lists the catalog (failed) (attempt 2).png delete mode 100644 enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Lists the catalog (failed) (attempt 3) (1).png delete mode 100644 enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Lists the catalog (failed) (attempt 3).png delete mode 100644 enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Lists the catalog (failed).png delete mode 100644 enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Opens packages details (failed) (attempt 2).png delete mode 100644 enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Opens packages details (failed) (attempt 3).png delete mode 100644 enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Opens packages details (failed).png delete mode 100644 enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Searches with ctrl+f (failed) (attempt 2).png delete mode 100644 enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Searches with ctrl+f (failed) (attempt 3).png delete mode 100644 enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Searches with ctrl+f (failed).png delete mode 100644 enclave-manager/web/cypress/screenshots/enclaveList.cy.ts/Enclave List -- Can create and update an enclave (failed) (attempt 2).png delete mode 100644 enclave-manager/web/cypress/screenshots/enclaveList.cy.ts/Enclave List -- Can create and update an enclave (failed).png delete mode 100644 enclave-manager/web/cypress/screenshots/enclaveList.cy.ts/Enclave List -- Can create and update an enclave -- after each hook (failed) (attempt 2).png delete mode 100644 enclave-manager/web/cypress/screenshots/enclaveList.cy.ts/Enclave List -- Can create and update an enclave -- after each hook (failed).png diff --git a/enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Can save packages (failed) (attempt 2).png b/enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Can save packages (failed) (attempt 2).png deleted file mode 100644 index 9109d7fe738e87ebb41611eb7bebdccc4f7baae0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107187 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 exE7J#g)?E<(DG33w?=zWQ(HYNPc4 diff --git a/enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Can save packages (failed) (attempt 3).png b/enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Can save packages (failed) (attempt 3).png deleted file mode 100644 index 6f6aef44e5ebb0c2d47199f5f737064577902061..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107301 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 Nh1g4E!Bd_0{|8M0FN6R9 diff --git a/enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Can save packages (failed).png b/enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Can save packages (failed).png deleted file mode 100644 index 8dfc8b3563b2ab8b26be461ee1c38ea820806f69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104669 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 diff --git a/enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Lists the catalog (failed) (1).png b/enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Lists the catalog (failed) (1).png deleted file mode 100644 index 6ea9089e2db901ab1f0305ec57c1c7255ad6d848..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101193 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

l4`=J_9s2%WrvoZRFYD=_3y`E9TVz_AHL%LgoZ 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 @N=Df*OMZLcCSI@FXj_=;^`OB2xW$91E zmNaSqUe})p3v?=9QwOKxXnhVjf2SiHcqdrM-c6F@?HK5P&oBl~_+x3QCeR%bS<)OA zJk}RIHxe<9YE8^)7F<2Hh!yts_ELmwoQnt;Zhrb`G{<>O4&)&+vS;vf z!XvA|mUNfHsz%J@mEif@rI!n8uS^@$_nUg*W-q8_<361)OAbu+qV@fDje??jm2!=p zI;>8A{_tIob!4l3Mq%yTzT_*~8|nHq8hhntMKx7*D=Y76j&sgzYt%imf9>~Tkl;A9 z_B}1!C|+@N(_Z!KXACR<1k>KydrLzEXS?7+(ySx#?;Gvv{EnzIMJX~xefxI0VFix2 z7qI+R#?qZ?u8|OtUZrwkywhmV$7MTUIvBUa&&hQE#?DmLQO<2Kb=OZHS5^XbPn*w# z1$wamoMbl0J-!+9Sw$8U3N_HvWIm{7v&M|+<}s2y{P1CRj=1z-dv#=IKH2>^|5=ec zSTh=HEI-8ePmD>K7*HP`9=712=#EZBM{xWi!sE@##vq=O%Q3iILG<;BYic~6B@`eM zr>~m8CiGx5E$WtmsqG)p%mcvjkM@p;WP{!9mYo`)RMgM|I?m|MIQE#&XT* z^M3W9-9_XyFhXBJp&&<%flA7dD}HiP4D>+zj7u7B<=j*{D=KEhbDfBInZv>&d!1vL zT~ljroo0K4kw$0ObKB@^ z+EQU=^ZNE{DGqZhYuWZ*r{8Bg%o$pvOh$$bSS@j#3vF+U2gz6vJ(pggLU`(Vd1~D$ zV)ClNjq|{8#tjQt*qZS7pPyRWw}+pis_D)B3%If1DaRStv6jC(AzX(b;&t^0xUq-( z7Y!^r$(Y;cHhrQ7a=-jxVh=Ma8;Nd9`|>9Xg3{XZ8iH6^O=ZRH&(OJ;wLjfF2n+}? zi7kzaP1)YuefX#wA2$qq($`j(Zyt%#-SLypj7?^P>QL`hANMT-294q^xITifJ1L;vLJKmg2q_sCE?+Ti5DktK3(3B2dJyIu{F&&%7Rj zrSZ&8S~^iP1M~g;`#)qd&`#052~EiKfkZ%$404emtV{RHN9`fokIw7$5~+i(9uiM! z2|L?4fBY}FKTRCPp3xN^zwCmdE&Zw`N72}x+Gt;JMf z-of_vIbBDe{{C?wqn!pG7?9=TH7ZP&i_z+b)tE>gwzOel`Qg0Q?+i$2o-Od$z62KB z@wpY&Hdl}qY-|QI_B0uEi6=Q=#c_NS;`sbQFk%QBG=kW~P^iqI1Uj-Sb2V zrWD;T-}MVic=$Cs3_)|Ox7V;#0~)pSrqa^aH5N14hYbw6mVZY<76Q8ZzOU{f-tF^O z^G5XweXxV!r$rtFiau1`8w@NqFa_WrtoT*SdAesny*{1U|YCM;*I1;Fse zfC2sk2f{5PugzQj?H7;?+W>QQ1bJ%~*x|B8mNVEEMAlU?WN_M$L4q@H@bC`u`ppB7 zVEZ~`mc3jI_U1^vh^g(Tq{yoG`MVz^3lcw&F|24IgpZCf@7fHlh|th{8)UicTC?ll zgA18HdYZs3HZy0LndNy=t8e-U@*W;E-@wyUIBz=jIapcsi$|12cK;KZ0?7r@StEX$ zf3vU)AbN-E56m8O$7$P@N1!BNS_wk{- zQy7?GB->)FOGk5)-YZ$&jEkbkuzP-E-_6O(Vf8l%fszp?GQ}zgv8mpSh?o%ykvjSv z6xKSU$n~tk-MdL2td|AXW96!?y77lyCKw;RJvo6X_u0bqqgECuu`UI+7JXfSVTZ~p zH<7ajmOFO>lc|c{Pjh1VruB!~mz0&`%f`kg%XPN|1_Vd9*WnH{Hm0*0ZvFZ40SsAB zf7CC(<|?+Gm=KkZA&K1j*~-@uAE}Vu3noye@9Scl^x;YVnHcxGu~C{68{K#hg0zu5 z)#HTdPyM0q;uTFwQr5cG)*Lr8G&3m4d%rW@ELLBEfk7@Y`xpVp*i+ZPx-F8;^*_M5 z6cP{+P+`9zLe3Xy(KNq_?t2fOq+w@DPQQ+>%Nh;g91WrUpZc=?WxqSgC^`4#UoOKh z=Lo9FT1KhaCRrkRtK3}Q_&vB259(6x+bv>VXAjKe6fBh7GT4ewOvQsDpQGVEf$q>R|NolfqOlJw3$$)Sm(gCYUZ}>r_i( z5vK}8p+&3z2F2dwM^Y2x@FNPto?sp)SeI}&ZTy-brk}gFY{tPMPOAjJ04S=1!B%T_ zHNx3csTeME_v`g&S%(;QqK9~{$-VCxx12n+m?DgMOf|+H7e9p$dR|`}#K@eWF&SKs z*s{H?!aSnt;W42x;=)mVtZAw9?Jim;Jj>8B}jn>x+z$W08UwhK>1@v$gifLE%E56@4 zI+B!i98JgntiL)OeIyk7#lJ}(tv*1Ndx1Sm<+IF92Pv&C!S zf}%|Ym;_)pJ)FONu_`1qAy^6{T6SlPfNRO2>sB*0b&8S+BKUCs$BFD?hS^<(GkHQV zU*;2}Tx21{zkC~^1!F$_s4tltE=sLoFwd*A9WcI8pF^n%{4sa z-djoJ8Wpd_*)|QVKjZgxR`P4;P6P_WrsYG#VBf`lvRWe!hoKA;iIL&FP(fJT1;C|C zHRTx6&GOXEcLSszs}4?y8`}?jpSMP1vOVyYxfxBcJLN2Lh~|AaO*R9~faLc8yV=2U zf1TH9E4G-}tCTf-qbw1C45DR)ZI0iW{hAw))75?Mvi#79x20?1WVH^h9t2#697BTl zK6;{o57gDGM%vGG^bzm4mH%b|_?_jqdwyNFb85BPlJcDtoQi9nCC2>T#0VQV zU%N(*-4qVWxp%iCTYs;u^`J^_gh$Z^eAF<(l>GRqTQw&NmTR~S5zKNA4dp&zp>nM1 zJe&w^ODq#<)Gs{U>z<iw3It%UnBnr z^v`&N1aq4gte5SDQrAgS->p~+y{|DjenCM>{YBX-n(zP_ zA`8<_iTv(rf3Y^{pBM7gvEm}X^a|V?z@UtWHR8BjDlZr;vdILSf7}We7c~Z>poZUl z(=RO15O|15b$YE04?utJ*{fHL05NdI2j{V=!7Uix%EWy@L_L+aEf=VGvv6$HbnuG= zlci}cao|mQdJ5Y|j6RAb^O@Z{yN)ME#a{1Rq@h%S5$YZ-NYrO~CVR?A{? z?Uw?iM6txP>?s+i{F#7kO=A!T=YZAQ?P zOWsDMfOraY-})=0hAG*t1`KY5mDzmgUE%?p1wR@NtbFC?Rv3PF=Qo|ZLPA@Si1h`_ z;t@Ia%fjSfv^29R#glNSjE@|KhYjsYH1o`6tt&)|T?QO-J}+XO0e3gk|s6F&Z_lf*{|Uii?UL&*zvTNy(U|-Ja=N9+aCd~ltKNk z6F<#H2e)aC)*l#+kBarBNm85c>|EFd$yDM`f^NI42soisZ%sCrMY$+?ce7=jNkT7* z5`R&082x-(acgSd8?*3o{1JjorJ=a9u#eE{o$Z|Uibs;3DLtOqoF9F2_~?ad>*uIO zn(Do?$5#|g87~Dl+f4`t@;txxqHJts_tM?a<*LRdGUQ^z422UKsKZw#HrHqB@g-`{ zX05+0RR7_x^uy%4b0m4Zl#^G%osF$R`lH7`o&{uO5~s_r=I=FpCDS2KHMbuy;0rSy zFh%q`eEFN$6j5?59(4Rd>13i=1uu03O25GD_PAWqRACgSx4f2uk( z`DXax_3g?#{ilDSF~Z93^FPBlse#{qnSdU=L3XqFg$L*88r|!)Vsa-uqJJj~fOwbw zLTi7|8E*8yz}w$f8Dipj|GU`Ti=7v_c@TU^YJ=ZaSv5Uj8X(j4v{*f4{B#z6q}521 zP>P~CUu9VXZb$B$2bO@mL9V`65@ka44~84cqf&D#>siL*=XXNdPB;#+2mc{%OU)K< z*3h+~EL{!wlu@yKN&;Dgt&7O~7yUyTjS5#^sk}-n-kY7tWt>J`$KB!wZeCsrI;S62 zl8#}7IaSo-IEE`+76bf|0S6KqeP&g~aC!<#dTle-a^Z%a-}*XowUBG%z4i`mvfY%! zA;K6grs2IdenDz$#|w7Rru$!Wgs`Gzj|Q!DGJ9)}5_b+Vy}**~V3Gh%a6pVs+Mg9n z6sk5+ zIJVu)qSkgwmQo4tbh&d%Uc9EtpV7b3qSjG2T^At?{D?WD$b{9pRJM6M@+`#j9E$)+ z?X|m450VGwlFO!!CwXp!g9%@Bis0HJOg9# z5WZGqia(s472fk7`49g2*q8yU{zf<^f;E5Q&cAo{0csiVaK^VvT56y@Xb7+b?rXu2 z9@xFiJUpyKqh;W`V>NjLJph2q>}(A{=b*NPcX;5(0O_oKZuh?MN$2-^doKyU_|JZ|{& zX9@lRVjNV61S=;AcQZQLIp(S=FzWl}%_tp@!W-R=T&rB%%bFgkVqv~%!9L32cv>>P zzf1?cgn$eV`KdfGx|I?=e9_2E+DeqF#^hO??;pbCw=)M!yG+2G~~Wi zFAodg*1dbapeV*l%EBxpe`AMn?5kd{ZMeE=v8J1=5QJc3E{YaIR`qgLPR`fg3>=+G z*C!7y#OL)I_biu~ERPgN^gq+gk4g~?7k2vpKu;i>qF8M|LILm~cV<|I(OgNXwy@pr zYtgd*FrqJGxqyz4eeM#Zbc}2TOxK{PZ3hj>RG{Kra+qT?KUlUijqbB7^Y?o&G^EAE zA}WcWMart#HM^k@MdIe_s$J8EAjF1=31Y&6g0nq7$v92ZpLwrOjEnBB9V+Eeh0C0f zk+AMu4S-F_0h9*3ZFKLds^-JX&)^e7CgkTQ-HMIv=zefVBV;?6GDH&sd$hYCqmx)r z)9L2a+3>`mJicz^aI?4!fHK66YofpXmg35D&ruW~$NTh=rAb0I`%ohM1K7An<+LzZ zi5{WVTNYc49Oi}Vmr#OO}TBB^FS=xGc`;LF37|X2}u$p}( zb=BPHOjHk7Rz!-*K`!4%5vq~ECVdkVONfNTLy?U$mC*Webun6;)2(tHA-9z|LC3sX z`0YKm_n$w;psdj)hmRWsqN;$SwqhSaFSTRgN!7$;Z!c(Wgh=`3=2fJpKh9GE6u3Fn znc*hSrtQ5D|IFdG!Rz1?6#w+})veW{82TnRY^=jvRa`;$(UIH5W2@+C>IMCRsILYG z6h4afA3m12|hLZjkLk5~67F5;j*U5X6#9TgRXN&Q%-xj664kp|~ z3Mu2HWa2%EjK-mFh1R^0Oz^U;S4itCy3*;IV@SGq+)y);k z91Oka_p4Juq;YgvV&=6uZtJe3tLh=l5{7LMO$XQ)EyXgC*i2p`($hJ>**SF|IlyDrs$g)$VXEyzQ;hf!-N>la2KH`8TNT81=~FI!(*` zCTxfT3Ba7wKg?EWO@2F>;?v20S@`o(;O)2H(9#qsugBgrGh=8Ec^ep}Aj2?h-fzr9 zqbq6TZ!R}Bq@o6jn%~u!h;VK>R?$O8p?P+F;$#qj!3r%MIr9%%lj0g*g;rbU-;93$ zsDk5Xdpf?%@^}Z~G_phskrIAttDdJSbWwV;`T=^Hv&e5BanwjR>K(ZsjM54?@GQ5-I36TT@ z%`p(t#K&JnG!*X}tUx5WjCIo6c%)T!1Suq-E{4Ss93fa9+N(_(t;^k(M-E%1KcE@b zVaQD$Q`W9osu`l0SKX%$P=Tn32+h={9lsNSuZ~fnCZgvoBabgbggJv(+-f7g_+nb~ z3<~Upj#eiDN+{ysE}(D8#YJ?D5(imb%|oUa7Vr^U7cUii5d<`$AW((4-~sLmNCw_? z@{H?Nsg!MhHeC}fa)puzADLTXN$jK>;}c?dUStl*L4;w(?Kuo1h1hp$|HB`;5FYqI z{}S>Yuwk^(JOXSN53e`8wz@*I1)e&Ezz%+=I)l&SCJ2t(nhLU538`bEh5q7MV)dhamW zsZ(@7esVM#YjM9gQi4{WGY(4g2}?UH?o4^g-KzmakxH|~k=;o`QW<^j7aG>`<&le* zgAjx(zv{|CNpOwE9T(}TCK-bspa&tew6t;KM0g0+q1)NUx3kyM-$__CYxQQhjF1kn zEfuM0xgwtl5$rRwEI7%+^9HU;&A8&dAI|>x?x;#Lm4%fG%QfmIY$u3D9L%h;k5eBH z#Wd+_2TG~Cy6I_3Gv}LPU0SCwYnL0Mh?|{2o`hn z??oDe9uywdiNVMr&VBH7W4!2JAhEQtmfs%=R45_ek-^)-HZMem$eC~+C`HSH`?}UT z|1FEJIt6wU8X>F=YP6qoYSeYzZi|R$iv1KH@#T5GI2oj4EkJp&MW&oR5O#X{RhIX7 zfSbdnd_0Zrzb8Yp;W&lfc|&e_B}&`mGk<(AH1d+SJVUT*WLP^}lNIuRl&E*u9!TgZ z%FO(VW_dd#==*cQECl*HLVP}rGqN{5f$uQKx#^7N^9{;4unm}Nd2X%+UCjj{+La`2 zb1rfRAqxo!>%01GA5iU*M~p0Bd1bx4$qRT2<0Jf|LmY4jIftgDGpQ~Sgl%qaIy!9y zD99{W3rt;jL2Plq+NGUa;dpLwE>zh-_Pjwv?p7%*&GUPI-vEfIhQ-+`37N5bxpUid zQF2C2uOkiGXE)Hm0a%2OJ#d^eaNO!PztwYDO;zwaH}aQbrvau1^ed@TCMin$o|lc~ zlG;jeL1x0smPpxpjuSqLPv+);p}CnaW~CGetr~97ed3jP_jH=eK&sjZZ0#D=sd9~P zHDJ>!xp9N*6C~jH{%$Xh^vx8Uj4T|Y6RV^RR49|>v1y@ck(em`t>L8#Grv0N-T!g{ zp575a5K+-&d!cmW!Sw6=qD_Ew^HXCW0YRxvi&ZXeM_pZA+!U8@6xzez8r*wu|A#?$ zYu)LG}(3z5B?&`}e-eK^oc?^xy0IogThGY9Fqr`b_c$#>{! z+1ZXXAN7FQfm>?{93BK}!m9M&tw=%S|n5}Au?uQbEiR)z5 z?taiIcvklOk-TN?pnfmP!N3B5JK*%adlyydctV_(b_K)^Wmw6TS}ry8D(YI4jrDOC zK`Qv8-2uEd&XGMxMOm&_}loU$D6!_crcG;R)XNyp6jjG_d@p85Ma8>}*jrPiUw z&V}(HU~9CJQ?iG-8@jqxl5%L5+Vm?!$IUd_wrGk$Nr^i|s&Rj{4bE=awEC4K7rL|= zAOJ$ST!d}nejcU}Zz%r(3|#C!duv{Al0yH_tGH+H!~O+^$sl)&p@RD~% zuH=dGQiRB-_p-)Z5)(c#*I?y~Z0bYVW8T?qrR!Y|2D%rDxS1d%US0l!QZ_^xtQyY_ zCRDPBjMF5p97CjRMri0{=~+k*`N}g{8j86zRoy8YHegIN@ECQcT=0gju+!wxehe1@ z&Yy~mZE+@ZzA?eu)A>xStaDojT=BX2`CU7%;Iyow64h!TA>$x?l8sn)DBL$E>DY7Lzx0*E3B(y;1yVqDp#a4G1M);wse2T}!d!4b2twcMx;8ndlAj zwb28sO_ey4gca0jT+t`PIHup__nfYsR9b$V0~3}{UdsIhjTam4JRg5B^xU2I2lqsE z9$B)ympiJP3SSuH?37F#O3AbV=eicZs~v1qHpX!D$X~2UM}Ew*TxOa+SBti;?|>6 zRNblBp?Lc7MwnM_R+fPCpJ@vcr|Z;S$2J561n02jQnOM2r^hxnHtn$-WH^3jhr@Mk z?d=>|ZRO@j0{P~e>gt4q1Xfa9-*47-b{GhZU~b;* zb&~{>ZNG*eKYo~e>IV0rjt=+rn!U9r9&5aK-i)_sD1X-NnE|fpr~d^E=N)9Ms~el# ze&`NlMeh~8TJp3O2$&E)TU}kv8AbsX(!4UWtq9DGIUUQ3C!EsE5&h)#)dZ%a#y2kto_d!imM2iuo}1P9JBWo2bF z@5UMT-4P>J()O{jqn2=bufzUS99-Nf=h+Z&$E>ff?@Z(uPX9G^vgU+K%6jeEwRbW% zS=92Y2}-Zx_-!qAr+RMVB2S+_t=n(n&~cve^XI|(fjBDxp{C(>Ix$5Z4cDQKwZMvU zYHBcHgDM*c8%_J&q=Y{o~7-|uxY6$=p)0oKDjv$I@TV; z1-k1fl-p8ITA29hei-bt>sHlIG&K*W&Q7KjM0WjCRieuQ%`>N zJUJ9USysUJp9LY;?CfmNZ7w|5Sq8I&x|7{8&AeURvqRt>AAu5lhLXv>dl(h3tH8Fp z)^lY&&g*DwYIAFAZ*Ah4lG5hS7hxx`55Sm!jlI@0N!`Y#u+>1b+st< z!QXYq^Bi+!g!ul%#Kc>Nr~>Zzj&$iTbnk)!D>=E2M622nFvxlO6d2@_Ag<1s;{2hq z@^BzqIY%|mb#KC{HOXruNVocUv)$L%cYc0;?5hRn)K`UBfUEe@DRf;y6Wmft>Ia9{ zLHpxGzC8898{i4d$@!jY(1P@}4>Ob>Qc6BD|y5}hVpq-hC*gWdU+t!96Oxb3dE ztd9MyjsM6*U~{J{ADXu~&Qyk`H;%!dyjUcGt+PhZe( zVgK-uTFl*fb+oh#6HLs`Y_^wr;kJj7FCdzHa4V7!N}HaZ|!8WodfNCb+uN`AVtUz_~*Jm z4Y;s)$7?-=k%55$ILq=%N=OiVY7uoXlZQJf= zNYc=xUcS!Pkt{rH%mYrB6DU_4zq^QajOX>1(oO=Zzl|SJz3Av@_!420vw{dKGcyGR zg%Io+*e5Mc^fzv(vkqk|XST$GSK-&Me0T0#K|*Q7Pv;^P)<#QnK7RaIRJ7R<&#k;( zVp2Q;|59r?Q3+>JTU#6G_v7KoS$D-KWv?tRkHFTJk&!VlxCu)T)S_#jX={rz)NILW zX;C7q>R7>3+l?l&j`A!v}q6*l9BhKsl&tf@8O^=f4`wMAYCOCj4L#0pF%ksz(f7ovzo(j>+T&jT}&>)~>Mi6X^wd zY4)Hg7pJ_uyqMhrUc3>s2|)ATg7+#cb^rRf#t;UPc^kRyM-;`*i#qgY^KZk#oVrR5 zb>idW39Pn*&^XVx#A{d@Aeo%6QTz#VDHjUNR%0G&A$wzpPOz9eJ3HaX&$@rZWvi1P zZ8{cCyWb#$?Xfcmdv0aL99ddjz2LpDV2Ch*gDVRQYVCAw#WGx`1kx!eWzWAwP}7%` zlsq{(G1wmK>x+ONF!b!{p^b&P1awe%UvWHw0Cz7<@skS~Xy!xYhrmQL>55|WySp)< ztZr&CEUnWl@8*E0jYV%Nt1U z!5xBH)Mv8F9#3D!>tq6#P9`EIoS2mKVTRJ!XaWJ%&x7|lVT6@0?Xiwx`uwq6-YqU6 z5?~(zT3Y%i%vrtKardnrOk!N1W(F(WeZNr>*RcKt#TQPHb7O>yxZ zb2pw1N0-T?`@mFdSZeA5IA{%;wu%Sc2aio*u}=Fh>a6_yWgFq#Va@ax8;p4-rBcpY z1@R~P5!Ck99GkzysT7*_3x-pSEE+gqY9@PRxi=tzjf zu?9-*+^_F)Vgz z=(~*7Xt5XwPcThb8YXbcr@rf(fQ+|?_6~rfKw^ZD4>(f)Wife znK&*|E>e5{mlYSq(NQG`jI_LijOK5l-_vLega>RaKXi$z+zZG)j6Xmtd2e%feq#ce z&NkAy5gA@pLVo$Max@4!jHwg5C_sn+PJ4VO#ry9SAe8%?10%_x=TZLp<;x)m0^HqB z{qwP56Xh3F@xdYu5DiGyvp+L+wsk#9h#nfX-GT7|j68^1e?LXq7|$&FG_Yx5rU5!M zA;DSTwwkM&BP)m}u~b4oGxOxcW5O{}lvAK2qv8@`xY%)hX?-v&S~Cv|$sH>6clyu0 z5W1>&lq2QoH5tE-;{yV&g-G!VnNm?+axx@N9Dga7)6u;~&FwUCundL|B0mtFgZnuq3miTy*aA=RE4*{8s-3R{;V zd<~>k4$sYvBQ5Gw`Ajou9)gmgfA<5ViUB}mammP_va;Y~iEO2~wv<XgCs}$f1z)j4`coN>JqMSBLDp?JoI`9^pSxFbn%Q54iy?2dn;)ySi&nWC`_UM>y}sZ2bq2Z%ZKsL2X{ z<>*u1P6BEN8io^7Q*OV%&)l}$l9!9g^OE=j&D2n;2`@&pKRnN*V7OCrC#$TiK$h1% zt*H9zCmaNalue<##pdyD*O*m8@SAFvpbsyI;g}nH$p&~{lsgL$C%9SEZpQpv4Xvx* z5t0}>0(kGmO7Z+hX& zm#QiZME?b`)oln-AUcnQebiic^?ED`^_7=AOWGV*ey<-qXx7LZ8mqxTyi0;9OEq~J z4lm>3Ku14^SvIq_Q}~X?*Bjv^$Q&_m!}jCMmvM3nqdN*;;&SQz_kNd*!t4f2OCxyr z+sQ2A4*AC_9;*)^tS)nrUq+(deYqH-c>&1}cabrEt(t@O9`80*vq%iU&(KD!UYV<@ zf&&TK|Hr?l&ae^Rld=(B=tPCYngMgfM8QcKwk36#f)3f+n@@Ue@UXUaiyr)4y-WFV zY4jkK;W6^Ibaj<&wTN`{tpu%Rh3h>t)S$Pw9*DsJZ1a^zm(G8O^#A51u(N7OrYS-n zSHkmM`@HDagY4qWu(Gc@RJw|quDgIk!HYsOMJTN!Wlk== zdPgux;;DY#XqcO2sm^dC3CutM`AqTLjaAKYI7^{o9)uL=Ro0S#6^$-5fBQ2%B?-S9 zrMeRmQQYCEd$$g~r$?~`Ha}OT@z+;TtL(6}{4>?I27d(Sjyr0!2hL)%k>Vmf#wEeI zS~*R&=W_!@8my|WKayZ5A~d@-Y5dh_0xnjpv)i%7=DuZ6Y%bnKyl{eDn3|=%PJ_Vs z9Pkt#=x0wDR@rBN_%%)r>2bAjvX=y>@3$q?s+gMN=Yj&aBJ&6OAQT}f`8@z?3#Dt|!kDffJ;-l&w@bZ4IP3s;u_tM9F!-8dh3 z0|R9VTUjYN^SjVnd_=~=6qRWCjuu$klj-M^r+@-jB*4;wNeSSOLw7k@?WU5Kk0P|f zKJ;cmud%A<@t-8JC z19ZT`uKJNd9Q*WZu5!7f1+!4%W9dr z6%nB2R2TkmB`D*LO(61~e+dig(3t1&-Cdx542_Q)lmTKDU=^h$HInvy+k<$d{xLyfo4+{$=x6V>sxA zWu#QP=;?QEcya7?QxTCGK=SJixLW01fF25NOwg&{-BsnU6|T6E@PCtQB3g_7O+N&D zSIQX#>c%P!q0A2-@_4(J(y1-n7@)_#6E`6Fzh}A-&WG&?^3EsY{x5~vIcpc>y$Ulz z%fv*2Xkmy1eiy%UJ7dFE+si9#3m6a7;zDdh4-pB^t=AT$LD4DkFyPQO57HQ1krQ{V zt)12US6~d*w3LgR1qM($;>8E_rsP~lE95%8CIuk0&Up<*J@IRn zetf5M5mOTMR^X}Sbiy1Xo0_oDC^R687dzbMOT{Zs%RC!nvQrHI1<|!PRw&%or;VS*Flo-1&zEVIZXFZn|s zY$EFMy)yf-8{yv#i#@7lxwCa8WQ;Lgq)P{%(o;CVEZjYhQoG}?={2SQo0#z;fCvo7 z+*MB=@caX z;+rK_hQF3i6;aZ7!c4QGTWIS6W=GMV4i9i+fMTQ|?wOj@@;IZfg%8|@{||DDTnt-K z6BJBq>+2I$N9`_KxL~jhJfr`Y5iV$va6V{%m&KzA9XKZ^;e(=_^vej4)?uU?IQi#R z-nI|Pq`>2dnq)mY@>dywAijjoz=%S1Jy)nIOG0@y;kt0Q-w-v%~NW8;>ra*drq7@oPi zho1^FSeO}hIDVU(9^3awYw7-9q`d`HRQD+;X8wN$rAO z1RX=>{{E*Y7vb0VW3NXaai0Fb?95X%Sc(%{;9VV^bs2P#gBrIL5hXt&XAjMzX!t;aXa~+A#eoK_b zNs)_3Rer7JMU7Gut4-e`wY4*%4U=Adt`xa@4=0$iH?#MFe&mBIsZ}21tGXY4dXiCB zZy21H#PaONE~vLJv!xLa8$cWBa*O#Uv1`|EMe}*EL?F$=TQ6O}#NpuVXLIr6;T6Am z)19>5!EUEy%kEW*^x$C9NyWpE)+hK9^lbLIilD=BXIYD#dt!_qKw)RCmHLJ4T^l~~ zhDd+v(h1!Y4A?x&4LvDqIy=o9Jyi2nW>=Lp6d>K*Ve=Z&N)gRaOpeE##e8u1br)Iq z%O@o4Er}Ib+}uwfmUxfAu1bTEExP#!e%0A~v>+yNke_Fy;$--9l+4&;7G|oNfg!qd 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 diff --git a/enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Lists the catalog (failed) (attempt 2) (1).png b/enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Lists the catalog (failed) (attempt 2) (1).png deleted file mode 100644 index 5495c5685f017db289b275c22a3736eaeb8b91c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100943 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 {U}4k?#xL7ksBv*^`6w zi9%kh`sY7$PSgWXCSe4+6Gwd)6?hu$tqkSj3++t>@|D$mE!6(UY7S zzkqMor0)f_7^RoZj(@Y(qB?$MbzuP~!~No|x#wo4kCv&;a5HR-IuuOelwFCvk5UBq zYK(U1J@EzugQJ7}L}5+KRSuS%M-hlF7*U7JIg}k{6ZB4-QaCmQ`iT%K+Aqo{h)v6J z^Znwn@fw@fnI2ZCUJ2{o@S5N7#N&$i`5n*Zbh!AY;^(sH|^Y#-Vb%Y9=?FZ7|~}Z|!zUIeDldqc;;Ie0o-R z;cB$MTzxEmF>*2{%v!<~i17rj;U3)3SzK;8i?v47hLTxPzrN+?q1aeb*a)Zj`TFHj zG~>Ss7VtQo&qBF-U&Y)(u0DWlBQEns#_VsNVLvPanVOja%BdT%Q6!P-pNdSIQlQ>n zzOuda#+gdXLLm&5qfxokJ8g5)Qm8CnG;XP!{b^s0YcJz*dVfOBW$AA5(TB>}w$-=Y z+D?Vs7q0mk8=f&yy(iE=U1~k?yRN)5B-{sOc(=66{^|vH3^@vVP|y5Qmz@^n6Dy^~ zCHm%R_d|TTxSgI#eMi-(+r^*FCKKl);#YD8E$ybRC`aesVQopDXo?`9tQ|}#>S>xbBZzoK4C5useuVvA>cH0|n96W<~dER`=R9$x3b*D4{M{Mq;mz6zw zd{DgpcO>x3}#+s^KAIJVMLsUS^#Qh27^@ke-Yl#8uaa5B>XHu=|%u0Hsze+UZ!Wh)3My}Vw-?Db`OlT?#}t7c$8!0<6PrE;b? z#5|btTQ~MLxU&~-+u4yQFnlDKa<{TnDK{C8PH!J#X4Nt)9havRe)OP+NBIU&r}F~W zR|U)V^`d zm8Tl=WqP))hBfpgy@_jSJU^JEj8ab|0$M44?td0=jGikhLsH243Mk^1i=d5Kzn&Q| zP>R|YXq&d+bEJhrw5C*kOe%P1!+YWhjRmiLL1}K=9@AhCVs2;S`Eq5u7@-aev=MN< zCFu+0<^RLjTR>ISb#0&<6A=WJ5D-vAI;E5pBm`-Y?(XhZL=>b&O1fKGx}+PVOS-%J zPT%+Y{_)=&m$4lKgmcc0wdR^@&L_5~FtQRS9H{L*#8dhfXqDFGl$iY+lb@JYbNaQv zVghoFyP!iF3t44e0{LRs&2L=WrYcHS>%mnDOJxn_X;KDf!OUiYqxr4TQt|mbh4c5Z z3D&c@*q6r+c0zi-(h4e67;hy?uu=z#po+aVVql0gzS*mw;os+QN{~76bV@04`NtUj z3o)$2s*}eE>ioOBTotZ$+7tT%B|3kKz@z4;{uq1GMtjvC36KXH#w3JGHmt-EL8NHt zts0k0}Q!odnrKs#k$oVG4ieXU^=MB&Dx<`z?x*(bWY!#g>q_6TJ36XXdwm2}i}MBz?@Urs|*B`lf}9Iz4VH(}?zr_paO?@rygZ8YWcQSM{Rg;0i-cJbs~< zeut2iH_?=yz^G29fnSCaRfhnk-ikt~Q4Et>i}PcXovu!gm8ZDfP2A7<`}!zXLq8;^ zPL&MntaN^F#QdJ5GUYz+GrKS7WOp5}*NkpHyw_rHz=pyg+x^!JA!jB{vw_xjs4=*< zS4o*V`<@U|cq(2pKHOLr+ReXN!ErJgh4ONA^p}k#xb~)U;C7RnHOxww6Pprp#(K>j zITOla4&X^7Y2<%wcQUV=HufIZ&KJjIy-=`rHQHBJdo$uMS?@Q3FR99Fky4d;r8AhA zh}f8lK|;A~vUgyD_0g{;rCK}7F9IkY8alwI9I&X`Cl7DeV~lvku79cU_AQ+vBgy$C@5MIeF81iy7#M-F zFDM*rPB|>~@DUP5Pfthtu@B}J|2VDhis6LK=jRKLfy`A8{|yk-tFZS^N_xVFb$*U} z;S~ExKI?o@CC|S`T`oe!_4uA&r*u@#AmTY1l~v68*52M;IR_V`3OG-ZGL&>wv~*<` zfo)JNj}#*pc|T~HaNS>&^XKJFe<7l~_fzA!b4pO^ba9y4!P^-8*3^A@&JgRL!%t6Q<0)?-JQh1K6{TTh zoPD~~P-_KNxJLFPvD>W>NnM_L^6d)Ur}C$QRuKqnE|Is?v1X9nBz8$+*nQ{ zo}peA>2E9{hA6&#X|Gnnj8e38OKmEBDDG@c;|^(QGtXIOaY1rT70&BEIkL==uA*;o zdxJZPQY%xEIk%&jIPJIFex_vEpYJbxF`;?7nVV;i`I)g(LvL)DoL0kx;7w6PaAVtJ zkv=(p?6%<((@L43i(#7yjG-t|G;FV{lfhOzy|+#$^S2l__uH5zv%8s?3>?mjSFe+| zcE>8W=NEe%v{(5~t1MCA60GA~Vf-t_QRVOb>X;WDg&PBpRXQT58PB)p^@R)MEO2=(O}~E^>1&y@e8r^j=DY3OWWI)QIj?Pt@Xo;N>z^xSqYnMj+^ z$4(!o9Ih)LwGJE82kY}}PJdV>%6jBfT8%h+A#JS}N68h%!yC0G;ATdncv+6JE2J z>p3`2gYn<=940S$x2w=>Xr6u)(dSTCP%BoDd)Qrf3#nhEf4G~OEven?U}e24;BqI) zk80Juac;*qaILJ!z(+yu`@S}d8r2t#l2M6AGcTSu(ks2V_}Dc{jXYRc<~rS{pt(H4 z4HF_++t~B{lEkdUa-)H!kN-qDETm5Rs;3NFc1Yk+6FG`!XqHb;b4^788>7=VkNOT6 zGrDeP9&nutQ&Kr!D`&*yI}&l+ty*6u^h9P~m#lfeaxMSwSYA%g{S;M-E&k?!U4{LF zp%Bh1?wDyCJXT!1qOW)^f=%~WMkA!3=O{O7O8#`4?Yv@O&`7I1jmLWx$8nmuCa1Fo zAv4Oyi{v2muS1P1jL#_$cp8rJ#^v6(yaZ;YyUTv-7858xQz|1G=ULUM(iz%x#zy^L z6wmJ@kc3yAl_w1o`8(0OEZfO?>Iya&i{`Z`#wIZ%A37ta`V|d+l%JZxO_ru! z_1oddeOvAW3l*DIengaf3OEYge`f92(I#*@cJyW{U0dVS^n8j0bS zNk;G`U>(qFulmsWU)CltJ!tnhEzQ$#=N}v*tTAOR@8qN=-k)sw@|0)*$KhB+Z=0=O z_F88|SouYMs{vCi+|i@0Sd$k9d&)Tt{^zpIzsDZjwZV&YZ{#q^Rc0t@)M(vKSx?W{ zLk&DY57hth!f@CXy*kaJVg8L?TEJ@+0_phNhxmP&ZwQl|BK4hzm_ z-d5%Mjl7%A*B+eeWzg1;65=mdJBiL4f)IE5JaYQ(fOiY^!9fj0-T8{_B2Dd(=b zjcAyUon7)M1X2%kjWuju5+Pl#`>mP0m%Hp5Yj8*2;z_ojq!d)z%y z>>jupFcpgwL@YZ#>6_f0azFUhJY^(=W9R*1E~mljM%BhyKzH2mftiP}iJMk{R|^Jm zgF~6UYB%3CKF&Dg&XnQrBc zrCkem!Ejc4Q|4XcJBTw!maFLVF&1D6v-59s%qh983@>CEZdJO5$s6Ec*cNZPoECp+ zj?=gpt3i3`rgdjDCcR09p?q@WqR>akK(%!=P@iY>xS0g^>?91Q(m8BzkI&%mOQ+4!~al;i`big?)=DXztNONP!OI=8qeh)h0ROhH0jl1 z0+y#^nlv+f>O5knB8p^|;h5W?QXA z^l|T$!}zOunl9Z0j8;0_ioIV67#8Mk+cm<tz~JE5xFwLwM2$Tn3zXLNrkoVL1`Z_YU1pL{n#%NZ?9RmkAkVfFb6#Q)|B*QI8h z8jmN-)BXhW=|;PmO#5uO-a8$5yahii&#Ep3@8{%TkNvXWw-oG3kEoNvo zoQv zXE5K9jbMIhPUTmn&KHLw}`wiT?!jEK}GAl*i48`(AY<1RO6HIyRq>+LK-b2gB7)7UkTKqG=l zFCOccK$Wv|c~9Q@&}0J|Ri5eh9hYrX#*bPL4&vKQSWQ2biz8ea(^IW{UhhJgF4{+q zBKp&ZBzIi4zA_V8bSVAO@nbRf;SFJtAV0Z|P_PGzZ@Q}5EOYUtoKPe`bUkDUb;8TM zxyl~l(Mn7rB`#Mv_HEqRB%s^Sbv}OmeKwi3N^-AZ#2&kjp9f9;uwN6)_LsMTsFiLi zG@@J$I-^-_O>yjSI|oU0(R%Y5If^#e^d5vq?JupCVA`qRRs=P&s9k*}JH*R2Jix=_ zTi6p!ey+mXiurw8usm9ly1mpt%cs>qD*#47k_OGbzV`NRn`k~ATac4chHX`NiA>KDeILl$&S5E-QGg| z3A@S|xZ&4y4zKtb%;MaAm4HRWsvs_VGymp0SP)t}brk#ht#Yi}W(S4^AVs-Dp9^6g z_fph4aQOLlx|NHMDe)~D{ z_k;gEQm;Qm{(a5g-}Ya*KQA0E^8Dvh{{5|~axKc=(ev-YM)wDK z@c;U8MW<@WTJBx!`u^A%b7A{055_*$y`J2>0j&pFI#`caS6xeHw}Zx`$J4^iT=rh{;VU)9To-jqd@KFrcqyP>84WD0oXJ zHP)8*1{hZ*WUG|sp`nLjcp0&9AQ?leouKDfSD61c>#K5(J=#1eDs^}>;oBB}q1l`~ zsR%L9IwQ8>^=p*RdMn$4+VDezJ}3A$0fiOGKi4)aX#i(cxX^L9jgg*}!={!X^$86A zChK}dvIekm=9F)FF58|I%$oogiUDt4sTB|-*{a1Exh2M~$afYU`8YZ2v*8P>Z?U2Y z76A!DKgX?u1(V2Kknn`l+}~U`CU=esNrMRys^Go9ZY#Vl_dG#IDw1aK_~^!xZMn(Y z`7}wQ$H0V6(eF?Jby+CnqqG!+v{Ohv6paZB4v8|4m3;N8vzo*~k#=aU?Douk{XRq6 zVr4bA;D#F8LSz6o}ZpdBSj*9aeh#Lt<^b6i18}H{QFK z0KukhvI8a(U)}UIrbhDkJTyYW^U0U~mI--i%;!Mhi`(oQq9}9Z88c*r0{``EH?G$D z`mh721_x*EANJSNvT`Tn#YNq1T>X;LVr-lRAlSfh#WN>oVx?GRk7FX^ zzK=J*m1=!Q#@p-v9ks){V*PhD3H(cRM=}={P8L#~Z3Q1$wyNfTYcB+vGk)Rhef^Em ztaPdH%&gq?8)h@j9Pk0P255(Qgjf{RT+aWzt8vT8J z!~GMt5YqgyB$e3htvw_2Obc`KAJZdO5H!yT?n>P!4fOOge|k`51BATpB0p85slLW- z71fk&43XmcZxsn&`n5e;Uf0i8e5@6W^ne%*0q!lt@Pr-g=w4pAg@AOfD!oO2l4L@# ziVZ*Bb~?W~_X(?&t!;o`T<@?HC(HBN1X`S$iHG<4vEMtS6Q6+h(NM z=i`kp$yS4F$FA?*#1$Qy+JB3VP7_VxvfKGV}KZ>Djoq0#1H&MTjhe7;%NbPpuC#bLH z+Or6tBhN-qk?%ZC4?NM)(Oh(Q^K9t#7Z+oMGl0cMLE&!lW>(i1U{f{j{r4LhUJ2h> zzk%>*yiUME^EO>BciBgnVLuL^8WHOMK2~tN_@OJ46D6#7YI+JQNjFmS` zSO}!P3=NKg!8U{xkP%pBsuHBc#zfyss*2yh9)!RsdR&Rxa`~3PUCc@1f!xalATi~vxAICu+iXofv8`g(0@__$Y zr1bh(5L~oIe|FrTQEJ$c&FR=^d`Zls%F$ip53p`{Uhq&wO}$C$Pw9*9rS;;YK=oZ4 z9H^A&xy?&sE{W zRSg=m>PS?xYS8$(lZoiKsoA~M{PcQ`-6h!WO4f)_muVXvK8 z2*hn{fYoWiuk9H-BZuNpj$h?`DU)TxE;*w_kxl3_IFh2H}_hhXK38{#Ovxg2)Kcx04xVU zM@*%wXu7_IyXDA6NaBV@WXqznV2Y%d$&XA7^p1|BA{Qu+;VuUc)3Gn2ix8Zip3YfE zzFzwl6mbuj7a}VY!X= zK0Z^f4d@z4t3>N&K=g%x$y1F2t0>>&jg)a4TLL%pCT%ot8D$wm-}ICa;`i}8$L|kH zaQEy9{CQk9>Ua8PN(L9Gc;B0A;8^10O7cIGJ6JhTBT>OcmB!++U)dRGlL>C21BH>S z0rfU+1?v<*^;tV9I?4&?(jvAF4i9y?`a;S()S_V2pI~S0ba<*LM@7YEO z9$XL=lQacY?g+LbqT_pQ)+Y0QLNDTnZHkPhW&& z@`fTclBG~V2S$d|)s;!VxF=#ZmM(6h`88@6 zjvQ8C{}WHdP3FTwN27)kjX18TzI|(MV$eNpDQ**z(_{FXpi?)AZ+>0!Rw84>mnS~% zm19eI2zv5Hb5?oP+Yf2njS~TD512|Yk|Mi9S$K9>9_%%|@^VmNeA8t5;$u+qUE!Ml zhOBe0R3juisJ$n1==5Es<;HKx$kn4v zYrPmpOu~S1-dlx9JtqCs)SEZFD=#Mr?@tCjqo91gc7AxlGf%tpzmiz- z7k3rdF*#x;hlV)kvE7wng&o;po#b(+4qH)vD|oP+L?#0H6<6iS-Q6)z^&T1R+uPZ^ zFm}&}7zMI4l-Sz6GdPd6q;Gg7RIcqD7gBU=Ztv|VRoS;2#8t9$WY*?*>gFoa5aI*5 zznY=!Kl_gw+kPel7gYcoEv2;7+gaj@>-1b z!5&0m+Z$Kau6h0mLKPNXJSjIp7%AMebZuSDyYTUXO=PTqK z8MYU(WUUr87r)1vJr2HK=OR==6f130dNrS0ooOl$8g6C{Fb|k1W35v@EYmwH@cW?N&gAb`{aIZIpv8z9tpq5 z1T6>^VwaMfoa2sV9Z>iKDIg``Ltx|hHg4eWhFh0aGLI-79Nb|YB7Z0ZW=sJA643gR zqqeI{#39XBfrpfYcAWSW69;!rPK_?QhOxi1b9XF{mzBUDo=k=je#%op=$G^34b8MW zr6`~cS-3tFANLOsLA`T}fq|x4=DQ@;?-$FrK@y79cwnHduU#AobG+}`z(1bT( ziK>6^_q6dk@`J^u*w60)0+}j(EU!OW(}HEFLC4N6=FGO~>FHA!d$%O{EDC3|JK^C> z7SNVwkEsLt=w!{I3u0-vAHivnA9}wgBY(qMD_5Woq^ajt@mi*>F`OG}U&iHW{DHO| z=co!&+uQqs@p*QQWS^9V*GXWFhoz0In|hbhP2sekNBGt5@6^=RV~BFn0aK-I$fCT_ zXc{JZi@K#O$p4;*Xzajm#i7x@*GavJiT9ON2zITz^gA@rkl0E02EE4g+704KZG}T% z5UCh>r#313`J0%Sl

J2^3d^%mYdWHR=NkNwo4yrs>d>Q6&KySLsTpXAfP?XV!A zqeF)zr|Nz9Ah_dLB4Z>esAQ!l*eWogPKk~3GA}vWK&OJ%2E$*1)7_Sr4+|b0n%Xbt znB1hK{k@DN>iH#s3FJS;gN4*t0!?hB!o{&w=%bqIueyZ0Kw1xjXD*#l#FLSnl9HdB zJNlPj_z|`T(D9QCU}GIDE@HWZaR-qCVs)do1G@u5nJb9*LMa>p7tQwz$qc~9=MA>| zk(Tx*t%4`MZSl52w-OfiL!Q(JR@=-&;?tT zCk?N}2KS%FYv&V!bjTFC=Mz#LJO($#6dBl{k&&k~HBwylEG&Ha2s@$P(eY&KI(@^F zR}jPoMukCyIXY?um$u^?B4W`kFz^)17omh4#bofD8q{1EFSXs&iiZbc7%cgu%i}b# z0Fp=GPiZ=PTXjL7w$HeD-)=zJ|D!}&X%WlH9tQ&USAe1u&{MCp)#KL|RWS(_P5B<3 zKiuC=h&+F2zTj&IdQAd@bt{=*?Hky}$i?!Ui>n3ir(wtYEZAX^lIr-OS$D;@%4B>s z-v96_3H`>dLLe_50WK>Gi=vWr{j?=YZL89c?OqBeuCdH4J*a;`UU+Y zR2$nhdjLSqd->?=r#O$EwHLPqNZI$EL^q&#zI(?bmk+tg?nC@S=xGrUP*%IPR+8B) z(g8Ttps*0BZD#ju)dj0>;7j`m|3W;4a-K~@hD52W%X4K0sTf`N^S_PIlPXl#KBaQ{ z2J>M-IfehR3zl--z$|DRyIRNIiGh)XrRL9U`ocd?SwF=1r|hPJKY9Y;Gn<+ z@%aM5-btrQtd;db9EX*oW_)+&go&>1(b>rTfdL!{@!PkU$*Gb5Y|6#k?`kHz&Km-6 zhn(SoiLvG>O-AIUl1OjMmJ}!;=m~x{N-s$%ODIgDg8^Y9dlgN&=Y|~mjY1IcudUu} z)IRJCJa2-XNp4Bo5N{BfKPc0}rUT4YQrCtbnhU#_ygH}bWy43;cb)0DuXM9XOcQJs zRMhR2te&iCJyU`ljB2i6Jm=!OOd4H8=Hosi9)C(;aDrFt8XGQz? zq&W=sx~0;%z5`lpcD1s;^05(%I%c}+uUzV|z9L0E{@SPYLBon zFfmzK2P4z|*si1P^0)zF)!WY)`?umYJ2CdytG@ICI|scTS_D%5g#e)wm;8 ze^_Gu`0;IKl8K!!0(~}+0G_*rd?v2zobV$Pk^LGF%TH@RWcV9WqV#g)uXsgo@3M?} zT6BehMjV`bfKbw#lpzNf>W&&io@bZ{MIecocsthT31}3Ik8?@OAet7NK@nd^CkIWd z74Ao6WXVv$8l`UWOobCcMMXQms94A3uH?%bI-GF)0Ev%pf%b09Fm1{E#-{5?f*-0U zEgh9>yfWVsDX0#cK>@E;%Lb&%B+|sAxh?eD9)ieh&(z|drR)J?VIiUMac(+$7ulyj z6lsfTCVny1u%rH?w%=X!l^a1J=>#vVc71+C_y~m5@hP%4dY3+qWKUi?(!HTqTv@k^`($v`f zvcam$l}{rM8*z0#M?nNXLkdTWn^j!)j?BV|URc-wrZ;PrB1@8;qazkF&Q*!TOOD<~ zjEjw%+2cHFbX+7I6hw{7p=jd7)X{zm!I@X!89CU9>~FqyCHz;iT>t)dAm9&S&ncS1 z!hjRnNPthwFKB18E0^{5A=^z)(%?N*Z*38aL;sCl3XZ?(vb`*pA{At=MzJ5 z951#Zr4dWmfhxl_K5m7Zn2X=`d`#N~AM$glCv?LZXIUvn&kDizsDrzK`?X=VA7zj6N4 zm*_||!b2*?BP#r=JE2yQdfcQ+A4v9?g_Z+0U5`-v1zB_n?h$;pZ@7onNG2jA)adOk z+}uQgiE*c>gyoiZBHSuYm*(jNl%%@&p^0&6r~ZXBlJkK)s;|*B0w9YbB#Z+Y>%#T> zeiPhPuD5p>A~fL4WU>Z;TckDJ3j!!i`65dkew_)uhFr1YijKCg4avOump8*9-?;{b zXCDDt)k-LD-nK^ZY?znH5D?H^`(Aci+{7)VPaW4UCMcpncZ3>D%1v-54LUT+kMpPE zM>11UcA;D~Ik}OVS|0z05w;F~jijiVRbDzEr)DdbXmssCqtC*wPTtVtKp*)hJ|Bb< zT>v|ev<&~mhcXMqc&K```O;vc1v7bMK=CJ23N(g7$o8GN{ThXui8wiL|2BRLr^-=_ zucrGfvZ28XN$$$7Z|1s!{2o*VINa_6!!9OjS47R%&V~4tAFl7fj@JF6UW~qb!CEW! zB_;3(UU{9nzVnmodxGr?YeVlh3DirsI$s ztK#~Z85r=ozrHju_hve}^4ObyczCqw*Hb$66GlEMkk~Z@DBp|Bpt0d$y$%(AtPe${ z28rf@@_eNwY-(A#QW;+jKXdvE-9+Y>(mh_jRum}OFGK%N4S;Pu_2rZz+sG>{IUbFk z$w6)Bj3a9vpN5zk%Sh#va(T6P^zs^X(Czu;EAdG(;&}cb2dzvDwv$WYchL73RI2qI z4J|igiO7s#%*L`B{4L7CJ{K~Q#rl12YqRw=CEA0RHF9}F2{g7G+)Pw|6Kb809tNph zIe-~qzU_k4YWBo+@_dWAxcX%E-C!%@;`Er;>vNG``lL$)f`&8yJa7Ro8ZY|?7it7Hr<|o1AD{Uc)Y;u z@MF-RZmId9IlXhi^EsyKNsL7JYiHN9E6MD!g3rxY^3uW?2tE@L6O0$0R)91!OQ+-H znI2@*Gh?r-ul*Mb;D5(6IXR_p2SZDT={QTUJeZG^!!Mt@Hl_w?E1Or z?~u}0hxHsVa0Q8EV87NrR+^YSJj7tRU)~7?XAbb8>ZjVq?fG|T4gaFdCBAz|s#axQ zf7Qsn_qpn%A4840UGdt|H21?hLuX@b1R+F3Z zxeCvxE(!4QImhtxiwhO9zRCxzuuhK*Q_orNE*3c@2O$b;N>Dv5!($JtoY(@%7EREXjy3cmorY(OG_>a0~ zWwsU;I`kN`=;+H&QL#nCK3FV93-(6B^E>yOF(nSxzY!b;oN?v+(Cpm-z141>a}Vpt zFG5MiEbN@b(G3GetS5vn;?dD!rD;;A^x;{IG&O=O9IGYW+Fi~4=3vNtkNy4s#(g;0 zUS9QX1a{F{9An+}+fWFuOifJ%EdTDRmX_ALckiIAbhJHtzvdK=mX$TEPV+mr%Yi%I zHQ0Ziezto4z2@?K6HL*ddD|V!4e9}`Bv;Cw_~Fty@3c~Y)`ip7pSo_|%d_7Zvb=U$ z9vN*kglT7!M(kHy!*jdiH`Z@>GUa?WkS2w6v$y04UN~}I*w(!`Iciiw+Xr4-y&tf6i-|E3aUZl<{IelogbqQga zWIJgj)&<_`_p~$v8=GBU9GZ^2nv0XwgaqiV*czj3eScwtOQ*ayRC6)Vw*5z^a<_}~ z`t|D|m=eQpFT2(9Byf0SWcqKXea)l0$)E7mt5@OlYSdV$)h8=im6et4;b3tL;vMRF z7G`FGrQ42NBqVVkKi&uv)w{4~U|_g;(+5~%Ir7lt04RdYRP2EIkn#-%z@>ylkb&6{qO>>=-XuLc8yypq zeWFCSH3YO#oE#m$e*3mDTAY=UaZ9bcrA4vWI4n9^#l__mPs0^_kT3T7C3#QR3X!eZ zKwe^Q=e@#i9_H?@uC5JlJoQgszOXz%hsQKp?Zz42e!f=N{Q$iQ9-fZ2HbBisE-o%W zxnzHJ2?w5Not6Fhiu zG)r>XqRGf+G0A1KAVwS*9v4^Rc6!j;D_!(cv;7+#ycOsiS8P_FI<5ZgZ=N2nP1TV2 zpRd@KPgFQqjFp%z_ocvDnha)J+1vBjuMLN5xF2_MZvMT^FJ8R3JZk2Rb)5P9_vWV_ zx}PkksnWB9{tr3%f;!#+_W7hVf{wt0IJr38^hjXZDjK^^03YKLA4CQYna7~-lX(9J z>U+g<+hzE^BiuJzsc<3g@+=MVCc70mQ`0s0yyb<38wj(0$I%}zOxhDZ8ZQr5@wY%h!>q7P6WNl#qT=YqsZtlg^)l=p{CMZ@M?1JtUJRfO( z{(73c$^v*YdhOqiPfozV&-G~9=kFO98BxV`gXy~)n46cFPqZ!W3JaM_AgVR)=kKoG zRQEWy^Q!Z_P^xrDeRxg^H&XQVYe)Fg4ZhwDI<6~!0Xq|ta@6|}8Y3ek@$vDMl$5Bb zsNn3I14%Ss3@(41x&#k-$=I_7k_!ZsbJsatkGAeha&0#eS_lXUg^(QsFZ2#N`uFEn zq-12enwqd3a%m1AVyHfv2_WK}+fn)Uso$_DC@9G5Cg#R?*?nYZX9sdanT+v#o#xvN zl|LLdCy6-ik(WkB%W(POp`lk1h(>hO)S?m+^mKHBpZ|vH35O|G$paYsLRn4#633%g zJ&K+>BWGa1L{?T;dEwDQNP+l5r&98e*ZpijLF2mT6JWIRxc-D?!XR58AVq5iJ23KK zWe8Vy&dA6BY>iCD@0FF6!NI|_IQOVJOhFvn%u#7?Z-?aucEF$S zQ$VZM+Ir`BchQJt^y2)~j$>le{jefOr4$~bA86CijqzQc%+1ZMO;nT?7TP#E7I6NN zz$ZBR%T+0}Sxm*ck(58BF@tURFV5>Q5~d#v6PQk|i@TuZ<*+`gN8D^(rdpKtY1vma zg&!|EDhgJiBCUpx$;rvZCPO8~#bzS~dX|Qu!}jMWXz&4z2EM?5Wt4Sd z54Tv^EpM^pZ+qlWP*}LR0h1Sm{OvemmgAdw&zB`3eIXOE)if3qY=qU(kt>$ps=bUl zkoV#ztOWcCjOQvgb1ip^rW>m$SH9}}(JDon7|(w7x&{u=Yr*PRr*5+7RoTG;g&AX&lel^lCI*H zRaD^N;Xxp4hl$(R*cixt@W7iN-=@3VZk1lG{O`>@oOEH}zUY2*gF zYrGJ`V1knJ^464;;ED$cm4Zns{2(%f@i*?YL-r@u%K#W0={=KYZGF5Q{9bj?2KR{l@B@e8kkV+gsd8dRoBJ&p*G#(yk`71Zdm zC~K_K@b&)N#*0;cK^GOt!EQFl)gK5=Dc+5fg_2EcYg}3nLp3cv37{fLDn9UI`)_k{ zNKy=vgYTu9kzPsnk*}&$&)s%Dg&n4LtJLcj1dxmcy1Qzspqx$(Lh)8rwbFXN4HCwF zBdkv{8CmlHaTf7DoTk>%;m_)z_1Aq%nFuD@ut-#N}>YWQ+d>F9qU3ep-*iJ~e3Y@Oh z&1cPp`SX@PG3vXLlFwi-z-Zic+CI_x^9$ zR9mupt*fvwLXcRWs+lrmkylW-T$c3UXE2+pK6j`&oq*(~5Hc=Io+C{N>PxZfW2KVr zrPL`h$B<(ElM#8GF?rQ3t**N44=6~B{e7z{_*jp#S(01thl@?{L_+uzw$d`5|ASH` z_n%q0YsJtvu=@LubR_OtXsdF8X;@mgq>@o^QWD@MCX099AgF<#pvyaL=`@r{H)k98X=wZ!e}qW)VG% zxj0>4>~fv<^%)HNh7E_Z7#leo6(i;E-quL|1oXYbV6x-&p*RBckN>ykErKLSVTUvJ z53z$IVN+8%)D)b=j)_W})w*47OD{Uu{-9@%VeY=V+s{~{gSpAond zbe$N`p#>lwS8R^lsI0WSs*)8{e}1GNeTbCkaxGJ}Kd_aTm5qV^Xq26bL=2azhJ%^X z0s%pc{n^q*aBu=#!NhpglC86X!6`s-pg9T#kN22N4qWfGv^LpN~Q%MJ!PHf-}%?y_kMk zW9wRA%b^3&Y)`})E@o>RBOI;gFUOt8jr973~iDk{xsa!u{y+{cj)<+z#*J zG^8LzX9>X?D+K5V&Y() z=;_AthOO`+uaqJ!Zggk0Mp;s4dK1I8-m}Pqg9F$Hc6?_lY8iB$&$$)Xtw4#ru%G*38W^Jp0m>t4axJ5Um0oE+MM7-c6W3dJhWK4`1 z3~&|#v)yl?cy&(Q=Ibxi07W9JpIm!HzuU*UyLl;}aa3pIOVE=gE5OS&A|L39t(w=w2kcf=WH){3-EQ8Q~sPh*3|{Q zrdmT5DCYb>^eJ(XUlbi3s`-O;y=4W7;LP=@RXg(I2!`|d0$um>7rT-%&mlrCLUFAh z|N1eWHN7r)hIMx;UPH_`)Z0mv4H%c8at;ozZFoN^v7f!G)dN7P&Cg1j@Lg~EnZ|Zv zwk(m}2ozU8y4Vml_Q&A$k~J||$3)AeoYs$VXHP{8%18$XwqPf7e0-D6!!V}Tke0dw z#Z#|+2*A>yS6fod)-9qjx9H(^NTf0KvifBNU>1@~E3&dW<*MKua?OdokMVi~W7T;8 zkE$nl%hw$Ru2!rknDYEwhJ^>peWQTH?Hk{ER8%i8F{vF_mx=?0M=LKHf1xMAubc8B zfMzuL$?N2DI-^Qg2S8n&CZK?TbdK?7>;;}Jhi8wAaM7sCZ!JPmI z58$o@<}p=nXW+e*i@kXJgEkT*>H_?yDP&N-6*>(Fm=~hdPEID&NM1qyX|miF?_`aO zFk>1i2uTc{P5=|xHs27M#$yC|DH6>Ji299-X_G2-Fb^YocrV!IadgA{X906aVnC&} zp@Chvn^rzN&*PB@!Ofee5S_BJ+AO}xqa%Ub+gxal^z$*V8b$$*Z*8;t$I?-BKAl;k zMYrJfJsE>e*%rMq-qV*^1MyZ8vRiBxd<#qIGpBjHg1s>UeX@!{VCk+zTOyiKl%Idq zGa26qw8om%rdo8L05lsKxKMHhVnMpxO4-^hU=)P;wHEMrlV;Td2#RrbmFJfik>QqI<=T`uX9ITuJ4Ee+9foPBsA|x~x zw+I(?hF%nwQSoR(9Uo0=qT>w=jU*c$Q`2?80`&~qi;>IbNMH4|mXlVOe~3eL*?I$JqhBjjk486U7Evy?a038!BEp2*FK-2?j>PQfq z%Vfvb7a)WlU(;RJtCTem@a4E=Kd#H5s~WYaaut zR46TtjE=Cg4FZZIP12)Aj-2o@Dz#4o5di_1$Aa19TKr~@cJ~Q|0rf2ZdAZ-&O8fy@ zd1HZ_%<`PP|AA!qv#wv!#NJEXuj1jkprqCT-*+j+ARPjEe&OfJk1Opwo?yqt8!nzm zB_!W$WCZ9hs8LOO(S`fSf5o@rG}6x zkFt|i%zv`H;kEo{34E==%(oi&B0shw0DS3LtI1$71+iqd`QYZYkGZPF($vdZj1lNJ zWZk(J_7eM-Lnh4u3=Sd{IpVNNi5W$eqMSUz(8Ou0&3LT|o{1&#>xT;yXmUg>8N*%to3z4t9 zrkv-=_+{(6>}GMDX2RVy4&`5h7J9|~esc^UW4l@!?W0!vlOG5MJ4-mRNdtWw0zhh^6 zA9PN=yzb8n0!wCaMCpga;T>=OSS}m3wyfL|-&Wo0-X97_9tO9tl0L)rPrKz!`n55l z0Q#>M?rZGQ(%VbTt0^G|2((#bU<3W|Ucd}KvbBq;S~T~Vz~4M-kW;$gfA?}fUAQlU z74=I{Z+`u&zL5rr|M3V9x*S~xI|s}J7|%u+m1jAm?fx%4UE$lFy}E0JvmL1ZLRTLN z<5&|CR(x@KgZlnu3aF0#U;4PI>wYRK(YbFGpjTS-3}5_GK7jfI{Y+$r4a&>Dv7`ZG zvJhfS$xX0ZVQ5$N9}OV$2LPD1fZ)RuMkMjR|zSX*Yo>=QQx=e7b=-bI0}3z4ZQpt zcEbi?G5ayW_ z=@|sJitMZdIC%4&kd&+vg3F$Qip@YnKLt3CGbn0n+$(7pC`*9MgZvQaP%rQ#B(a@ab)URd zXn)m^7<;zg4ihicaq|D%Z~asf&BmRlo|l(R3C`;KI|n&=6@wJ(;!#XAT+i%v9b4oc zkE8{pCa3ORuU}aByNv?!GEkEu+NUk?=+*hKLYtIR^N?q~D+| zIfCJ8);R$Edt>c30E%X1aiV>0rdVCYd(N(7)mhy3rfl(-_Tm4*+gC?L{eJ6$g^Ge8 zg0zl=A|)Ul#t_ooB_LhW9V$`+B1*@XE-C2-k!C=0XauCYhK9S*-?{6Yd+$0o&RTaC zf3SvO<}>f-jlG}!JkN#&2eVLy+B;W7pMHuGhX6KliSULeU zPtSx2L;7!fz`fqp+ce&?9Na&RSZ_nf4AZpQdiC=@7FmQ5^i1#Raek%%%vhz;+>xr@ zD#&Zh%pOLx!)YL+1Plex=t!qm#vq+IOF&-WR?q6&4nbquLb38sV-Bjd(?Z9I*K#`h zCwmjUIB8htpRWlo+&`CeCkc^35F~O_frGAF3SAVlhN7$Fa@;+cvb40+^IxboPV#TM z?dpH=Vkj0OX&di3x#8{i-kG&Rf`HW|oeTK5?jpF^Y|WiuJ3hy*zb%mNMx$=AtE-n^ zNJ6^pF3B($(pO)gg0^iC7}4`r9LXu5B5a@AO2v}~`5_|IX=br`d8ILC{HW4?tn$g7 z-?$gX$buSY2N&xr2lxb23?YMdu@^w|)`k0x3RHnt^wF{7xGcV1sWX3kwb<7Mc?~q@ z#1YN{XDzOZC|^pKq>$6Ko*cG{kf-Ocu&~Nno9_fwlK%SO9LQho1{+KQi?OBU9_`xK z6{}*-Y|oo%bo7!^tB%fET00>^ZhR?JI2}F*JNE8|g{>Ib8I7s;!bdqb@n!1 z6A`Z?pexM4W6pu=X@=?Fk`;y?Z4%Vq|GD52nN!6Yu+Dt;vN{XSRcY@_XTM^3ZCts+ z`sX*S54d7pf35~gSM$laYk!}dK1Zng_qW?5AF%#57Pc~hosr&mIEAt)f zf4${v?Ema7WnJRnKki_?Kt5H(nm*@PbpE!KCNm2+O;JgjeEJgUimIO%tC^2NR>}a*izIjJ{+#HU|8vcj17*@)MxEmL*P>-z zW_pZqo*{osZ;&vnH%)@~{VFt)%|LDH~VuG zlY%l$KC82ll;y|bTz^0;PiN}p%h48=Izv~JLzd@@1Z4- zj!`7nv^vV=aF0d%+tkl`0j@AC{LM}X_*g2osG>TAGtIkDtqd(fqDYekIK@AiXIr>! zdD;mKM`bP~PRg-GNhrMp8f_VcaHi4YxGkK%*Z#o#*Rewz`xHBL2?f5#g z=k|Y%iJ>PbzGipxk`=4t`>r{bO4l!5EZq5?rD@q_4#RGEzR!^XvrX)3&0PkRwX)Xn zesH1o0_q6mC$fH73NMf)QO?kyRV5<8uYVwGez$<=^1F>IFVxaQf<|xn%`dSC4Ps_| zktxPxvl`QL)QWBezeZLPpmjxaqs&eJACl$SG0i`IUZx5WsxtgD^)3Bh^PcaRu~}=; zR8~?_R#I#F+%jVs81eN!OYQRXG>g48uZxqFn#mRR94>kb@4(TViY$IE`t0)ZmzE-Q zfsMRw>!P#ITwS}}@xSuyZ%uA)wyQW2kqEi>{N5Xzuv(foc3n@TA0Af6oNfycKq>b! z9v-Sy@Ugvmfa2ob^r}_l6)q6TK$F;{J*k72tn*M+DGXft*fc-8`U3eZaV&w#vs0IK zd8k+`(>x*c6Xzq2XS2)S^$Mu8w~89|_LswQfN!2z$o7Nq0RfY0S)Vx@O_xv!i!kAm&JLg14WN;#LrVJoGUMPjsDP7Rkgg#PG6?E`dzpk zvV53Q`p?IJqX zFTbI#+-ykJpK?1scW`iE^G)W&Mv#x2#;%Ui)UH#Cc`?B%y}HpZ4bS zdm8EoM$0fwvZQHy(H~bkir?QLBaY&BPb(~}lE}&W$_N6B+8ruFInY}cC!38jD=&WC zj%?k?VM5v4_rH88$5(R)6_faH*>pjni@BvL(2s&57Kyk*5ZEwDSn!PQeS56d;*!~=>n~oE`dnF&imFZ)?(Q2@9YLcH^H|+@d50tUd&7qe2>lzMlidr$ zI@~*O%v4%kjekkdjqJ=-yQdG z`=I9hp@R+sGb?Ej(k=+5%@3MzDys305C;qbu{du`3lzI2h;LHs{QOnP`g$;5I3M?G z;A)MH=EcW3*lyiP3ZGyeB))uMLm}*&G<7NIg6R*d$?HR?gv?sdO;s9?Bl3{@s3hJLw~T3ua% z&1Yl3rRY#Z9wee-$Yd$O9=2BAq6JeGXRZ2`tL~?`xa#EO-o~UOkD$S!K&0M_=G2nA zLER`+gE7bI;7JtJT%PD&W>0#f)0wFh*ZoK#fcZ!-t`;B)tBgE28M3k%PtioQJgu?& zZci2Tk8{^*Hn+E(*C*+#s@x^=h}bv!(EXnyz6?4v&*4s`(?M&|>o@Xdsok%Jwa19Ud%ENNIm!P17FWMVY!irlyWR7QxZ~INAb;j~p zVq9*zDB^XQG93GLtuLT&RsP{&o`R8)WK6s%Ta*D?M8ECz~QSM=4hXpQ#gg>*yFR!xf{#tOml}7i3o*q zIpW(m^nzYvE^e#f_oy3D(orE7di)~Od}1FpCy&!iAMa9-nK@ozco^LA3gloqZU@Xa zW5oNNVZ*Yr5{k>6gNQ(qvas>%+EO89vijJIKat8k^CP-C@mI}OX;;ViuU~RkdQ~1c z+F!vAk!M1q9#d&l%#=0v55(K2)a(zW)0YSWQ=uiI(DJaLE(?s=+qe3yskj4C0(1pH zn|f8q6A`d=NJ-KmS)=97Ok`^Tnw;xoF{tp$iv9t`9n7Ku8_7s@T1UyChwED{tuZym z@D+0!g`BjCH-5{@D^X$IQ94R0Uv%8Vdp_@(j78`6JgjXEfTiw!d=9g6yn4{Ey}4b0 zp}lc6Y7d~&h*B$8*X+lNg+o6KZCA^8@1A~GFddI^NPsEUnoH3+|`ubW^+fiq0vMZk7eRIBe_1e9;S4QtyiV>2aH#&8cGP(~N;Ok812=#mkW z6wJ3O-HGu@9FNNOg^E_i@7%*OP0Muo2RAPJWmM;U;gRTQ6xLQgSmSYn8=7qup}A^m z#Zn<})2&w^Mk7D+K?@Q3-bXa9OTetsFS=2$RckCNb^3#)RD{Jv#A5&Tqg#Y$_pXkK zL;9vJ7gtxngyoRE{g$zXoGPQ?5}6`#AZlg-!%Jm0o%8grkdf)CqFm0BmayXrTV$8L38EWw|VrE*MMlwP_f<)r)UD} zBfW)hhdI*~6>1|l^Fg%1%g1-^QZ<-{)zo5yk+Au&2)cJQqgm_+s(zE&G84@{($aA^ ziX`f5XaHL4aITVIg6pi?Dk4K>k)m9K*j!B;^B!?un-yAfX4F8FHpKm1u| z0M|=-?HmX~%6!~iUoQuhp)2RZ;-Frs!8rS^M*{W-S0|^;{z^dKWKA zwFtUGyTJ$0A8k+1`!W7<^SCw=36?LtVMfkiaaUT(7FU5+)D`CUL+?tVz+ioSW_3<# zu~L19Pm^SDUUrUr=KFk+zOmzphq+^;0yhYn*K zbf*56lU&(EcLpm!mSh}DR|hAtUP0eM^2#MGE-w7!?thkz>61odp*EQ0jJs-3$iu7E z1wJ9HJ3JK9-99>LGBPtZcsFx=! zJV-@l^`3z&u~}Hx&{%5`oCGesXpjDa((LBZk5IXCk_*_t%80-Jax@W z;!=rJJpW!ph|@@P7>fqBxA4Uw@T25*bEbg6 zFf15MrSJ0!b`|`)yP5+au%&X{yg2)V%?t%{o5%fMu)XUOUxr2m;KJ;`RHcQq)16oy zgsx8rIsNC=aA27QzA<^JXPi=4IBL#0B%-0C0(#S-k!BVc;K}DgFdfV)`l7Q1|DquG zf@Ws;iqhNhK6U@(BSeie`1i`E(RYpSd3x&43gyY%xv_cijb)JGZJBG(RrFb+ETA0P zztr!2KL)XJV5Gxbqnhv7h3D!jS6kh7Od}~3&%txju*)@UX=J~< zu3mfq_7Tp{k4L^#pka50^L6Km`G_tfabPFir2=Hu%E0!B03Qt_@rX7}&oBiFIQ%~d zGrNuZv>fx%-wkakDC2$rXI<-I&LUq!5ARsKnWoxwOCK!WSU7_qt==CUV z@9utK#ky@=35qIZ!97(e`$hmAD7W)Pa3bg_v%T*y&9;V-Dix+_o5rx6-L=-Q()VJL1X*#%h#lN=hHP$ZN`P zejOhdOq3l=UOCwx^seWE&fZv9tN~3X=SFiDAaif-4xVaSG|je9VVU5Bbqlr_58Lvt zWoVNItaiZ`6C~Q6>LrqEA&|_~~`jw^!{A4Go;;gJ3OSsj3Dl1)uK(0W{7{ zv83$13~hPKN0_aY-$M^FZL=BLYsO9%WJlD>jLVfrjv)y^=V7KKJm;*-hy$TAs~oPw zlYfc>ogQya{)HV!#r2u74P*IF-nJT$t=xbAfRT~o!GkCiRp0UfFrE2&Hum-oKv#e2 zrMrZ_`ur9JVb-D|URqj~g4#zW^#%rf!(k1d8ds6uw@an|N$ zW@u?>zG_t}Gdt2IL8#n^#^g2GLL)RYc*00BG+TI()mv*1(mahGQ)2pk$JRrJ!!Iqu)qVK!Kor9yQ<=Ew3Br!rD zCJuh!Pqt}|p#?FF1n!%Y#9^&YIjbCG_R^Tl#jH(VbS`ex4P`aCMTBFFXER~>Xk23w zvG7*?d7+}x;vdp4VhM#-rr_-QA!TM|B>;A{(yy9xoOb^VAy%%*hgIzON9?w<%Z&tb zSHM!r0YgqqjM;3@jBLbobZTiO z!a=M7B>Yj=HFsoRcXueTKD)c0BAuO`fgTQ8a|lP>uHxdBnh)6=?G^O(^)&{P+zfrz z9UBt^L{fJ*x3AdT++vV_u(8c*RVY%BkVJ%YM)+PLquGVnObH1fWJ8I)Fw4jrJMGPljuub+8SJO7 zaSP@R#Ey9?Dr$1-YH}{eCI)!EOY`$YR6PEE>O?3c%@(@b16hL0Td7I-d1A{}^+TTN?PB*BWR5!3u^P^){c6M)lH;=)yqIAb6T2ezy z<`ZZ%7Xw3E2{LE3t&JB|)!7m$iX`W(ayU71Moih1OC}DPdrbPw0ka&$A`#)?CC*!P zX(z2=^jucszo(}uiHSQ63xN|0kFl|_>gsBt!;b- zXNFLZc{bEQIR=stVMH6R{nz` zAL5xH|IWDv)=M{a1LcRrk(4V}z3VzhxaJ4w>VV}94AfGl%#4hDx;m&_Ar&<>JC0gX zqH}Y>_DqU5E;y6o_U-#&t&vx+3bPZKaF9`jG#eJ8X1%-IT!1v*+sh8XV{~*htTk1} za*vNF6iOsnF1`2BoIb>lYl9mrJ*kezTM2m&i2|53IAQHy_h_*%R=RadrA=HS@`5UZ zJ#a^I0t^w0EB%>D3_y-RFt9w#%qSzgMcFQiw>EO|f^WSFt$2Ehsvgd>lk z|3GIaE-_Ee=456~m^$nKS8C(E6Qg&Y50y#71!O!h68b`_alO zO5rk6k}tb!*~cv{N=N&dIGGDn(knG>Hs0fNwF$Z+3~e+4=qi5vg;xtdu#xZ#kEv&i z!nGYH{`0l#R=8#fb^ZGu@w1KV&QEXoXqnE;Ox=~VAFonKm%ez>z0iE<+gySt^sub~ zWe~E+c1~JI=yZGA&hW~1I8#jCM9X-!kdLpZfgv+gck-$>&(tQRz~Y8eOGfB;d9>Vi zfU*k42Z#zSRUQkeLN^I)?{D|3G7fzAiNfd4|Kz8xt`5?xw=op6-tLv*qxL$B%hwPR z02Ivu7H{~rcXqsfdc&WQi7B9J%P423P?|DM0F=|)lAJMG%IbO?<9DzjePfBxycXiO zf!W}TupMq~b>6ur!|-Lr!h)%TVCY|Wn7X~4%Y|n6F`0|6JD6+D;Jy=iJFZ(cj$8tF zrgBiRWGbr56d(|xVn60^d2x2RN3&mZQ}`p3AT6f+B1s2X{>sWqgJmLhfvO(syhU@1 zVPPX-CU{sZxL7K&)M98u9n3f)Pkg$+&s_0U6#CiaJ#^#s^SgKNl5=@-q%Kp41=Fme<|0PpGRrSUWYVbBefS8OTG==(9JC^S5-3lO^el`%N$3PBv;rm zTVScx>}EFL4hLT#nquCOy6B9m;n2F*&G`35{tD`z`&U^MYgGOJO9Ayi1ZZV{BFYas zAX(8XD1&bC`T0Lf_}SQOrhfSI##x@89N+7{w^dP4u+ftWX5F&`4ln@IQJ@3xJl*x| zieeW9=bpg={pqG4!$M~#DHNzYSB8rvBACajU3XpAs-dM$q6X!%)4Q{huLw#(Mqp-c z4qEWo&&4?oho7ls2nYy(lGPyLWds|C=gCp+$xa@eFDkq9)6>u<9S)F$F0L4q=i$hN z!^*I|?KF(sUOx!^s0j!PtS6tTsGva`#0^Ik7gvPeo40R4Md zJKmA@6aTnZEvmgeFeD@-Fi=89 zM#y%y!}A#Jxxc@Ey^;kkR)aTAnvuA&q5>3UFWWvpfS?2#1Dz?TK%oc$p-$Cyk3@$} z3S7bIoaf0LM07{T$2sVe8PHmQcvRbMqp`skpO2e+^u6)DKaaq`Kpf9j(0bX}+SY;+ zIP`l(BYnze#J1$NWGfB^ICvDeLKVzp7wc7b-0kch~DNk&2f z?#~~Ur{lP@QBTSXZraAihDM3`5au!5VsyOAVkW3xADayfYFFAV^qlE!>B1g) zas}O|I~4FZaxybp`p7&A1HZrd&GxEI zl-m9G%8C@S7YLgmV1~OVc(SLD=eyM{O6~08LVW9%y@LZ`ca8fYvu2s~@i=&95DnKVEjRPwUn z(%X9LhPHFwPwo>1%hI&6&q7qIEa&lRt~7z3w(HCxOGyp0f|2nZ?u4o=Ab|-Xl()5S zLk*&+9Jjq)9LjL`c|I>AW8zKNVi+EZTWN$~vGP;k8NrqTLVa-wiIGw(9UGf(fr0Iy zVT@qXFw9w}KHZ?k!KZ@xOyWNek>^OEQCIY1Gi_-17a4gwuyM1?^Q162dAiQ~{3I~5 zDJdcB(t%e)7+wp~M{N8u5X_26OB)srf!Y#Z=qO)2wXMDVUJ|H=Kz{hoKmU07k&%(X zs8p}7TN_TF^`Zd9rxHW|;aaWd=I>UM-ZYDm_iN0M-D2fcV<1vHn~@9;AA)C!Z$r7= zg1nRz3bcJ7+$CXBSJc+lR#4cg$DxJ;k)4SN73~Q~b)ISgf|eH2y*Y>n?orbB=4EFu ztrP0bt|`n~wN6A7L}H0bMGvUzK=I}&((R~fk5c~4p8~;QC00kQ?v9V4DZES3yJ1Z>XUHF2=-AN@SB`{*l zIyJHT7Gh#hE6%6t><0C>tn3XKE2J+zwa4#J(HfXoAhrd8D9moXkMtHbU@9qWlyB>0H8q!KXaBWuFLPQ97lFhXF1&Ea?RQJ) zc^o_d-(Z%mKwtqPlnKw%YEa67dYRL5w9Mo90PYBVg4?I^e7J$Ije-`{+}K$6q=!@v zws+7kCkVK55?nXIXPwT@t7$`_#$XM%Ai3T^Sh_qv-(hGQ378E8P9qdg#Kqg%zC08V zsD^JpkYfdtzfkq-t%u5ts@A?w?zBLh0IEqlUM(@PmOz#or_JA)aAP-|s_+G!guwIw zlxuJX*_1ydfSefE#^XgM3a?*3>P@Sx^p#G3c>n%jm2;SKwvCBc2H)=o%>hzoO%Zg~a;SKDXL@5LE(W=YSCQ#&$5lN+U^_`Dar z;`6LL`*659o;FEFa8!?t6lYoDeo>5ok%#Wj3*NGW!%2fDJIx}=ldHF~Uv)AgiP#@7 z1HmarX`>-`h1sTb-;pu29SUovavaqB>(5;^a0#TOVhIEutZHI1-~AxP!wUv9+o|CG z1e)cJ{z;tAe)-*--yvTLU?DzZ89%ub8xu-O!QXAb_T@8C95?i9Wg8wE0!GpIhTh6M zr=v^<+yF7@a>nc~4;4DBsF!OB>NkCWNjNfFfC%;DQTU+_ROiU=ZEbB3I8K0!)!*MA zwk{bku!9BnrH$O}rHZUy!mR;fGENFlk+}YL!Yi^|4m8&o`@+Di8 zd2)4XG7grP&}T@XDpxDo;iv!zD5&#lv`{!bB22{N!#O!Ntkr*wpC4CUCYtU4AwHUSt~0ZDRy;+zv~V{+ zKOZ*d#-X8Cuv4X`reb4zcRaAjRuSq0*{Qtzr_j)iLH!VRo|L@2iBGf=u#pMy^RHI# z3eK9vjE;^52jk6t?j9Z0G?c0h36XjEauT-GU}~Z8=;#Wk4LyYX{b*ZTTVX^2gaePU zaBwp7@^nO+sw5%;rl+QQdS(ejW$%L>Ky{&d|UQNxon(eHph!g^0WmQZ1z~uT)@uBCil7hkmqG19#v+SgANqq)vyE}`p z1wVW!p2r?U!AJYZrRTFPPkIQ&@JMejs>2)IuiTIBzYz*ZmYUqKtd0ayKJ$60i0#x~ zy#jqOP{&YGT?Xnm{Arn)b8Xq#ZlQuASZ)ms4c#P2ptpYgI_|MiO}9anY-IDKwZHKR zr33;&e~W}fS?LQ9ALHX=#gXiWX^`6#m6pDjyzFRQm6Je$RrUf7zVm^NXO1l^%gYb} z;Ed>i8h^-~v-!slRw0Pnmz=+V{0$Lm+?yr^F~%Bne1#}&t}6j@`##fR@v{^TPQP$T zI@kF`-$)-L5Qag3;k=lc4h|Ta>H*gQwgg^ETxaw#+qR2)?e$N`-*n!KB$Hykpex>e{_~ieBq$M0V6Qpa41|9oWtacn z&=8sa4suh$1oTiQzx#n=t&jv)pR5i!+{)7k3KbQ61h_2{goZ^&FV;@%e~~rbUB>nF z5B7gpqgrS1L6a&kN9lED*~jvdZSmI&U#8|GA82VUPK#Qtb4cTe(j$m{8!~elSSr?W z6(Ymj#hD!ggQMg%G+vDfYbvP?phuQgCmZK*Iii`l9PvjSf~igxp1strZDNTaS{W;R z>x`Pig_82(k}2+{ts2t%=}jn*gFuVyHaFO7xb5uYAVTLCj86DdDlcFqXG5w09eg1H zU}9t}61*4M-P^kbW+?*T2?2d1ii)=5T~{~O*Y^@m_o)#stL1ayjB1-b5-eZ7e31f| zfuYLwjt#=@B;i2t9MDoxamom`c09yc%P>kp4Y%^nN~n6z$jQ>+#bjN&~97n%zD+I=G_ zVPT)g*oGzcY9v^!nQ7VCW^gnX9^@t^Ay`>uA?UnC6ks^(`WNNND`s9DGD?6m1N3rc zrlt@y>J|Jxc*@De1q_)u>E_sw{_*h|{pM1Mi1D2+&zfA>`w$Fw#G={6{_h~3V_C;`OkycJ-mGeMB7l5U0q#;Sa~Z`Aw9AK(-L~Gi+`)5BZ~cWJ6%XC zy%z#e@Pb&`Xr?|LnK;4h)}9`JQPJkHoBt@1ybta!bkaXwY(fI$$pOgw>PmkUiq3F+ z!ho$n6?hpIg}aM}GrxcLp@pn8^eXc{INOLkdGh2%Yi&rpa;72_A~c!N#vCp#F6xYD zjuCM;Wg{Qs4m{7NA$(!F_!W#o=;NI<>B8KPq2F2HOvaAKP?A?O~5 z#Cm094(`nGFk}+oSYw-3HPP^HgF^R=!kzah0xO$$1Te_J(d3-sR@9hA&LZpW?b3X} z#GK={xkOg?p<@Dt}N^B z7+1!`kU_k2{w*D_5`nma7cAWzyqukv2T)T&T*(v0@Eh0nH7;S@p6)Q*@;W`g28-In zgf!pnwic@>K9t+)sCxieL>bz?*w|lhaZ2v~Ig*{7b$c^(lTgYhk^K?b@%6J!E(|vGDkQ;lP1fdT?iap{}J1T?~r(A=4u=9BD5gg!az8 z`lf0g)~c$crmT%wVyuux+hRJp!szHnL!DI=6rS5F?U%>)Ld%hCYG?UOb1O5mmz^l8 zPt~pt2Fx|C1F`!ZM(_PGQ$9yPa0B+DqN1i;w&>Ba6D({1V%%Rk?~8;WD@C3|&&N)^ z0w;cNZBK=uYvd8_U)pEHQ+pgRPiP1?_TO|)3gSgHOhUjG7}|5Z`OF?{~xy3f0J z=A%d5AIWyNUQ;1+9zpF2LffD}B~I4dTf|D&4u>Cco$mk|Nb;9swiwjc5T7C_uc@!B zcPX&}YPZk7L@qdFlabp=2)7@Nl8Oamg?j3^{+xx1sG3MhD1Pvc5YArs8e{$!jXn9; zG-~@V=>wL?f2e-`tvvqM1P}iKulwIPG#ju5Ya^e-$+)?`o`0PjR9x@Lm4Pz*EYTV{{h~{igVrPZ zS@-sWsD@ul_X|#|dO~KHHP*F9N7e5=Y3snTbar!(pK9&5f5VCz;H4goGkEK#t=PC{ zz^v{Ea@*7Q*?HL+dD*(!hX+2~t(u-XLo5V7K0b7`wCshMT-&3zUBPzzz;6Tu1jwpj z-J8B-VrlBM<*5@F&u<2#Sc~EytCNt@kcl=NYVw7@^Bha05x$6pv(r9WQL6?OmzI+9 zRkIwN=p+(l&7trLjwpeR>IHg@Z!S85wH^@hASV({?}gb|1;_=&i_x4GWFgImzuxX{ zZEg}05}vu(L{t)j_tTmx<1FOW5K^;SR8+b`g9tzwQ88Q~XWriaFw-7E5GswXv>fY| zT*Dgr@SZipcP z75<+RBZ&woltRoVudcp0Ir$n8L;^WcQBg}vW?N2k08A_`bJcU`5MVo{sV_zQ=QzTxVq5qznwo&@#_JV@Q^o@achd39Ob`D^#wpDoR`D7h6#(%cn;Jhw) z6paO}14qXM+>1t*&h7uJGUU+`?@PLVJ9~QzQ`4RWJIR^4x+hVRO^UMjqy3?m1P~G- zp5lzbS>FDC2vK7rBDh*M*x2hF^PFVqY{SJUQ{;VfnRo8w{UNwu?cF0yzLG!M4_ybc z6)8)rW?*t39L!lrM0SLC4-LIQVq;^|($Wq*`yxKGv;-(+kVtZRI%qba&yZvm|D8ae zNQ(GnuE&&r^DDL?w2qa2f$Hw zOw9f^fWpMwLOOb7yjp^W(4<%Zkg>MbRy;gB?b?$la3TduGGJ*`YkS5q|Bn$)GJ1)J zBDk{h5R(6#{xq3{PLLYPKk#jMAtgnd1Q{DPxt)W9cE0XY0P*GIcrA>qb59 z!r5H|=OvP>XCD469w$#F&y8j--%0vm^5C4eY=5S?aRx1-Sp5}e%=3mM5cR3&qc6i-ckg6KKaV?rZN3#bBwK_-GMO6hW_85y6!#{CLkRA*Vks@z5rS8+2h~qCv~rIU>(ItzoVZ7CMe~j&%j)i(`itlg#dcy2`eA1=n++Tdf`@}Q)3uAvu&V|9^hyA{yk$fg+O~u2H`3Q!#_GM6UQMZYHCUYG{dcHKWtnu;lQ>K%OdvtfOw>42M)x-TX)JAwID<$(m z;$6MOJ5N?OyYJ!O=$=ln;EI%dardcA8VWe-zRckr*RBtRyPr6{$nnuoVsINn>9bADwW(g`=d3CMHqoB1cF3LG{*VpN%&bAhOm9>5KEJ54*Y~VyG!!Tj`Ce7};7Gt-Xw2^;F}Z5M~_r zoRn9ymGBz%@tYME<&R~{kw9zo4Dz!u9Bm9eK+^oSIgWiLF-@msV!2^wS7oKnPhf9n zX8X|W^Oykgvx-8DhFWsZf?o^3X!#``TcHUdS`2ZwI43&?ZzD{VGvS3l&Uxn*h5<0k z$0uYoRF&a3^**f(tG1jVv4d^FsK+RVDVz(Rici+=g&sY{VwozVawH6}iCs0a$kK9g z)Gt5jK*U04Vz}@35J4i6XmX~2!DKPDDGmPV;a9VdmoFd{#|A<*)bu%`Di05A9-6@q zBQY*Pjzj|Ot*f|ZOKVZQja_O@=7Z4R)T8s8PgoM2OBv;Znx16z&2Gv^q4?>N+2$rA z8rH8rCF~}!gUFSn?xQt#?BlMZg}_}w*M$v|$BVf$_~Qb@1ZN>{ohsL?p_l*tyb4Ug z&;zPqdAt~{?j8p-@?HCIVQAeKp5f{u6QRVKHzz83qub0C|F?2KAwdL+F6l#tbz$S? zC}z#hrQtApEry)5WMREa^7v*%I~S$k>OI?QyPLX&s$X&};Ab^h-YROkIlU7@>LK9k zpn=(c_r%jGDmkqbZC-GpywyJ=qoyFE=Fw>Ty(g=qEG;aZzhjwm#G-Cftj^Rk;*wms z=*BFX*&kmaFW4tlrSSG>_p4_|a2Gqwxj>dJ?%1Kpn|U0iRTZuYs`m$rSG%3%CYzbH zUfX_znsa-O$r87=e4D0g#n&l2HDM7&Cyj{Nw>Q-WT<_l;@{DsoDeN7h92-7NYb>0f zD747YicYT`eK~eob%*y^I+t7g7k!SHV=aT;H|JmJb$hvEUu%8m=Wke8UiK?V41w9) z`6QMKSd(8v!r6fS8a^vX%`qN&IvR`~t~P5`jFaAcb6PtSxavL^rZMR8xpeMed#Hr= z7L&!mg-Es6TBASzvc%+HD5R^WbKQ^=Hq-bgJ5Z8FkKulwDWYc^v%yUP0a{H{rb-to zCXC?LxDhL7W*>-95oPs6mWARL95MEn-hOPRO~S0MTG?){1|%HS?lLN6RB}?D@Z?oE ztUp(FFzZqpfW?-;oNX+d#ZO5IbMuuMIf4ByrZ}r|G=&h+mYcz=q83I)8cs#(P*AfG zbY3(jw_uIy$JiG?(-A(ujI`?H2`jS^K69B<8{3b=8_uwSBozNpLXf)YV4)GV;l-sT zH@kZdS9y!(eg*ihg>j4V^6}!lesH#YKPbR{8N7}8YH7CCvqLENRI55rb(!u#=$J4j zVgv$HTXIMI-FLN@H?v20sSeF!Bx#0Eel&1wqx`88cq^m~~bDHBl zB{TC^VkYPPTH3oq{Vr(c79us%j9-=@YB!HVTHbDf5y4+y09aURlQ-8Ah&|^%zgVN- z+h6i)`Cc+4r#93hf;?gF?5JKu$JKAgTrpLW!S_XZOoC&Dp<(i)$61Q*m!^vk&fTWr z3$3mxWw}H1vwv)73BOizW8K{WgZWF)`Na!UX*fRZv=aS>+75+ASCOH8|@ zFGFQ9`e0=!V3CI)acQ>mKrrtK&5iB(9oSrdD=PYyl?(D&N$aOG^z{nVrb$~>jqi8H zsWTDeh)1iZ8CT0rWOVN=N{Qgb%&g8^qd&hGFoo^ejk&qLGq}O9>uSssWO_RTj`>eD z#)^A%Y?VnB8My@lX)z5onQ-cQ>&3p^{ z%$Hz{LuTU5lW%5g_AoLjR5=6E2A*Auw-Ra(Npb8f`Z0y0Pg* zoRl?CLcPhNy5#9RJDMOLmJk{C{bgZSxXKP`P~Mu*W=qF{w@pOCRTk!;7y~w)EpqR? zuGu!)DW9-pHhNKl?k}_9OS>0Y#o8QFb^e)16u^llk9Irf2HtieV~>ZQ{@Ir!n>IIt zsQew;wVk8-)1z@gVm3DCG2bBuPzm#GgB1Y`AYnf5PIcruPt56V7%JWd5yK>=%ma7 z59ebB@~5)^^~q~nl)cWb(LX|+hnnqU_v88*?j6ul*lgipSz4Q0clxyYKwfrA+NR?EbyYEsnGc)?5B#U>h!;eb&boyhpoLahL z@xW3~)CwhOeyeG9U%|z>>~twI!rv2v2K^baA823EZ?Y6k)Q;pdm44)(&Z*Uhh1m|%%;?e4nc;9NW~Qu%_Hlqs93E8}& z3B3Z>SZO_~p?ZqVNC$5AuXF;h4T;<0;@4?Y;i4%*P;>^T_J+~@rWSn1!{+Eb26)fW zJ0AVc-vL`wBjc;Mo;WRV_K)0`>#!_u?-UnPMh_PcEt=(R#5*KR}k-rFQlvf$r{OABr{c|t!Zz9Hh;oKifmb$w) z{-Tn2iG>&}-{aRB^g)n;K+M2WckO?8g*O=c&+FNgyMc{A&{?e=94yBLt;VaswED_j zmz~98-TF6PUS7G`pnMp;23P0B%xTyWc}8{0Oosxyz3CRFnaXt;aGP7tE?l}K2=2c? z;n7mL2ktbaXV;-+j#(bM^!6^`F5o+_r3D#GSroz9A6kcocS$`!UVu_LMMCEzkeIJPD`*<7Xc}T;GRe!%pPQW;WrVl9MAOJ2K-d_*PZT>)dPb(!YO$3S5 z+&zblRfl>HuPh^#jATs&$9^aYmFPJBnY&{E*kW0;L)~7j)H1GK7bGOmt7t!09d5iB z+&F7?Kj_dZCN@~6H6!&VXq#`iKB`O_Rf^<)@jTIWD`=IHza*v%Bx)GbuQX z^Q+yb)0otAM!G0-bc{VoRM4D42d&u2NqU@?E(X6dx`lQVu`G$8m&_ODYo``4WWXD! zc?jPFD~|8{(cZModtcvD;}0PdIp}mi>IRPWRr1QMCyz>mPM%(VWHzweU#qd3PLi-z zwaF{vc0>=9#kRz+yF%M_$F+x#lbN(Cj*{^wfVpyTaX0uj&td|#yY<0#tBwMemu06h zhxW?7@Fy?{IM8a?PA5kfb9(doa?$w1B`ZV3D_2w5XppWUgETH`JA4vBKNW$NCxEOrov@VINA;>i1OlMWQKFR*Ib^zU%AiwfWUSe zca+6vQU(4ba>%{!6-dy{A3r{d7?K*wR*&qgtlarU>FA9IS|%d=9OtPsTDn?J=bim! zWg8Q#JS(fL;eP@@rc|Qa6&{|?R>Jh`tPgKs>$lgjEEOTa$3xGE?sTc|UZp(QW?um# z&lfp4@72|tFDv)@C{p{}6FwKeC z+3YUHG>}dqOV7T*^2P4#)CM10JbH8%@@Dv0T0R{3vvZ;MURW#x=k*)>YcDJX@glaI z_aXnY%6I%tn@jx8r$5aQ62rqSI!Zw*@e-u*;ws)0M3n zS#7^=_)gtz^~FH7zO2JSVpT=tS+=W~`|lD#e^`gb`smNbcbI){H*v~l`Un@^V@}Fe^IitF$!v8eE33WFpXIKu z&aPRud@GozP4*ics@(zo{&LwI2Sia=OTW?2M~{9uK4LtQt)2o25%>Xj#-oVhk{dve zFE6hMB+3Y4&WPG=bUtnY8H0FYx}o6oY?f_S^ScWZy>fC))jb1 z2jcfdfZ#YR>>>pkqY4FJ1Q8dnBKbln@vZ5RUF;g0s9t_A2xZY^lGx?Tai#hdQ5kZM zeye1bu*vRs(bx(*QlFqOFYik5wC7(c?#NJ3hdA^XHcKnOd(?FA9x}8^IrcKU#LJhz zl9(=tiE;DU1$2*n`g1%an&J2EBVzjgJ!id)g!#<(*@T>p4Rs9D*|S^h__~dz>6Fdw z&A#q#c*;RwPw(d)rqR{aWzm*UCm(ueEa>D(a&QQvbfVi^e=A+@Ej=FyM|$?+g&X3o z&Fop9ad=>oqNDjSXJ7#V;q$9k%IlGb8987Ui1gNsAL3KIP&T(}a=M1NrG-UzUmx4? zs?AL=jS5*>#&eQ?^`~>hC|$-lp^Ok1=q7smRfD+c487b%+w+0gL}A9E{d3fcQh!D+ z`!;Mm{=ar>IQ=%zPELfs&Q{nBm2SS<^OC&s7UV%*s~y~#(&*jYz&m#!_vOH0`g1}a zc@-6)A;W2GrZ_%$U@TyC@X*?>H@+cj4sLdaJdQ6A(paJdz_jD*OTjQzGZ{VE7zIg$ zz73=>!X$o>ceCGc>leZ=e8uB$Iq&EyDY>j@9DioG7jQcmdHtI2_kzkkQOR0Gfw++M z#l3X{+QGdD(8I|{Q(o!kJM4m}baAJax9cVpZ_ptZ`5`1krr@q+od$8ah!J_~kDRU#20?bX+`t?Fz3@BV?C^ zKl87xn%g|RJ3l>bq76N1RJGr>(0Z~cmcP=Ga9Mc~O({#7ZlCm7o!s0x!%5QY$p>Q1A?PIyb7$>?S?9soN*0XVYW0*jfx5i zFm&#|gcoB3)lUio`P8*VfiEl2!_)rZ1T;2$$}alLQsQ;%#$seJK*c`)Oz| zwJosHA13-K6crVLYPgMn{NuFhqpoJ)?)LAq}N2+k;p|FMmKBS(# zGF?7oXv3l}jFi=e?H6RluV1@?iZV5GLc{q%N5r%-gjBqWW~>k&jhbkLbw_;{&k2FP zUYnC*gwUFSjAO@+QMWXAGA<6>&sDzUg-Cv2reEH2pIw!4@F@TSJTGs4#ow>@r$F8A ze0q~INC%~?r+?-6nC($|;`q0Og@rFIs6Tl!J_XrKaivR@?0_yf(W~hB*)laXC9G=g z-pC-tjv+%2(4L%bGdS}{=i;#EZpSWNnTSa6p+h9{KBtr8F%7WUlcEo;|2gx*dC>Pr z;U#Ibr|-@}?(oc5hbGs_Ng0R9GR@o`I8otMg&jo3yTmxJvye5^&YDw1PNjKTM^^{X9?0w4HUPG?m zT0Voe1IW>8-M3=igc@AB4POGi6(dUTd5v-u0qtM?Pu=hwo5Z8D*qhkZ0k!oK`|9}t z9fKw=%>CydGwYV#aCYkXt6LDd)PJIJ<80F#b2E=#zs76PY%XlTDsUBmKzj!=3$r$D8D%jv*k(&d|`Xz{r|< z_U}e+IGS@TqNDYM-33@Ec0NU`6986lNO`-t-(xRx?qbRB&CgAi_HOMLFL89tmTmaH zD^O5Ca;qfQ_kaDmgbWS#6kwG!x8m;ptwAtS`QarCz&siX5`Nb4anHFmqIX@r``+ki zeNk?o@9w5$3VJyTHOIm(HSTG<;J=wABPJ^9VI0Nqh}by^Yqqh6M{keB4zX#Pjg_^) z@d5Q~IvKg6Xp&|8@64_8md&jNmBU?IlMiDN99~((y<%WLh15c!K#Fg`=r|;4-T9ib zeexOo*_``Vn3bBor=0*>xBRPU7`~cS^RbbZ5zM*e1?wT45iF;fk08?1AAzyw@Nw4p zg)!%!8%23}D(|LeuA4PB(qdKI6%}c-l09_TOmf{}s_nO~uH3hUriA)BjZ@&;jEaJ} z@!L8mZ4NaFT@;~FJm+h% z|Jv3JAiLJ@95;71;GL)YgOrq%*B1v3bacqac7>=HI$$BAB=$BwrQtSR5xVis)SmI? zpc>*XBod~9E$d+NP3P8;M`ij@%`u-F(xE#sBxXLc6MTU7S&D>LG5i#wyFiJg@y6)M zw2^q#50Rc8M(N5AEiDFg*CA5wvhsoeSO$3bYRUCIopexsCQD06Onx2vnVufbR#DnN zH88dDA8=q&9ABMJ>t8U9%Q6o&H^py&#dWQ(uIkq;1g@@@Siqc>p$&0YM;UA~N=vtL z%X1D4wiu?44j~7ul$elEMsfP1&F4NBE`CuI6VNYp+X#)aerGA^<5i%y9iZ_JwiPUT zPvPF<$*7CXCr&h4;;pMbZZ1snhR}!K^qbAJ6vSC~Wn{|5eB0dJ?yIS)%FaqYD`hdi zbI9}WSWmauTu-+@V4ORm83QY*MZ5|ZCN%Vn0A+n1l znSM!aKOFYXb_Y+jm$hJ1sQvMm|rVoPEorjXtc4Z>HUWf?>IQ9 z!CO^iMyN1e81(i96~o7sTPklP5TCM?Pea(>C5)4+E1QVTs+mCrAUh~3P8r@@oSo%S z?FUV$fPU?K5aUQoTQdtX5i;2}ia2402~)cNUg7ueg`hkkKIo|VY24BxbQHnLA6_vm zDxYA4rt9TljosYy{)=D%9?8XHXlL29i&V`Op=Eu){^ z+!Xi`;FG<*OqvU1pE2YYyn7zGcb5)wZ3s}ALi~)Lg@v4-UtPybs5`hZ{S@MtwY4== zt_c5HYya1!dNi7Us_`HHXUsWYl7>b^BgavWTJUG z{TL(X4n$||=>|oofbM%`I)N}pB#KD!aGgK@{>Kj(*P%qnE!!AQ87Z?`YK<@HT(bn= zUUZNZuGIVRf|`S)a326xG0?G@M!rUd1|Imhf^N-nXlvI6S|CO{26keuXktvU;ET~|I{owuGUhDHnz7@CFQ8Ilo zQc?f|s&Y?PS4Szdre@cmW8Dd6DYFGq!{*NwJcfxEHDZ9$-fkFrpXmLz1h$^kN zmI~lMyyV5q4A(@uIcjS^*3%=dlkolW(e>c5CM*nAh~2DQ%rCK^r6v23%97R@U{K`% z$H3mHd5^4(&f?QgYI;wwNyUHVB(K&Hd!|cI>G{XW|fE>#7!I#&W z1b4i8G;xbLZTx$x9_YF!d`-Hb>e8#Uqw;KP~$quFE9RlJy3E(2=+>lVHxD3 z934}%bJ4u2zk0QFHn%nvu^4S0Z8eYbW-T#u1x!tiJhlN`mF15nbASj5J1xkeFoe?( zcONr|paP=NgvtV;_i1UAfz8!VOJ-7rK6(1gx!^b9(SG>wLwgcVOIzCr{!`JdMZ@{Y z$;bA^;Gr`BgAg(lJZ7Ffbwz`owdbRo=?^#VQjX}b8RFDUyzqV{)2-T9UITGxLqVqY zj$4|~goQo#kR+!!YsDq{>dsn}>F?FA#Ke$?ZdtaIKm@bsNl;?*z6{<6$9ZqRwgFn0 zS+onwrb*TE2uPvgVqzvI4E0VYRm!C8EKdfGjX`uRU=_R%YS@y~^>2XuHdi$GNM$5T z>T+^4=$1xm9K~?u&5wRClV_Ki$*tIm!s_bTkVQ@J)$d0UFc0PLpgc?UD=h<8JGSE5 zrA$K2;?6i0w^z4T#BFPnqp686z4>tfhJrk{nBnxD8H07$(sE6n6a8NK64clsi&i3Nf_n9{3SK*VHx8J1wU)}XY(6nGlJ|)JyCs! zY=s5Z)}~l;pAK>Y6a?5+ZcNEV<${=RP|uCO4HBpmrfMwZBUp_f3N`5!^GR1_*v*n| znOI9($jZvDECc!mG3y*|XopSli(A>%ZoXYsvb+49i}c)h=6o0!vNtKH9Wn z9u2;m#conyZ4}+U#KmiQzTpkTv*yuI9qh`R(%$GtzJ6JgbrSY$FE zo|kMSA+cGj&ztrJ^?sz5xMygl{>J_@lK)3s?_`z;vR|tdwd}Bnh}eQ~xp82AYN{{5 z*Kr7;^2|jdNP)CPkUgpFhKl)2n3omwWQ^$})g90-*R1D+l`5x~=3A0`Wom zfZeq-^L_AFp$d6_9M^PVnnkmIJ-P^f0_8^loA%sf8~@J&7`GrT19i*jD3#OBc!j!I zQPLuI>C(g&3Utfg^MRTlJ#2C9OhNfqXfDWQcR3#whEHSPS9uKD6Tqz&6zqTBc3waL zIPD)Mn{1~~Tc)sp?*f?dnOPv%X{w_Z);LB#1cj(1NR|Ptc)q-Rk~@L~FuKiRZZ^H3 zE*x7fx!tPC%sgpiL>GX)0~L&&U7j0%mI;w0e>fKK)?t!J)Yj51bR>)beaOj42z}VN z^5R)h)cEtT=U~ydf-JYNeeyt7a!B`^=O`;l=o)HW!dP7g_iVhF|5ycK9@=FmkOyhW z$2-=Phf>bRwOqXTg?#Kd1OrPXyyEk-;g*u%6*Bww+FC@U=jv7Y=V4(OrlVOd-zMID z_~6IO!^^-fc^`%1S>qJ8`t>sH#7C}(l$){G=;41YP!@o&tXw+TZKLXevQSbg?!J>f zCuY+PL8?)Oi#3pq>rW>2l|edf?DWKhu)Dt2ebf7j*3G+q)L>Bb8iDD3IHuXS9`l|; zLvzIIcSZnBKuWisPrx+ZU)VQ+k_eo)!;mKHxKZ?D#G(Z>XMhHu{~K zK%C=Hsh&V|%1vj!yV*59n@R|bJU$r$tIr9E-k{he6qwAwa$0)E>F1~Bu59`2bK-`E zT40rCfw57&;{dM&)o~9SVc%z1 z;%8>gRB9XM^?fD&{`|_7~?o`_duc^YhQ2={}3$?ALzD5Qe+DY)RF$ zon3es?+N>1NUw~cmhM}a+7s{GlBuYfxe6|C3J|izB_%9;mA13pL`Tk6j?;y!#JF*@3(EV8!FFCl?1CWbj*26zrZ$%aProRdhyYB%S` zXQ~=CDxna3Nw6rHoSKr}{=yEPA3%HSHTw?)!L|aGD|}!C`*uA5q&8=b2#)w0j|avY zL%_`a5^=%=y;KDa443Yi{K(yrM@5Me?k+2_`IN0-P_PRNDrR)lQhKpmn!_-S%G=93 zoc-1U)^UA)cXb@5{^j;0#CluUO*}D?X@COFz+z09{U z?633A4&^}5Q~iUZfO8e^=+ikb7$&RrsV8(KaWJ1`Vj7*F&+D;)?x#}L^3qasOG~sj zYq-w(IH*Mb3E~YmBT#b_#E!88jl;uIaKfxZgVOc&FjmBAvL!YKo)W}eV0A@X!Uz?}x)aRILT*-{LOAPnT!@{O&QyAZ2UGc^=;pO+SNQq06A*E|GA8+wKq+!2qdWWh zJU@PF2Et@{!^{ANbfJkRzgaE^BG6W51q z%5t=FvXtYtw`ohy4E2Ul*ZxsZ>`W1`d7pn(k(=>8)!AKY@T!pMiyC+ zDA$E7l=k(*IQ8c~A~#%yLQh-_W`Y?*S(h(E)8uIIqxpUX;z$tf9~ov2@W!_;jdMf& zqzFq%&o`L8&xc>j+EB+t@Y&} zZ+dJf+wD52Jj1eI?f0M)2`m+qj{5ZIv5%YYQ&a5+O`xF$1!5eRb;ITs!GP1J_{|#$ zku?=Pz4-2xMn-~3*=#+~!N%{jEM~eGIr<$rGmDFt!;NrMY61#M$g4LgnF@reNGx83 zXo>gs@loDJ?~xq^!_SB-<+^XrG?L+|Eb{o)()wLy<9j2(_4fAJNa>x_w6wA5oyYLo zLnoj6*!;jUB$N!N+A1z6gDE0U)BwQT?#X|!#C}cg3Zd;S zgWDmCkxDo#?_X&l6?W+U-Ad6GS19;%^C``^!>NANrev7vsN4r0c-s>7M~~8(EFz4X7z?eXnEig};aaP_V;#;H5* zjdXT)_J;E>JJJ4#%-K3LzGIGm_AK^JMe`$Tp-Cmz7MXWV&Dt=CutjG`$ZHuUs)Ldr zmIB3<%0UaSOn@su6ep+|?x#cx)rq}z-Sl##jEB$tN?mTD4q=B{9e5&>E0wn^L6<`l zV3JXjxZm#pSlcaJm)5*un;waK3hZr3{+6aYI1JC6vZ9{xA0iC+^M64j-ysqw2|Xe- zw>>rcdZ-^VI-nUF!{Y9KoaTF7WlgoG`w{qI<@)cjO#hD=>-!$=`)EdW)v~AD+>bOo zm&+i|QU|c35kQw4>HtEksiy9dv`wIrfaCucOHMua|0U7>&r<}fgA15J6i{|5_9D%J z+de=y-|7cWJis9WU^hwJf7h3m4M64hw%-bvnO>N70rubRRpK}lcx{yATb|U>2Dx)^ ziuZUqfZr*A;pBe8t*Jax_?w=A+d6T2S=|$E5%q8@fY!zyCx__s?^c8RshSfS#d~UZ J3y`Ky{|gH^Nh$yU diff --git a/enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Lists the catalog (failed) (attempt 2).png b/enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Lists the catalog (failed) (attempt 2).png deleted file mode 100644 index 7dd249aa0e4de270ef3bc7c9ea4aad482c4f34d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100995 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 MLE~1I+`VW21+I*K(*OVf diff --git a/enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Lists the catalog (failed) (attempt 3) (1).png b/enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Lists the catalog (failed) (attempt 3) (1).png deleted file mode 100644 index 24c521040081340c818d06384cc90fa4060c9689..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100949 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 RBQDg}Rj+GaD^#+0@?T)qx}^XB diff --git a/enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Lists the catalog (failed).png b/enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Lists the catalog (failed).png deleted file mode 100644 index 9b00365ee4989066b3f0907090fa3fab356fb326..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101295 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 Adw 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 hc1bsD^moc!X@j{T|1qu|m;u3-uDDEEIEfftF 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 BvEJ7N{miIHb}&Y8?ck(4q}!#V=@lx; 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
  • `% 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 z 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

    #O&X&{+j<)aZ%!Y(hU?#6CQ!c;QSs&(&q< znf+IA&XuLNzPq=POc^7Ez-f_k%FId~hVTU%$|?pfI#l!?RvN<>BCMi*ta{Fcpg5vSka_mE+mG8B_;xF$hr$8N=ec(7=PBtN(TR?wW_7c z-u(&8axn_ryDA(RIWGP~#ub?g)WH?4-`0bIZkt(?q`4VrvAIDu=1H7fu8%7h=&OTv zaT*%hH$x!8n+ol)6B^fJp;Ugy-bASZaE|B9-XEll;-)%&?Pm(=Fq7 zM9dKI-GfXsQSzs5DF4Fz3~XxZY+awku;xb`rexl9wxD`e8qrc+H&wWN2BZ6}f5GjK zx69hpuDP*OX)qeWU#?K^7#Y=T!%rU!=(M2ndToyT&?) zQiy14r=*0D;;jZ^AfaDWm8Gl~i&o5Rjr`4@+%pXNi(@GhiK0&8Az3iP$>}QlSK296 zZ-p!xjD83kjzI`46ZTBf;4rb* zkBS;OD*Uui47fGwO@_pMzzg#yZ@1rFbEgbh-jE2idAKvD4|Ak4@@3YnO6F9>x&ii3 zVXeDj#UG@o=V2k6q60Pj*g02k3o-Fh6Mrli;>`9s+c+W72U290y0_d9h8(G$*XMH+ z^CgNF$vgU8UO}PvDaq4?RN`*#XTvxLNu@Mi;fZ0vb*A5ddaZCg4C)SK(h@N#fcyEo zRa;h?jv2mgC~AKU62W*aG;6@YZwo*BwC-W>NYSl7#ZKp8hq^|IA9qWG`XooQ(P+zk zcY8}iRru@I?|->OVWGuIEWcIb!RWF@X<2bFA>jcg#4y~oNePpP$mRM{>i4Mk!GQ6R z0Eq$_MlH-Lo+`7ftF%&W{by5MohW0nY`Re0qeHk}m3o<~#T7>5BV1m>hTR)$k#}f; zXWHDz+}vu)v;1wtAsD44%x%w|!YvoVO%F%E>BayUYqt#RcBW}=Vi6CA1fPUtZ}G^{ zZG~6_eMV>*i5}rM9Tmn?EBLVm!uDY-h3xyXK`w;`cP@o*xCtd?z&!suFgZzzC{zX^ zuSB#kAIH)xaU|QZ??Z}1@VsG-c#!@HYJA^Uc!b+}sVy&|S-{PbZeH*Xojaad5@f3B zC{Z6AauLWm1P@v@=90YjJ%*>E`lDdWN)a@le-83}o0RsR1jnF>pRY~D|JAZ)>f7`# zp&!Wv33#Mg@kC1p9Vr(bOS)w{oiAr2T`w1oq_%O=1=_7{zXv8$GL+rXNjttLWFEVx z{Fv>^pfUIBfX?*%M+Cg~-iLd3;)f zj1!qOV60PO;dR+lU~^rgzrqXZixg}ALKIFPz&oIWkn}nlLmJJ5EZ`FyD$9)eWhCi) z^9BU&^ffz;DRv^tn`Ga;7qY$(d7z*J>-&+AcQK>tF%d;5IKfa$_!S`;`#^W>aXbCXfXtCKIG5 z;)Rc06)_{^-BnHlwRy?Fco>y0pEsQ#XUI=XzD)b)jDhB={>05)bm1lUHN)xkc5@r9 zaojrCzTJ00mY87NQnpE>614hSwvBw^2)Pxa>oc6vsrx9$pAnIUrAs!F+MJB0p zvEp6k2c1st(6_cVz=`~6RcYbfbNlB9mhnJszq^f*%i46M*s% z3z{tbEv_{X6e3N<55u%iwwsLf7mqrYvX!^`p4$L_2pA+@Mm6A zA>|`~&uD*J@5m8dy){~qH5GIXQ+YHf4kCb}v;aU{%I|KFBSFF&a_$yaZikrn_)e|E z`)PsmV{^wRv^}#-c>@4mY!{PiFUl4`mXYo`zQ>V1Y*M#okESCtL9On6IxzARlwJJC zAbhTAbSa1T1Pub#wB`z#boS)2I-| zchf%ru;XE-<5qiW@Xl;U_UI8eS0}X@+}>&Z5J6jC%o~))nH2@Bce@(`KWhj9He*xC z*{{oW)T6gGr15mjFJ0|L$!=`O@T0iscHP6Sdbg?PGP09`kPt=Ee#%IcibZA$ZuWrj ztw$sgTBuqX?$hIk9PI*`u-NA3IOHy`UxqaVQ8fB12Ps@}xGO+%QG>-}g_AH4=F-a7 z|2rs4z&o4@^EfQdqfrv$0}Wq(i>Aw@+$EC!fo^Z^Ok*W;iv=uRf4&|IuEy%jDOib8 zz4+2tO|V~?-r5Z?a@ zc5GYeXOKDTmJ|)zKSz4WE6f&jbVx*pM~U`%7}|ntoj1zOe|C16o>_iBXS5oPP?WLr z`?rg*evQnrvR@Z>w7BJo;;Oj5OB(>EW(b=q`E>=!7d1$=+0Fg}p3AzlH&BScwzNpY zXRAmwV}yMUjl)Cvv9LB>Z~wrT%AjZ#VVSCJFnCzWnpw&265sK@JlOR^v+ zBV|f+DFTZnJImW~su20T4k6cA1U!O3s zJa3T`bs!?%5%V}LTQsbNC|NXAHdHWB!>(cl`RI9sm{D#pBOH_7zP|aUbhqj)V^_A_ zi>yvSuuu}K$WKVLJGA2nBzQ_U!?znfBAqJ8q9~+!zkV)n2I^&*sA?Y~F!#%@) z!>ZbqSTIi6e2=ZlXT9MJ5|MFko6NuQj4{URWf4UchAW1#{#4X5nIWuFf1!xSkaMiV zVj&+jsdN34=r6DP7AW2#+u@k4Wfw7!+$|ciJj$jC;9h5i`ienb#X^n6c{q2kPSL+p z4b+}%y~<9xvLRxJpQAJCz4rc!$_XNk z{~s-YLRsvd7g?06doKT`z#?fKQ&H3XcbQ+k#R)=i5f71Cof(n8Aa7Xhcr;gF=rVFXQ^ z`@O9jn4b-H!=v}13tV}t2Efq@rS`wDPWrRm(x9z5jhSTN24#(dMeEq?Y~h3fr4Oxk zLXKv;sJ^*AKF=Hka?B@&HFKRlUG?MWU~n3bIX&dhkPOwk_3V@*E!C}o1PKaCBO7Tb%S%B9&XSKX7JWe zX!j14oc|>9@Hx0g1{Pa#4y%<_H0SSIs2X`#ppaa+Tr|ORr4u7MtNfg+d&TNQl95W% z2GAq#q#Jt7?(J9Tm_vz4NF?*dYuT_}o^BI#a@g?X09ccmN9UIz+nra8PRSP+%Tvj4 zzSxW7UdU50WEtI49v_7!SgFqPX5exP4UJXO z(VrL1)r^!MfExI~NgUwMwimYw3(@GS+JMAnVxE_QzphKaVZbV`ap=qyx>c)6Zw>L{ z$sScLy8@U<$SZXHKLBG2HC&4!mEXOh0U#A%IO?Sy?wcI;klr;TX!I~KT4-KtV%ei?dr@Z{!bwB+!Jr|Ro_?WV)^oC_!bwr!C+A4_jY z*)!!wB_kJF9`Ye2HLyckAA0w_>Cp;rbUWwC-ZtLmJ@b#M)58Fc&d$ERcxdF?uszB4q{b!<=aAxsVIP;^q*S`G7Cvhvg0{y{xMdj8eJ=2uyou_%*K$I z<`exyxVp1cG11uQ41h98TIwqwpp;{7kWFd>wmqO1wX$K027vd|qrcc)V=lMX@-n?<+{gh8Ku?XWuni5U~>LTENCpw2^h%)J((_~*c- zbl4_g@LT2*Hk+;6=~q^*YZ9InYV|lO*dhf(s|F_n|FFA%?KvM%*W!_etayaq>N+&& z?&3RuEw zr`ud?R7+Z^u};3ZmNPRjh=7BGLPk^5|55DI7Vo3QBO_(3EG=6!@n7L3Xr&Q0#T?%+ z=QR4RWIa7xM>)}jD9SoXdRgtZky`1u@_7EPS4nB&IdOXFaXcb+$obx72xH8cn1M~} z>P}j*Y5rgoPgjwL@3@LqD(xJBWisqoE%|I7xdKUe%$UJSD5*xoMXlQM$AdOvi52$~ z{<3MD)sv_0dnlZLEe(}Ug@xDAiuSJ4{NF>A9g>zsBQ|_=;qNa;t`d6Bv*LW2$r!jH zg#2&e+f|1gedjJFV@P8tvE3+|C8>DJ$JRDU@4S?4KsPxj$vBPtVT;XVcV6wG~I{Ki)pBJzO-|2%pE!a#4r@ zKrV~!#8C7(04vZZ9hX(1?>dPyr+7>Fpj8^^HwfIc5%i)1)fm1d-s{Xj@ zeP?s5Z>#0Tji~-%6&~?!-zmf|J00hyAr=(nz_5XP*zQs+H|bCKX5%IJr&^F%7};AF z@S5*MX)nNVL_*b6m#iA5cqQXUH)KjQash(5tFpsUO~11E<#|5>U=N;pSFg)T!z3$DGD5yvU-aKwCqcpH!4|< zqquMSjM!~#DBzN%SM#BvQoOX@k#p)G2{c!nCa5Iz`pX(g(H`* z_UYh3ItD~4Jg$YE9TRdy9Fb7O^7I_e3C_WvR6=G^A>q@iH(t90yu;(?$*#rrSotE@ zQH+#kxJs0u>$O<)%;|hrQ?;fnL3HDJjAnD}KquFlp4bmx(-eB%GY{+=ApB1%iIm&b_rURIpLqR(dat==uge)L&cWhx4 zZn~T63k1JC+3M^Uym?i&m&ukbby$%9C&`aDp(BV41C*AsX2DeXNpr&C7ACjb zMs5Y=yPh~#cX4mL-6FNStf_v7dH{8lq1SGA_<>7k-kew&;6%xu-s}vsSchIlfu~(rD8^alzsk*wNJmTfz zmVbt&aHC>O^C(F{H-i>+E`xmHt?vw?YP5!}xMq#_`-@!-y63Dar{_&613r2%E}l$j zeDt;`eSpu<4i3I9@`v$oIEw$4#Qmo_#B-ov=`0pb`u()EakS+=eWplQF#M)9DdMEb zR}hd}8byu&+&JstA zybsVO=wl}Ufp%F&6|w-?sN+A`DBc{)*TlkqveBc6zOVaN$#Kkp95_nQqa(QQtXR~6 zXEKJ@&aMaK_FQL=@J||x!Vvd;vVv>ZX?x*kzd0~W5-O>Er)`@C5vohGAadY*@_*-F z-k5Ggf!`{SrYXGwbvKXAtIVv#YA|v&%oww2uC1ejKv{r}vhQm|5E0JMF0lvPGD~SU!v{(za<{d>mofp zLnTOy2bQhkmp=;+4PH(`k_AfcwZ>LfR*q#3KevEk0;-S085d(fpb(;1+Rbw~lZ0_Awq0wr&_1Ev zbl{%>NiuZ(w4);mA+zTv@ui$!=OV{FacAzo%R$ZXfUz0?^fHRSqE!>DH7QdR^G1mX ztqp3}q#=tCnB0#Y@vD=sV$h}ubqVKHt}i#A9XGzZtd0{!OV%Uq*A=OVbIN${ED+P9l?=6fI7cZ20_IVBzDANqGVZ-o#$ zKZoQ$Q8}e8S*F2fvEOa6J^;#Jqadd8_(=vH)JzNxTK^j31L(1q&Bl;}*4I`pZ&$xu z9<+ltMgA$)4LI=Jkeoi>edcylo}^jkkVF72{&o|{Su#1`yf2ugRGLuFdzsePNBEmVYxUkfW{ z6S3z$IsFvq3EB37tST@6EZrcnxxn7<=}iDIxYoxDbTCQ#y8EVjmxtMS?_FR+t~z8EITbXn{SSz);%!!hCtV=i5Z{y8VO7 zFSfyuFFIa>{@x47Xvd`$E%6_}mJV$LwgNLYu4@r(soMC`6`%dziWHC4M)K=V5`Ma~ zwLETJ8GfBWtMGWBpY^RyGq3^L{gc&Sk>kJH`j~1JS&(A9eR{fErq04ogck3l)1ibz zLK2OE72b~Nucb|Z38_UZfmvN%UyFh@D{vyAvff;LG(E;_jWXKBbX0pE=pP3x09-XO zf>}s^%rO!tGJL=o9TpRy_i6IKtq)OJO^L6U=n`B8^WQx4h+rrPJn#0lyF+qTr%LLo zy6$51Y(Ig$o2)1O14Eyl9+S6O+O?dbUM{(9;H(3VS9xA89rOr4xoliP$23jsE z%}2}Bm(IGM4j_<#gMGs1o32=eOd-$yTIyI^H{&PoSh_^%ps`DHWj(L8JKAiI%ECfs zUb?k2)L7ZHL{(kgHus?!N(qH#x})qYUp^|HQ`atEw5rXLqO7p+7z=ajhuaMnG#sM4 zC0pMPmm`ayv6!RuSmKAhEAAEhJ2x@ojBH=lz#f&dcbwDjxzaglxHR*QkM}M5k>L=6 zYcw*p3ke>%n2bs#sW2nGb91pHM@aL=cWdnF48zg=!$#!Ijrur?zrM=D59}FRC>Jb3 z4$|YRAm{>0*jvn4#odBwi{fuiTG5Ih_7AOWi>qApzFKI_)KET%Q4Fxi?AP-xU0rv4 zT^k>%`3UH)&heW>wPVNoHa2$%v2sGIKmA)nAQHm*ce}5Qg zqFb*;16dFOL1l1=I3`D$5)2e>XVs$ zZ$tY{6(};gc52talrqGQ=L9AX)FZ{h5@G6FJAW6!yrWP9%lI*u|K_3d#5og^W42$v z2owi=J2HWokmb2M_N<_vq>TUOFbaz@`86>iAwV9fRchd1V#Z*sU$}#FHuK?#K>968 z!MJ7R?GYGA$jE>&k?td%&%q4w?KMEiKAyGU>deq3ID5FiC2jWAH8ZQeu(&y5aofL9 zV8x3nE)H8={rQB5MjljK%l6A~T>s^q@!3jEP2AJ-gm|>|Lz@nHQlsznz)MUvkN5TA zT_C)K-L{MV98u-41$3MRko6i{$_RFHtI)T#cRX$C5({;{Qek$gnx7{~h^Lioe@cvy zFQ}dTdQxD6>Noyow(YtcZpM6?qDG84g*-^iFkHS&1Z>`5!NT%U1mm_!n<`$XO)Ex1 z*{DW?8g~>P4#AOU@v*=X1H!?V*<--0S9{<6ObjNcN#JDXJ~2Fl*%Y+T#$T%9qK3Q{ zYxy@*cw07fplfvS^$og1)&vZ8{8jSrmIEean5lvdcIB_sIsa&Fxo|}`X42-rE)1cB|9)!HY*pK0t)!)>c-2o%xIJcHa{~>3esfDwe_ILj^6szUs-<~j}jV$ePaE$Mb7Vw*)OG^Wu>LWX#H`N z{aq_Hge!lLf+2b1bF=4Yp&RoJX_xiy9+Sz!JZF|Qb#=A9Y7(`!vl?6h|K)y~(~k)W ze|v^5=*E)8oWc;ntdk+gPs_=9*X=LrX1G@{l#|nQ;(J=sxAqBa&qIXJmlqP?#J6O? zYO{Db{9A5COf2YR;X?O0KKP{L#rZmg>&{P1 zsf5;uA5-wOrU&B}bFDWW$bk3C>wvtzP|p3LN#9 z;cmw>wnCJ)Udz7>?aS39qe)0QLfSD9|D|plOY6``OWntOqtxpQO>RV2Eeomn!@xA;Nt}K(x z=ye(QFuQW|$-qZBKyE!I$Mwz53_PP1VCg zr0@LWRihv11@MKvdy_kMeMSLf$;`T9-i-~a9(xnt_K$!};l=%6y6fp_IzUvy$S8N$ z$-~-O5VEV~j0)N9L7X|7Ybk1J35FU*Qg>$7as?@x7IAQK6%@8+P)P~DtcHcnts@Js zJv`eK2rvuDEjtT7XzfxLPVUkty(Twi+Xs>=^`dv=iK(1<1ugRAz#_&&NgkNmNq7ws ze^Uqhb92pxS1&jj%Yu{Lq2uCD29AV6|KmdTi<&xEdPt6q?N}EuXIs z6c!m}^TuIBm3r<8MKT7g&6l$1_P~}<5U4UTEX?g{TAkGMux5ST&|*CVmC)zuK%Ygs z(dq{>dwgEt;~fi2$Md|*%iWEzyMSJ3`31Vd3ry}Z5@Y^)NnTiZ#rdY({oIw1gJ4+r z`7XrqiUqQp=_=&*($UljJ8u!sbKe+#kxyldOLN{mt-;lI>#Ql+n{PNkC#lpa@wjez zdFVUIZa%0~1=hpZnh_A2nJn&nyUviV?n9RzGTy8LGu*X!dzJli`B%pGC9=oh_Oebc zG?qvd{2n*u9TA_$sGubzATZne_(hE3WcLRZ5omTsg^KE%d@5h4SpJfYV`ckMVuRd| zA4_)6^ge_b7=y-a_Mk<&1R9!e@|j#sr;jzQX@f!efB*b(i>G43aa2`h=~#Nr>hT>d z^dHU;#FtsRqa)y8tH2HLwvqkV1gLxydr1I~Qp`}lZorJK4g*Wx()|=lrnQB|q=i*>gUzERV zr!4}Vg(o@CZbb^ucEEqe^=vr+ds9aQ4B1k>3&>E5z9^x9LP%B7qcB>Nc5iS{sX#VX z#Wt6W&G5%>JH$}0RF?*s(Uai~4r>;y2^y5h-m&BT)mwOj4o?t0vhj8gB}BZ!$$b+p z1nhK+(jE4L+g8uSq;N#PctiG?{$B*M{cAGmpMMXtj=YtH{-q$c%z?uaNiv?dEFUr&^ zJkAGbk&%%ls_{Tkrj#%QJdUZhvIqE8E`z3pDSF;m+C;a9bUE=zsBxWUCJX zS$|1M$y6dDsh8c$^Ak(^X>SGht;ZP@7aJS9O0Prf%a`%-@wm7+5sY6kI6c9QlXh!*zrF$W2+zqG<%vhrc|R-jU16d3Ws-nIO&1!i+gy%vm*be^Ax+biL50j{*`WdjEt2xL=qMAsM!` zv?v$KhKGlnTU#%6dV7v08SwJ*UhIsbqoJvNcn1#;4=^g9z=BVglOiG_>0H*O#l_u` z!8+jcm6dwmBwmrZ5cdN}D~VPtH7 zd48Cjm=FR6yEh4-2&P?k+v%K~oD^}p%bq84l9E7ANl8h-^G*O%EIFr8Tz!$692zc@eAMYew!tH3KJE5 zM)}qJ@pU6*egkEJ^=ZIldZih-Z&fORMlOvbyfr|t-OYZt5x#ql;vLe?Xf{inWNlrY zva+%{hnBqj$W)0ksmCrkk?QkxQtrY#V;qAMN9e`q>2X)>od)C#~q7m~2VWjaoZUeS1S2S6mw0F5T zsa~#eR^|J209@s$$y=GT)aqO|QNliTetu4y9{y=Z_~k7+`smt>2KHz2ds!O^Xv*phO2TyT9DKySoD%OTTu%Wmsfnp91M={~7L< z7a5RT{!L{k^}ZZOCFELF8*|+Li-{Brctw9ilJ0>8WL)NUU{cQ1KzQ2kkf8Th2Mi1h znY2EDQ3E+IMI4GFNS1IU8VD$OaI&wd>&7QLcdK6QY6>R~h&UB}O8FEfAqo??RQJ8i zAid8c^%z0#c;~l_ChmI;{47S;s%A%-a1fQJU;GTep$zC$_~nxsH6g=kJof8reW68i z>5X6e06}|laxxAfVI+eysrx2ofl`YhG{XI2TkvX1nSBh3Hl3cX&7hJx9D} zsMk7DRuJ4eI5<#pSiEd99lmIB+>y`Z`^Eu)Q~yo|CN)LhCpA5t-}m{kOucF(og2MB zdFojB;x9X}SlxhUh6!O%D<=c5XSyx}@<0+jgXMPjgP96Pn3$sC80qsVVm#HqfC8+1 zU|st52EBc{pEoixBK5gl!)G^1Oi9^D{=XRe%BU*4sN07|Q9x3Z1_9~rmQD#N38e+3 zyAGvD3y4TJNJ}?IM7mp~`_SEWH@@FD#{F@BTnFzM=zBOkXUE!e%{kZF?YGyvu)}|U zqR51Z2nfC;B^7EiuJt8NjE{fBIzePb)fWW`;`YR|4fOS0U(Vfv#Wm}5YCyCZFR^rW zeGS-`I;*jQj~~&?bcDfQeBUEn<1OZD1uSWf_?Uh~yKPn76|rJI|Zr6mJ)>h<+?oxZK2Vo#1@{BPs^<*rx< zPA&;t3>@-G9cFO2kYeXGHclIt1%3SZcl)HEfRQymDJEu7-I0QVBIt9H#KgI`uYy9T zR^i=wRIF8~p6?A9J^NjwQO>pglm`2SfJvL#ax;KCaqoZd_xI-qOY$H zJJ92*-`bGm%uVc8x|a)(_N z6z<1%W!Iav6Sjd^($(AB+tUNqvA3Zid8%Zwu#nJGc#f2mRBcfsU^Lj-*;!djN>@9; z@d?^0+;?}Um}zbCHZh^$X*;i?-#ZO)sGFuw^LA_r zK;zG@nY0j!m*cI#j#KswEgZ^B0642`5M%|ei|7OOfT7< zu?upWk0vHiI45>+>&EZcp+I|vXVG%gY=Bz6nY+E=6BWJ5iW2n%C&FrPf(d8B_qt$g zGR~yF3X6f0lav15UZ6Mq=6Gu8Aurz*$j8XQV6Q7?NM4hjvv+>A3%~UR>jg|`?RH5` z4IdA2d|hE-&r)fg8#rV!sX&ys3WdYrJ)D~GKK|b>71d(5=L6OgCB-ErzB_emTE%+D zEf^H;I^n4p$Z*%l5+o=P``-abgFwX_dKv%FCsUjeBlK;?81-+OK{rNl^oc%HUdqTZ z{5~91?LrfXa?Uv@jFi~&0!^>d!jdbkO!Sw5&vyx?{jsrCIMi@wAUn>o_dYQDarJlc%F=R!hCN=il+(NLGj{Vpb{ zYGJVn?DSxqTQRRwGUBn6-Kblie$Cv$ykRelb!DkXkGz0S(YQM|KFOx1Z^w6cw#lo9 ztzk08v|>HU7EfaE?)J+Lu4~%(Cg-Yz9Bs_ek@JKs3TDP@)L?O%ph1yeGA+7Tl@9~g)h`HR z_CBB!n9s+4?hBMoweNp0_fC8l^$~t3D)3d?lV9*43XPq+Oy9PKHZ>5eloTs{zNs7)LJTYNNEvA;NhFA+5)Ys4$I>H^y8W zQo0(i#vMRF2F)qJa>-!`P0hFu6&Dvbxb3pCuw0)lMMaScP{)G^Z&Wg5`IY50Z|;-r z?d{UWgYMS=igh!U3WFmDM4d;E9*K&I>J^_v!LDe0`T=0M4i>vwD6X0PTVW9;N1MoH z5vf;fSYtc$kXO&i>2SRGbvy{qZ(BdEuCD(0@uQ@Kbz=D~&<6$wKY#ghbUb0C4JZ{^ z*_xV~1~;jwjF$`nfq}5&LL)K}Pf*G?R&_&E48j8~?XnyE(!j%`?(&VxDaJlXm7f!Y zW@b{0rriRVTE`X!ifz|_U_7P@+9AWfucU%$(R!Z^H)d}IlcASbR&-?j)T`zwX$9%h z<;P}jly_?9n06gjE+);91~D$~=k<>}lF7*`d0sc?Ydt+ZOG`^>o*Vh;>FLLt6Y!gh zO%oMB@xTuI`0Dg`?0gTC(r&NT=DZIhtVJ2Y)5VY%ZC)Tl456Up5(W-{xgOKW0rtE6@FkV+%6Ks`Q7&@o6^bRduG7kC-PY9du7_pHl9~a7-|#(AYaPL zz`zecQ5akEpP3mSl!vZEw^swVS4$MP-}Cbw1XIAlGW*RS(a>WhuD)In*j(}P!Gq0( zH$;{7Jhf{a8Xe^ZXUOgK+-*c;WUlrzdtJD%4?y|q>caruiR4Dj98==q;fAmakDj)phBNhxF#(C*AZjF2_n#6XTjO)nM@+bwsK}}p)>d1eEKX65CQ4xH zN_2s(3)8<7DT8cD16w{T>1BzJK}HS`d1wD)IAbG%#7_K zJtXnRN*iz!OgWlW(FO%MARp%wts%)+&$@E&bAc26w;2PVJ@cQ`s(UmGTzzdvNv(m; zjv9>~B4&nnkwmt}P^6J!YePuRY;{gZsGKW666qQLw`;)RxWkaivp7HBUN9xL0}j&Q z&BE4NVPWCsvqdZz>=vZ+O?7o3>q{Wd@LBwQ?{p+L)t7#5AcR~?q)U|y8za{!$oA=j zpO{q6QEzZ@JA+8b_lDTH6WB^Tt9tSK^-8{-CUpf~3;xN%pcCiE_=d{BTw_geB>gS+ zk)#_J2#~fj_1Z>0#{;k%E}x*;quTuZbrtQ0RL(tbAsJ8(iHa}&8?_ikB@s*%?$fUx z5`iS+QGP@BsOfs~e+eULCe8biZxOh2QAOb_*qo`Ltl4>@H&+j{dz|6UbD~4GWBecc1zP%7efDijvG2qy&{Z z^M#Mt1zL88BV`+0_VS-RASgQcsDu3(wNiIp=%EgS`=6)A0zYYO6{R`MX@YPi5v(7O z?%wwi_Wg^kL5twvCMtid*$23sl*uS<$el|qNFra>)5nnKqWq!*FdC^+QOIeJrr!22 zd`1;sMRBNMLAiSu%$W#w=q?-wAU}5e$wxDf>i(CQ$nzI6RnbWRH_o3tcgvYNOCU7q*YDl3EM(;^|? zfRDVYl?NYAcYd2nXZ2n*DFj83xmsq-dJFgqA_+3@6{GJQ1`$N{looRY#s;{vR_eX^ z#UfTZC*?qF0!A5pKJp1tzq~WiVcUj}DI>OGY;1O-M&F0NN64T+fMC?AJ-bnU+H7lQ z?Ry@7%fZjTw_>r2^0PHc7$5iX)r8osg{97NVlY6ukpS)UY_y3ga%4_w{haMriqEEZC}SXFA+3RB3@^Msi8~3>om`D z6i2umd#ZsjT*#UL=N92Qow5_%wzRv4`M~#Re+`H150Ax8fJj44s(=9rF76d#AhooJ z|L>oditzCT`%Y6N#jhfJ{bD!SBkz#jbd_V6mitACx*x7vz!o;wZcA}y)eD1DJx_>l zZZhFbH?m@4xAdvLb&F>Jw45;Od&9cJ!(q+GdT(BK9$ZqClorm`nV2{${R)l4N#pnZ zzIYaG1i$ErJo#z|Kj)_9Ud*UcO|dSRD}Q&rfdL}|BYzxEQ8%k+Ez4tG@osY-_XW2h1p;Q28VJD@oM>;+yTU zzg+Zg+tXXK`qt#00X@f$$;MDo(c!oKMx@xXwzFH4(uaI@S2D%TwJS}NrlVG}>xzRB zyN18OGvtz}?M^n0xzI8S`mUfvkqZ7OEMH`R*b|r=X6Wz~(>zz#O!V4&de%13Dah3$ zF70WujJ1n>i>^9-RoQmGkgQWQ-LCGj+p=IP5uK`NFRW%jUtG`R06mH;uD0adEQs`% zWpAAFr+Z3M{}h=#$G^>lVC7H_7AKBp_T360rd1cXE|#LkfZ__~%qtlC`A|_&FE1`o zpr`>0_D;~DLqIwQN+(5NK&%t3Jw2}l2KjQ8VocrL-R(u(!Fau0P=f~ldSm-340MJ? zD0ZjmnsSnCZmQs;>gt#4&|$HIa){XIOooP;{uR&P^x5F+>@uv+T*F)Pz5%k&XV7zm z+Y0J7uR!+Gp+@oh)cLLMkf<-EhQV%?RB+g-PCu@k0zzD>GhQNzI{#dIDWs)Vus0 z>g;?>L1Cntp>3>Q5F8vV#mGnU(D?!l%GVTSAH;wj(2ZDCsS(7*YBS);e+&-Za((K9 z)vZ{?^W@00X-6IH2rpk4p8m6+ZU_N=ni& zs*t*h{h1sxu9+%#vLNhbWPNUsn4~RNGd0G-WgDn^WWR2-8X5UDaf1<}rs3LMy`D*L z2*>{^V0c01^lR+)1&Ca@i6yz~ymH1N(;_)?*_?%Af|*(<;;oZhU~)sc@?~*$g(h^2 zUh>!2_g_hjLD1m7<8%-Tq>{Jvd%sn_YdtK!L_OIKVQDvHB^wn-p`_en=zIIZ>Ui+u zE*xaysfM%QMG3m+&=&=PAB8rtL+Mc=%KFvb4-F#I;O>(LJZl3fAYw#gpqiPlAmN%< z)aed67hR<@E&OhyA6cuZdfq-AEk#{1^?qZ4O0X!kNbu`t{-v8&)&O2uq+J~@7U~VS zxmJGoAlu&ljF)%R)wObbEIIU3xNg;I+06}k(wJ4nBtj|=^y5+q4#wEsYY}m6AOpxx z(EW|J%1#lmIw1f2$>>HAC;5ob%+uhwGn8 z)K6k*U(n(iAvPdCbLo+ED@yuO_UF%hG`SW9J?2ukxv*A4f5)7heEmW~a_u7m+22f0 z0`2oCd>YKVYs0nsxdilv{qYU8gSJJ(r4vVz5?E2R+@z56-=X3pc+RDbs@B&-_p9L# zr_r>))Nea;Rb2Q!uDdMFHayabpR}aQv`D}yMl@3kCxzdafrG>4I8Y2FUGFua^O78` zqxMq6GBLr}MC!Oz>7O@)<`ra2V*G{nv%R`b+pd?n6wQg>&D!7Zg^-s>F`}fSze3R} zbV-NvJ%6^nmmxybV<19}0v3cM01ttfm@3VLE3+#v()0QQJNS~62v!<*@Gt|G_s`L5 zMCAi0Q6*IyW^6g1_#Ul*zI%Zk6l0dQKd?cH2}qE2XC>b!0M6}-rjQy@W;1kK4yyV- zN$R7MAGS#yE)5b#yc^v7u1G^SX;YmSKQNdcGe9hSaONbOI!|GD#WsVXcv|n}>AB%7 z7;I8b5`ijlKS;8Bz42lkRA?r(4sAM5%rqL#iUN0|ahZ~HfF{u%Vrc+&HajQ7_R!f4 z*rq>7vZbh4*G%~y=`Hb|5m4-KyA{7kZ++3oo#>D{F-A>8Gv|4^WX&i{+qs+A4=>z1 zN6r|;_q#D|zoy@rGrUT?5ev;^2sP#;(Pv$&p17-6krb0y>98)jtQx7raNo#{QKOet zQ)!I@j&X*WxD@|bK<&l`73NP!WRWCvztd2KLvOzQ?E(Y5VYb2cFf+FcC4k)f?0HyQ z?}Gi7>t(9JYlHRp9hbC4ALY?`qOfyxFIibw5%R`DhTGgt#oK_Wd*D@_oqGhOJYXm9 zFHk!>EmRu*!$M)~P*y{tV>)be75MN}Bf&4Cat^e|{)dh37Sy|c zX!O6u_5c5UMp8)Tj`PF2cMGEPo1&b#lnZ#UPZ!YmeMikA9zFSN7XN>qyq%*Mg*~<_ zG(2>B!-gv%yd=@y$J{Z+vK$bJbnR=9f5Z7x8`dBFr4O zC@v&iQ^1~0M7Cl^ZNy?~5Q@xie?u3GCO*0CdKyS8e?KS{tTd}CL)j*|m=x~EWsKKqEL5)fOnxjas`G|}De*;VvlxwSpG5<^8*}|it(8Gul8dM3<{ZU2HW?!ws zoPtd67^v5{>?`x@nUNWf@{K>V@oy?7nY2n?CEL{sLTk%}*acsN+-w^A|8ilDo4gA* zT_?n-Q#wz#?@04jqr*Z?|I+Obkj)DWSCp4Fyk6@**1u>n-}AoKc(FYz zG6mKy`{TAlqP%Q#&c_d+g4~Pc9fQ~R?}u3s^}4`S6np9(&iM$~HklLm4fJ+faO#4% zyKe*9>P#V)0K`PA2nFP-b^dj1Vnje%gKTs-mPv%;N_}?Ptl+_$N4`)D8%)Dk} zj>@ty3RGVy>2MHvX-}?}PWX)aWYCCk#k2Aw=O zN$&?rit$2(X_#&=5#;AZ3NJbIsb?=*PyB1${P9AvrT7 zr%;7w>UFKQVm|emi)U{`G*xi+eOAwnKy)ll8ZR7saYR_9_b|Bi(S4Cp3j%I=cJ-Cm ztK?|Ln(IOF0gRJFe2#?Plj>Fc4xEPt=vpPdnshj%rt#&Rn`Abj%m=+yf zCNg92D7p+iFm;F8_ML!id@lc7I{(}ckOV;X%Y)>B5@KCBr`wY%ut#`L9ubmRa6f@4 zMYtwxs<-}}ys*@vg#gMLpLj)2o8wqFP0>76F!By-tv3($-{{~<)^u_|{0TkZpTLOTi{4XEd~K zj|`=;HAX^8AKi^oPlZ@nV;}6hx`x+o0NA?ZShpYY9AY1wOZxl`89Lgt3(bW5knck> zqpklv3TPf{-HT}-qG>z0Nv8^D1t^Oo!K0XEO?I@ET-euAM@sR~BU*5gcrQsqc^(1e|bL=(hn%&7}n5!@xsU?^%xrPZ*5XBO-5-%h}^J{9TL4L_m77`_VGCf3dsX{6w z72p1b{rXBOg{)X3KQ%u7G|)P2*ixqY{W%dNMSV}=vuBg*eoS0PB$@sX`#P1vXY%T_ zU!7emXW$#r-T1OZEV}aApwC`kG%etaaDN}AWCVg8qs*s7*JE3wTl{s(p?JzZqT#bJ zrCc#NdByLt(tq{mjBEoF53#YIVH%GmcIe9@$nOPEN*U*SVLX@k33t&l;1Kr~G(&hXM z)xS35yW=qPG95%+GxYiMw~OtGv><6IBykulN}Q4wlarg-crF!m2Km_X=E2eFjpYJn zMw&2oFkt3VO3?03DqAMHSZTE{eXb&2gZfh+Y>&})RDgl~coJ69=p=;rr9o(m1i+4IKmCRF8<0P zG*>?mmjlmXu&Bu75TrAt!+K0c7Oj9%#LJZO<{TLb0%_n9zB(Wr6wKgl#_#Ox?%fON z>`u)evobwM2gjQHI&$2#^MXvEVd=!s2YTAvACpBD$72&7C@S4*BORR&QxR*CiK3op zK!~$romkqK|2v)wV#XSq&c@10>l)U{&MZ2_MBy$aB0M@dw6VSY^l3adC+C)4`DOtm zhV3tY=RzNRO182xfbQp{eC*RSld@e5;S!SVuCaaXLg|Ux$zxa>986cqi|azECGimKD1q+gWGF9m?Fh)^WfO9H!C{>tuVFcZt8pI-y(*-pW93c3E5~d7nNLcnA8ft zT+?>phWsY37evH!B@|6c=Tup!xVTgsowEGl<%ZHkc2wjdFOa4_hWYdu-y{3gfo&lA z8YV-Bl^mT23}sRA6h)#2NRVd=E5|z-M}@on@3K4HJami{E=654SyUn{T;lf=7YBzN z>Xqxujv5TJ$sc<$md6yMG5n&H+PYtpOh|zZMJA47Qu`%;>38?Hryu$Oh1I;1D~@>` z^yU=Ulc~5t>uWb;DRKLQVulIZhSdDx8fB1DH6}>gU0=hJRo0?X0ot7;jWo=2n&WV% z7H;;-WSBtAIe;OTS01=IYvo&iUOo{e@k5J_Q+*}ALo#U_OzG4|bbF*J0#+GLEMdvR7w7;MrkdCHZun#A5bK=47Kp}?7fT_%7 z32PIM<9kqbtf80arVo&QZAQlUNKaD7QbRkf>MvuC*UTEqf$bD?&py3z`ZHDS?UuDp z43U1>Zm6iHc+!b$N8K5=LGI%E4iP<|;p}qY%)gcR=r}^lM%d&lX_nd-{E@q117`%{ zUd!GTqwDrZGS8x{P(#q-t(B7ny4 zeil<1>+wHi9*ZhTrSkah!3TK~a$lt1q4lgBRp^+6K!&}X`z#{i6x5#iy}K|JTS#H{g`M_dD-!lv=GUnnpz zP?%hdi|OzKvC-95tg7DYQkX=ibxd-yP0dtNVxsN9%H5kLh4rl5bil6Qx)t{yKakO# z?1$eR+lh+KCh^(nRok2c(_Bi)49maNVMo2Cr3ILWz8VH}ECIvG@yUsb!&IJ-ZOg9@ zA|fJ5eD5>iJWn3VVpH%wc>wy(dTjRb*{PCAw*F$)+SEj5m%v4pP%?vy+zn#&d5_V} z*4oMLVFE`^TD}!DFnW!X1D4y9MF*XSc0#*l@?>0{iZ9Ma9pnhA{O!c^K>696_ZNhFU z`phq{VK-|f1`VNWeL}jgT;AN?j8;}&C2#@x)Izoc{Jv2u9!N@BmQBC1v!lbp(%ya~ zM=lD?$c(zTC~Umw7Y4b`%=GjF2!1ifL>&#^%mZVe=6m7b=BDcI{^w3`sTBG#_w6-Kdy|y8dAk#EkS)imHtqd71mD>>9)wT1 z!^CV8(dYjsweoe_=6ysK3x*v@yqNq6Vz()$&5=L(Q|F%ysyKy7SOqJ$0D7PVF7W0y z9I&@6*q6+jgR313Prdek>@g69%@kQS?i9=tfS657NqLrbdp5GYdv))@gZ-lebSP|c zdOWwbPg|A`Ew=0E__!%W8>~|B(6uSrjo8i2qP$6QDp4liH5H7EZYduAM3t}?5k5FL z1XXb+c_VeeEGMn_)n=wqmw`a^fg^S%p08=XwtRMR-n3r> z2Z;Jrp?1&m0ohay*W(9aZRK7QtdLHvW%QkaamFo$pvt)Ien~LK%x2H=9wrXX?R?Ye zk*ANQre@dGxl!?JK4EU|n%c7#V87T+ag&Sj-pdH)wf$pXlK-5Bi;JFKw)A%B{W93G z8BYlxJyMC0l9k1{E(Tf|0|97vd2^BzZz$}Lxd>E3Mj-Z%mHJkJi2|xD@Bqnri`p%< zKjbpchWuV41Yo}TT7@YHygZeZ{@$XJ(o!@(9MQ8q*O^I80Xf#@c6)EQD95U9vt+sRPXxia`y^c5^_Zp+_TcWH*5#cUrE)9 za9EpRqw}*sP-T|@(z}@=NLa1RUjp=RFP*IL+KfP*cSzc_@@{@Jz7+$~KJ>t$KQC(v zw~S?FL5kK=WXu{r_1Cf4<`P|SznwnY)N}<66%_}Y(JlV{&iXpCU+vlQRx)yk=Bhpa z?M=Lx`Y2&^dHN52PR^4G)!7WVf#;mn_V-m8e(!u{zdrMt z%H&qaI|{Uxt~n1CCg0^X+82DRYz~e!FlCeN-e1tYk>*S}Rmzf4FtEP|2P381bVPzG zJgd#sz99~dZh!ySSFfPKKZCgV_@H@pHc-)Ag_8P+Fi}D1OY^|*3AZ*kz`bt)qxU1wxwYKjV(XXlcOxhe^;i>DnLfei(ec2HMpTjS;75l!n+Ua(>M z>J?ZKe5Lt!fpXu))m4pvkbq!xb`~1~R!(1EUy=Cn7~uN^t;fD}Wiu09{`!Cg{jeJA zzPh?vHUH4MU|KN=v2%0t%U`&-ZH%r1r`;{l+#pX<

    E{8)$up4s!7uHE&4;Q_b)p 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

    s$Z`Io|ffL>0QCx2a&M!L0)$vY)JMxsG z<;BLMB}Zz$TrkesE-SBXR>H&0eF=$DbJ@9Z@0nP^M6tT2W_ORfjdh|5qYBSGi;(M& zf9uz-TBzKOHUW39^|+Xr%yHJzIk_B_Ln4^nA*wxUg`MxJn0Vt(#-&mi*HD~&U6fbVvA%PWynJDi>n8Vh;t0gUNN z@lkPDh`jKYxT$)Bu9wvdn-VGdZ~95sN224R7_q;6cYUDj=y~$Cy|?#TaA^JK1&){lxdk}f$s=B_iIL8 z^$h^MaGTm7m+$`|?k&TrT)*|v7ePQ#P?S{p0?nY6R5~LeML{wU& zOIo_Sq)T$rc?P=H{_TDK`@=b3&RG}NwYVnE$z;Co^E_kRs(QfHqdIG68GPUlvrT;@l?rKIR80j9 z^xlCr(b_5pNqqA&gl>Z5FTD)v&4tK!6HMr;a%pJqJn49hb>wyWw$KC_EHL$!FkUHk zGcxqBcrslW(R-=1WM;-8RK5HA(>G35P9`Q)?By4Y#S*A0R}KgcQWNhoW{`Lp49xCbh^gArK{V6>$?Vos_wtlJWT#>-I`VJS`gW^&AN}htJzwn@}8m5 zdgV_BgtJs@_1Tw};=l*69z}obRVB{Y(SDoHduPu)a%amsER&JdDBqLHB!B-rcng`CBS8EUnMb zM2Si2XYCf#N~&=n9(IsVhX-Wn_7~p^+YJ3Ge6$ zcTD3Lan=tmbpCGr*kq*bUL5wg=XSF-JM$%6D7Kx(*0M-J!@OeZ@WXy(iB=%Pb#9C3 zqJ&@weeQ^5-dW;G8pG$T38R9TiGw1&(y?sOq;TAE9?K!ie2vqiop=X_^geS~%@R}> zqHoUSj?~urB99bRq|SEm$|pQ*aQ};oV>=F)=(z825eLc6E0DZ(6PeAK$km{UYG0mP zWxMpcz%-#+KO(BHwc{C{_kovO=7N;SN!d{B?SM_VWwO*)-uBPceE8;hh&Q}a*dgo+ zR@Hv>-I>3SxqK(MFro}?`p;4tH^ize8sLjk9&Mb`Od*acXY{^Ubwbq7~aR}aNF(AwFc=OuKiE% zTsRA_=is=AXj>6i+;D=s`4c@FL%@e%j}x?tB^8onY^1>PA$+}feJ*RFvair-3rEzi zjx)UnhN$Tsf`^9kR+B&1MSm>|tdJsp^_)c`mfXbspQD0J7q;#ouR!A>h5hEuVTCRm z0%>OHEf)|c*ws)b_Y4+qdT;AtV!0`hpSI50WdVW@`jODMsDj*tmdk zPtg6>qxZ>M&wE~qDn_h&MHEj3$r{^gvlitPU3-3U`gNBA5t6BzRc{DAm7*etse-ow z4;!Y5Ah-a-*Ix6WI)@DBftxj(zt{Bjjg7B$;f*3V5p{Kbh<=yRC7kJ@->R{42J8!g z0ZeKh?-qWH&!d)zR>|ad{$9%2j@CH5e`;b`Uu{GVt71!X^y5cm0mf;&Vx+Twm{gi+ z-=nf%IaJW4@+w(!XIFcLa*FExMt02Oa|pxqwFNN&eBE)v_%^SDA)?#h_^p)oV5w^4 zK2fQ5`|iY{4kh^=wzzXyJq8}^th~$u0{yGGU5(lj5)$@&3BmDM_g^~GH}t_44?Wnd zT{qgwQF&DDWW((Ud;5Hcx-!iI{4bZD#|?~?X`D&M9IkP2d|)T{b~_lq-I%W6<&|1c z^5Ls+)q5kC&!_SoD+KUwxbu6eJW2*2MNR>8B#!UbNW3T9j?{udMK&s zW+G;2r{LW9<=PtvxlSJ6^^wm27{-F9(T;6S4vbQUOEi2aW0`mA_7;3m^yrS5!C4UG z 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 EACB091ONa4 diff --git a/enclave-manager/web/cypress/screenshots/enclaveList.cy.ts/Enclave List -- Can create and update an enclave (failed).png b/enclave-manager/web/cypress/screenshots/enclaveList.cy.ts/Enclave List -- Can create and update an enclave (failed).png deleted file mode 100644 index 53b821a7dcb77d4d84b0252e79f31318d4c08cee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97828 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

    B%KuNRGgP>h_j~g(WkyfRjzAs{E)vB_Lc< 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 diff --git a/enclave-manager/web/cypress/screenshots/enclaveList.cy.ts/Enclave List -- Can create and update an enclave -- after each hook (failed) (attempt 2).png b/enclave-manager/web/cypress/screenshots/enclaveList.cy.ts/Enclave List -- Can create and update an enclave -- after each hook (failed) (attempt 2).png deleted file mode 100644 index a1365b4a691ab29a41423e17e452b76bad8cf696..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100519 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%0AL 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�uHr(?5 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 Date: Wed, 14 Aug 2024 22:56:14 -0400 Subject: [PATCH 29/78] remove per hour for now --- .../file_layout/per_hour_file_layout.go | 27 ------------------- .../file_layout/per_hour_file_layout_test.go | 1 - 2 files changed, 28 deletions(-) delete mode 100644 engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go delete mode 100644 engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go deleted file mode 100644 index d2b350ec82..0000000000 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go +++ /dev/null @@ -1,27 +0,0 @@ -package file_layout - -import ( - "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock" - "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" - "time" -) - -type PerHourFileLayout struct { - clock logs_clock.LogsClock -} - -func NewPerHourFileLayout(clock logs_clock.LogsClock) *PerHourFileLayout { - return &PerHourFileLayout{clock: clock} -} - -func (phf *PerHourFileLayout) GetLogFileLayoutFormat() string { - return "" -} - -func (phf *PerHourFileLayout) GetLogFilePaths( - filesystem volume_filesystem.VolumeFilesystem, - retentionPeriod time.Duration, - retentionPeriodIntervals int, - enclaveUuid, serviceUuid string) ([]string, error) { - return []string{}, nil -} diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go deleted file mode 100644 index 334480543c..0000000000 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go +++ /dev/null @@ -1 +0,0 @@ -package file_layout From 8daf34d19e77472515f4525db9d4e0c7e98df824 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Wed, 14 Aug 2024 23:15:35 -0400 Subject: [PATCH 30/78] get test to pass --- .../file_layout/per_week_file_layout.go | 19 +++++++++---------- .../file_layout/per_week_file_layout_test.go | 4 ++-- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go index bddbbf3439..9e8a9bb393 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go @@ -36,9 +36,7 @@ func (pwf *PerWeekFileLayout) GetLogFileLayoutFormat() string { func (pwf *PerWeekFileLayout) GetLogFilePath(time time.Time, enclaveUuid, serviceUuid string) string { year, week := time.ISOWeek() - - formattedWeekNum := fmt.Sprintf("%02d", week) - return fmt.Sprintf(PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(year), formattedWeekNum, enclaveUuid, serviceUuid, volume_consts.Filetype) + return getLogFilePath(year, week, enclaveUuid, serviceUuid) } // TODO: adjust to support getting log file paths beyond retention period @@ -56,9 +54,7 @@ func (pwf *PerWeekFileLayout) GetLogFilePaths( firstWeekWithLogs := 0 for i := 0; i < retentionPeriodInWeeks; i++ { year, week := currentTime.Add(time.Duration(-i) * oneWeek).ISOWeek() - // %02d to format week num with leading zeros so 1-9 are converted to 01-09 for %V format - formattedWeekNum := fmt.Sprintf("%02d", week) - filePathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(year), formattedWeekNum, enclaveUuid, serviceUuid, volume_consts.Filetype) + filePathStr := getLogFilePath(year, week, enclaveUuid, serviceUuid) if _, err := filesystem.Stat(filePathStr); err == nil { paths = append(paths, filePathStr) firstWeekWithLogs = i @@ -74,8 +70,7 @@ func (pwf *PerWeekFileLayout) GetLogFilePaths( // scan for remaining files as far back as they exist for i := firstWeekWithLogs + 1; i < retentionPeriodInWeeks; i++ { year, week := currentTime.Add(time.Duration(-i) * oneWeek).ISOWeek() - formattedWeekNum := fmt.Sprintf("%02d", week) - filePathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(year), formattedWeekNum, enclaveUuid, serviceUuid, volume_consts.Filetype) + filePathStr := getLogFilePath(year, week, enclaveUuid, serviceUuid) if _, err := filesystem.Stat(filePathStr); err != nil { break } @@ -89,6 +84,10 @@ func (pwf *PerWeekFileLayout) GetLogFilePaths( } func DurationToWeeks(d time.Duration) int { - hoursInWeek := float64(7 * 24) // 7 days * 24 hours - return int(math.Round(d.Hours() / hoursInWeek)) + return int(math.Round(d.Hours() / float64(7*24))) +} + +func getLogFilePath(year, week int, enclaveUuid, serviceUuid string) string { + formattedWeekNum := fmt.Sprintf("%02d", week) + return fmt.Sprintf(PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(year), formattedWeekNum, enclaveUuid, serviceUuid, volume_consts.Filetype) } diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go index 1ff1d6da13..13aaa8711f 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go @@ -104,8 +104,8 @@ func TestGetLogFilePathsAcrossNewYearWith53Weeks(t *testing.T) { fileLayout := NewPerWeekFileLayout(currentTime) // According to ISOWeek, 2015 has 53 weeks - week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2015, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week53filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2015, 53, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2015, 51, 3).Now(), testEnclaveUuid, testUserService1Uuid) + week53filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2015, 52, 3).Now(), testEnclaveUuid, testUserService1Uuid) week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2016, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2016, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) week3filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2016, 3, 0).Now(), testEnclaveUuid, testUserService1Uuid) From 0b750053e8dad98b54b1db1c48297e54c8408152 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 15 Aug 2024 00:27:21 -0400 Subject: [PATCH 31/78] impl per week get log files beyond retention period --- .../file_layout/file_layout.go | 5 +- .../file_layout/per_week_file_layout.go | 40 +++++- .../file_layout/per_week_file_layout_test.go | 132 +++++++++++++++++- 3 files changed, 168 insertions(+), 9 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go index c6dd53aa15..40ca4369f6 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go @@ -6,7 +6,7 @@ import ( ) type LogFileLayout interface { - // GetLogFileLayoutFormat Returns a string representation the "format" that files are laid out in + // GetLogFileLayoutFormat returns a string representation the "format" that files are laid out in // Formats are composed: // - "/" - representing a nested directory // - "" - representing where an enclave uuid is inserted @@ -19,7 +19,8 @@ type LogFileLayout interface { GetLogFilePath(time time.Time, enclaveUuid, serviceUuid string) string // GetLogFilePaths retrieves a list of filepaths [filesystem] for [serviceUuid] in [enclaveUuid] - // If [retentionPeriodIntervals] is set to -1, retrieves all filepaths from the currentTime till [retentionPeriod] + // If [retentionPeriodIntervals] is set to -1, retrieves all filepaths from the currentTime till [retentionPeriod] in order // If [retentionPeriodIntervals] is positive, retrieves all filepaths within the range [currentTime - retentionPeriod] and [currentTime - (retentionPeriodIntervals) * retentionPeriod] + // Returned filepaths sorted from most recent to least recent GetLogFilePaths(filesystem volume_filesystem.VolumeFilesystem, retentionPeriod time.Duration, retentionPeriodIntervals int, enclaveUuid, serviceUuid string) ([]string, error) } diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go index 9e8a9bb393..7075f41b19 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go @@ -39,23 +39,33 @@ func (pwf *PerWeekFileLayout) GetLogFilePath(time time.Time, enclaveUuid, servic return getLogFilePath(year, week, enclaveUuid, serviceUuid) } -// TODO: adjust to support getting log file paths beyond retention period func (pwf *PerWeekFileLayout) GetLogFilePaths( filesystem volume_filesystem.VolumeFilesystem, retentionPeriod time.Duration, retentionPeriodIntervals int, enclaveUuid, serviceUuid string) ([]string, error) { var paths []string - currentTime := pwf.time.Now() - retentionPeriodInWeeks := DurationToWeeks(retentionPeriod) + if retentionPeriodIntervals < 0 { + return pwf.getLogFilePathsFromNowTillRetentionPeriod(filesystem, retentionPeriodInWeeks, enclaveUuid, serviceUuid) + } else { + paths = pwf.getLogFilePathsBeyondRetentionPeriod(filesystem, retentionPeriodInWeeks, retentionPeriodIntervals, enclaveUuid, serviceUuid) + } + + return paths, nil +} + +func (pwf *PerWeekFileLayout) getLogFilePathsFromNowTillRetentionPeriod(fs volume_filesystem.VolumeFilesystem, retentionPeriodInWeeks int, enclaveUuid, serviceUuid string) ([]string, error) { + var paths []string + currentTime := pwf.time.Now() + // scan for first existing log file firstWeekWithLogs := 0 for i := 0; i < retentionPeriodInWeeks; i++ { year, week := currentTime.Add(time.Duration(-i) * oneWeek).ISOWeek() filePathStr := getLogFilePath(year, week, enclaveUuid, serviceUuid) - if _, err := filesystem.Stat(filePathStr); err == nil { + if _, err := fs.Stat(filePathStr); err == nil { paths = append(paths, filePathStr) firstWeekWithLogs = i break @@ -67,11 +77,11 @@ func (pwf *PerWeekFileLayout) GetLogFilePaths( } } - // scan for remaining files as far back as they exist + // scan for remaining files as far back as they exist before the retention period for i := firstWeekWithLogs + 1; i < retentionPeriodInWeeks; i++ { year, week := currentTime.Add(time.Duration(-i) * oneWeek).ISOWeek() filePathStr := getLogFilePath(year, week, enclaveUuid, serviceUuid) - if _, err := filesystem.Stat(filePathStr); err != nil { + if _, err := fs.Stat(filePathStr); err != nil { break } paths = append(paths, filePathStr) @@ -83,6 +93,24 @@ func (pwf *PerWeekFileLayout) GetLogFilePaths( return paths, nil } +func (pwf *PerWeekFileLayout) getLogFilePathsBeyondRetentionPeriod(fs volume_filesystem.VolumeFilesystem, retentionPeriodInWeeks int, retentionPeriodIntervals int, enclaveUuid, serviceUuid string) []string { + var paths []string + currentTime := pwf.time.Now() + + // scan for log files just beyond the retention period + for i := 0; i < retentionPeriodIntervals; i++ { + numWeeksToGoBack := retentionPeriodInWeeks + i + year, weekToRemove := currentTime.Add(time.Duration(-numWeeksToGoBack) * oneWeek).ISOWeek() + filePathStr := getLogFilePath(year, weekToRemove, enclaveUuid, serviceUuid) + if _, err := fs.Stat(filePathStr); err != nil { + continue + } + paths = append(paths, filePathStr) + } + + return paths +} + func DurationToWeeks(d time.Duration) int { return int(math.Round(d.Hours() / float64(7*24))) } diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go index 13aaa8711f..1c5b14bbde 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go @@ -221,7 +221,6 @@ func TestGetLogFilePathsReturnsCorrectPathsIfWeeksMissingInBetween(t *testing.T) } func TestGetLogFilePathsReturnsCorrectPathsIfCurrentWeekHasNoLogsYet(t *testing.T) { - filesystem := volume_filesystem.NewMockedVolumeFilesystem() currentWeek := 3 @@ -251,3 +250,134 @@ func TestGetLogFilePathsReturnsCorrectPathsIfCurrentWeekHasNoLogsYet(t *testing. require.Equal(t, filePath, logFilePaths[i]) } } + +func TestGetLogFilePathsOneIntervalBeyondRetentionPeriod(t *testing.T) { + filesystem := volume_filesystem.NewMockedVolumeFilesystem() + + mockTime := logs_clock.NewMockLogsClock(2023, 2, defaultDay) + fileLayout := NewPerWeekFileLayout(mockTime) + + week49filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 49, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 50, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 51, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) + + _, _ = filesystem.Create(week49filepath) + _, _ = filesystem.Create(week50filepath) + _, _ = filesystem.Create(week51filepath) + _, _ = filesystem.Create(week52filepath) + _, _ = filesystem.Create(week1filepath) + _, _ = filesystem.Create(week2filepath) + + retentionPeriod := 5 * oneWeekInHours + logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, 1, testEnclaveUuid, testUserService1Uuid) + require.NoError(t, err) + require.Len(t, logFilePaths, 1) + require.Equal(t, logFilePaths[0], week49filepath) +} + +func TestGetLogFilePathsTwoIntervalBeyondRetentionPeriod(t *testing.T) { + filesystem := volume_filesystem.NewMockedVolumeFilesystem() + + mockTime := logs_clock.NewMockLogsClock(2023, 2, defaultDay) + fileLayout := NewPerWeekFileLayout(mockTime) + + week48filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 48, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week49filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 49, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 50, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 51, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) + + _, _ = filesystem.Create(week48filepath) + _, _ = filesystem.Create(week49filepath) + _, _ = filesystem.Create(week50filepath) + _, _ = filesystem.Create(week51filepath) + _, _ = filesystem.Create(week52filepath) + _, _ = filesystem.Create(week1filepath) + _, _ = filesystem.Create(week2filepath) + + expectedLogFilePaths := []string{ + week49filepath, + week48filepath, + } + + retentionPeriod := 5 * oneWeekInHours + logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, 2, testEnclaveUuid, testUserService1Uuid) + + require.NoError(t, err) + require.Len(t, logFilePaths, 2) + require.Equal(t, len(expectedLogFilePaths), len(logFilePaths)) + for i, filePath := range expectedLogFilePaths { + require.Equal(t, filePath, logFilePaths[i]) + } +} + +func TestGetLogFilePathsWithNoPathsBeyondRetentionPeriod(t *testing.T) { + filesystem := volume_filesystem.NewMockedVolumeFilesystem() + + mockTime := logs_clock.NewMockLogsClock(2023, 2, defaultDay) + fileLayout := NewPerWeekFileLayout(mockTime) + + week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 50, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 51, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) + + _, _ = filesystem.Create(week50filepath) + _, _ = filesystem.Create(week51filepath) + _, _ = filesystem.Create(week52filepath) + _, _ = filesystem.Create(week1filepath) + _, _ = filesystem.Create(week2filepath) + + retentionPeriod := 5 * oneWeekInHours + logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, 1, testEnclaveUuid, testUserService1Uuid) + + require.NoError(t, err) + require.Len(t, logFilePaths, 0) +} + +func TestGetLogFilePathsWithMissingPathBetweenIntervals(t *testing.T) { + filesystem := volume_filesystem.NewMockedVolumeFilesystem() + + mockTime := logs_clock.NewMockLogsClock(2023, 2, defaultDay) + fileLayout := NewPerWeekFileLayout(mockTime) + + week47filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 48, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week49filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 49, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 50, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 51, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) + + _, _ = filesystem.Create(week47filepath) + // 48 is missing + _, _ = filesystem.Create(week49filepath) + _, _ = filesystem.Create(week50filepath) + _, _ = filesystem.Create(week50filepath) + _, _ = filesystem.Create(week51filepath) + _, _ = filesystem.Create(week52filepath) + _, _ = filesystem.Create(week1filepath) + _, _ = filesystem.Create(week2filepath) + + expectedLogFilePaths := []string{ + week49filepath, + week47filepath, + } + + retentionPeriod := 5 * oneWeekInHours + // the expected behavior is return all filepaths, even if some are missing + logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, 3, testEnclaveUuid, testUserService1Uuid) + + require.NoError(t, err) + require.Len(t, logFilePaths, 2) + require.Equal(t, len(expectedLogFilePaths), len(logFilePaths)) + for i, filePath := range expectedLogFilePaths { + require.Equal(t, filePath, logFilePaths[i]) + } +} From b1919255303801de623b9af128d5fbd90418f7c5 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 15 Aug 2024 10:20:42 -0400 Subject: [PATCH 32/78] refactor log file manager to use file layout --- .../log_file_manager/log_file_manager.go | 28 ++++++++++++++++--- .../log_file_manager/log_file_manager_test.go | 16 +++++++---- engine/server/engine/main.go | 4 ++- 3 files changed, 38 insertions(+), 10 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go index 3edb91ad73..9b1d521693 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go @@ -7,6 +7,7 @@ import ( "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/enclave" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/uuid_generator" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" @@ -28,6 +29,8 @@ type LogFileManager struct { filesystem volume_filesystem.VolumeFilesystem + fileLayout file_layout.LogFileLayout + time logs_clock.LogsClock logRetentionPeriodInWeeks int @@ -36,11 +39,13 @@ type LogFileManager struct { func NewLogFileManager( kurtosisBackend backend_interface.KurtosisBackend, filesystem volume_filesystem.VolumeFilesystem, + fileLayout file_layout.LogFileLayout, time logs_clock.LogsClock, logRetentionPeriodInWeeks int) *LogFileManager { return &LogFileManager{ kurtosisBackend: kurtosisBackend, filesystem: filesystem, + fileLayout: fileLayout, time: time, logRetentionPeriodInWeeks: logRetentionPeriodInWeeks, } @@ -51,12 +56,12 @@ func (manager *LogFileManager) StartLogFileManagement(ctx context.Context) { // Schedule thread for removing log files beyond retention period go func() { logrus.Debugf("Scheduling log removal for log retention every '%v' hours...", volume_consts.RemoveLogsWaitHours) - manager.RemoveLogsBeyondRetentionPeriod() + manager.RemoveLogsBeyondRetentionPeriod(ctx) logRemovalTicker := time.NewTicker(volume_consts.RemoveLogsWaitHours) for range logRemovalTicker.C { logrus.Debug("Attempting to remove old log file paths...") - manager.RemoveLogsBeyondRetentionPeriod() + manager.RemoveLogsBeyondRetentionPeriod(ctx) } }() @@ -127,7 +132,7 @@ func (manager *LogFileManager) CreateLogFiles(ctx context.Context) error { } // RemoveLogsBeyondRetentionPeriod implements the Job cron interface. It removes logs a week older than the log retention period. -func (manager *LogFileManager) RemoveLogsBeyondRetentionPeriod() { +func (manager *LogFileManager) RemoveLogsBeyondRetentionPeriod(ctx context.Context) { // compute the next oldest week year, weekToRemove := manager.time.Now().Add(time.Duration(-manager.logRetentionPeriodInWeeks) * oneWeek).ISOWeek() @@ -136,6 +141,21 @@ func (manager *LogFileManager) RemoveLogsBeyondRetentionPeriod() { // filepathsToRemove, err := manager.layout.GetLogFilePaths(manager.filesystem, retentionPeriod, 1, enclaveUuid, serviceUuid) // for _, path := range filepaths { manager.filesystem.Remove(file) } oldLogsDirPath := getLogsDirPathForWeek(year, weekToRemove) + // + //var pathsToRemove []string + //enclaveToServicesMap, err := manager.getEnclaveAndServiceInfo(ctx) + //if err != nil { + // // already wrapped with propagate + // return err + //} + //for enclaveUuid, serviceRegistrations := range enclaveToServicesMap { + // for _, serviceRegistration := range serviceRegistrations { + // retentionPeriod := manager.logRetentionPeriodInWeeks * oneWeek + // oldLogFiles := manager.fileLayout.GetLogFilePaths(manager.filesystem, retentionPeriod, 1, enclaveUuid, serviceRegistration.GetName()) + // + // } + //} + if err := manager.filesystem.RemoveAll(oldLogsDirPath); err != nil { logrus.Warnf("An error occurred removing old logs at the following path '%v': %v\n", oldLogsDirPath, err) } @@ -189,8 +209,8 @@ func (manager *LogFileManager) getEnclaveAndServiceInfo(ctx context.Context) (ma func (manager *LogFileManager) createLogFileIdempotently(logFilePath string) error { var err error if _, err = manager.filesystem.Stat(logFilePath); os.IsNotExist(err) { - return stacktrace.Propagate(err, "An error occurred creating a log file path at '%v'", logFilePath) if _, err = manager.filesystem.Create(logFilePath); err != nil { + return stacktrace.Propagate(err, "An error occurred creating a log file path at '%v'", logFilePath) } logrus.Tracef("Created log file: '%v'", logFilePath) return nil diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go index b5c96da757..ca9e2e8b3b 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go @@ -8,6 +8,7 @@ import ( "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/port_spec" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/uuid_generator" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" "github.com/stretchr/testify/require" @@ -25,8 +26,10 @@ const ( ) func TestRemoveLogsBeyondRetentionPeriod(t *testing.T) { + ctx := context.Background() mockKurtosisBackend := backend_interface.NewMockKurtosisBackend(t) mockTime := logs_clock.NewMockLogsClock(2023, 2, defaultDay) + fileLayout := file_layout.NewPerWeekFileLayout(mockTime) // setup filesystem mockFs := volume_filesystem.NewMockedVolumeFilesystem() @@ -44,8 +47,8 @@ func TestRemoveLogsBeyondRetentionPeriod(t *testing.T) { _, _ = mockFs.Create(week1filepath) _, _ = mockFs.Create(week2filepath) - logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, mockTime, 5) - logFileManager.RemoveLogsBeyondRetentionPeriod() // should remove week 49 logs + logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, 5) + logFileManager.RemoveLogsBeyondRetentionPeriod(ctx) // should remove week 49 logs _, err := mockFs.Stat(week49filepath) require.Error(t, err) @@ -55,6 +58,7 @@ func TestRemoveLogsBeyondRetentionPeriod(t *testing.T) { func TestRemoveEnclaveLogs(t *testing.T) { mockKurtosisBackend := backend_interface.NewMockKurtosisBackend(t) mockTime := logs_clock.NewMockLogsClock(2022, 52, defaultDay) + fileLayout := file_layout.NewPerWeekFileLayout(mockTime) // setup filesystem mockFs := volume_filesystem.NewMockedVolumeFilesystem() @@ -69,7 +73,7 @@ func TestRemoveEnclaveLogs(t *testing.T) { _, _ = mockFs.Create(week52filepath) _, _ = mockFs.Create(week52filepathDiffService) - logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, mockTime, 5) + logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, 5) err := logFileManager.RemoveEnclaveLogs(testEnclaveUuid) // should remove only all log files for enclave one require.NoError(t, err) @@ -93,6 +97,7 @@ func TestRemoveEnclaveLogs(t *testing.T) { func TestRemoveAllLogs(t *testing.T) { mockKurtosisBackend := backend_interface.NewMockKurtosisBackend(t) mockTime := logs_clock.NewMockLogsClock(2022, 52, defaultDay) + fileLayout := file_layout.NewPerWeekFileLayout(mockTime) // setup filesystem mockFs := volume_filesystem.NewMockedVolumeFilesystem() @@ -107,7 +112,7 @@ func TestRemoveAllLogs(t *testing.T) { _, _ = mockFs.Create(week52filepath) _, _ = mockFs.Create(week52filepathDiffService) - logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, mockTime, 5) + logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, 5) err := logFileManager.RemoveAllLogs() require.NoError(t, err) @@ -132,6 +137,7 @@ func TestRemoveAllLogs(t *testing.T) { func TestCreateLogFiles(t *testing.T) { mockTime := logs_clock.NewMockLogsClock(2022, 52, defaultDay) mockFs := volume_filesystem.NewMockedVolumeFilesystem() + fileLayout := file_layout.NewPerWeekFileLayout(mockTime) // setup kurtosis backend ctx := context.Background() @@ -165,7 +171,7 @@ func TestCreateLogFiles(t *testing.T) { expectedServiceNameFilePath := getFilepathStr(2022, 52, testEnclaveUuid, testUserService1Name) expectedServiceShortUuidFilePath := getFilepathStr(2022, 52, testEnclaveUuid, uuid_generator.ShortenedUUIDString(testUserService1Uuid)) - logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, mockTime, 5) + logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, 5) err := logFileManager.CreateLogFiles(ctx) require.NoError(t, err) diff --git a/engine/server/engine/main.go b/engine/server/engine/main.go index 5698808c01..8206befbe4 100644 --- a/engine/server/engine/main.go +++ b/engine/server/engine/main.go @@ -8,6 +8,7 @@ package main import ( "context" "fmt" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout" "io/fs" "net" "net/http" @@ -180,7 +181,8 @@ func runMain() error { // TODO: Move log file management into LogsDatabaseClient osFs := volume_filesystem.NewOsVolumeFilesystem() realTime := logs_clock.NewRealClock() - logFileManager := log_file_manager.NewLogFileManager(kurtosisBackend, osFs, realTime, volume_consts.LogRetentionPeriodInWeeks) + perWeekFileLayout := file_layout.NewPerWeekFileLayout(realTime) + logFileManager := log_file_manager.NewLogFileManager(kurtosisBackend, osFs, perWeekFileLayout, realTime, volume_consts.LogRetentionPeriodInWeeks) logFileManager.StartLogFileManagement(ctx) enclaveManager, err := getEnclaveManager( From c6bd4f7235f5b18268a1e049dc9a77347e6fbf85 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 15 Aug 2024 10:55:42 -0400 Subject: [PATCH 33/78] use file layout for removing logs beyond retention period --- .../log_file_manager/log_file_manager.go | 74 ++++++++++++------- .../log_file_manager/log_file_manager_test.go | 42 ++++++----- 2 files changed, 72 insertions(+), 44 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go index 9b1d521693..b81095f3c1 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go @@ -133,33 +133,55 @@ func (manager *LogFileManager) CreateLogFiles(ctx context.Context) error { // RemoveLogsBeyondRetentionPeriod implements the Job cron interface. It removes logs a week older than the log retention period. func (manager *LogFileManager) RemoveLogsBeyondRetentionPeriod(ctx context.Context) { - // compute the next oldest week - year, weekToRemove := manager.time.Now().Add(time.Duration(-manager.logRetentionPeriodInWeeks) * oneWeek).ISOWeek() - - // remove directory for that week - // enclaveToServiceMaps := getEnclaveAndServiceInfo) - // filepathsToRemove, err := manager.layout.GetLogFilePaths(manager.filesystem, retentionPeriod, 1, enclaveUuid, serviceUuid) - // for _, path := range filepaths { manager.filesystem.Remove(file) } - oldLogsDirPath := getLogsDirPathForWeek(year, weekToRemove) - // - //var pathsToRemove []string - //enclaveToServicesMap, err := manager.getEnclaveAndServiceInfo(ctx) - //if err != nil { - // // already wrapped with propagate - // return err - //} - //for enclaveUuid, serviceRegistrations := range enclaveToServicesMap { - // for _, serviceRegistration := range serviceRegistrations { - // retentionPeriod := manager.logRetentionPeriodInWeeks * oneWeek - // oldLogFiles := manager.fileLayout.GetLogFilePaths(manager.filesystem, retentionPeriod, 1, enclaveUuid, serviceRegistration.GetName()) - // - // } - //} - - if err := manager.filesystem.RemoveAll(oldLogsDirPath); err != nil { - logrus.Warnf("An error occurred removing old logs at the following path '%v': %v\n", oldLogsDirPath, err) + var pathsToRemove []string + enclaveToServicesMap, err := manager.getEnclaveAndServiceInfo(ctx) + if err != nil { + logrus.Errorf("An error occurred getting enclave and service info while removing logs beyond retention: %v", err) + return + } + for enclaveUuid, serviceRegistrations := range enclaveToServicesMap { + for _, serviceRegistration := range serviceRegistrations { + serviceUuidStr := string(serviceRegistration.GetUUID()) + serviceNameStr := string(serviceRegistration.GetName()) + serviceShortUuidStr := uuid_generator.ShortenedUUIDString(serviceUuidStr) + + retentionPeriod := time.Duration(manager.logRetentionPeriodInWeeks) * oneWeek + oldServiceLogFilesByUuid, err := manager.fileLayout.GetLogFilePaths(manager.filesystem, retentionPeriod, 1, string(enclaveUuid), serviceUuidStr) + if err != nil { + logrus.Errorf("An error occurred getting log file paths for service '%v' in enclave '%v' logs beyond retention: %v", serviceUuidStr, enclaveUuid, err) + } else { + pathsToRemove = append(pathsToRemove, oldServiceLogFilesByUuid...) + } + + oldServiceLogFilesByName, err := manager.fileLayout.GetLogFilePaths(manager.filesystem, retentionPeriod, 1, string(enclaveUuid), serviceNameStr) + if err != nil { + logrus.Errorf("An error occurred getting log file paths for service '%v' in enclave '%v' logs beyond retention: %v", serviceNameStr, enclaveUuid, err) + } else { + pathsToRemove = append(pathsToRemove, oldServiceLogFilesByName...) + } + + oldServiceLogFilesByShortUuid, err := manager.fileLayout.GetLogFilePaths(manager.filesystem, retentionPeriod, 1, string(enclaveUuid), serviceShortUuidStr) + if err != nil { + logrus.Errorf("An error occurred getting log file paths for service '%v' in enclave '%v' logs beyond retention: %v", serviceShortUuidStr, enclaveUuid, err) + } else { + pathsToRemove = append(pathsToRemove, oldServiceLogFilesByShortUuid...) + } + } + } + + successfullyRemovedLogFiles := []string{} + failedToRemoveLogFiles := []string{} + for _, pathToRemove := range pathsToRemove { + if err := manager.filesystem.Remove(pathToRemove); err != nil { + logrus.Warnf("An error occurred removing old log file at the following path '%v': %v\n", pathsToRemove, err) + failedToRemoveLogFiles = append(failedToRemoveLogFiles, pathToRemove) + } + successfullyRemovedLogFiles = append(successfullyRemovedLogFiles, pathToRemove) + } + logrus.Debugf("Successfully removed the following logs beyond retention period at the following path: '%v'", successfullyRemovedLogFiles) + if len(failedToRemoveLogFiles) > 0 { + logrus.Errorf("Failed to remove the following logs beyond retention period at the following path: '%v'", failedToRemoveLogFiles) } - logrus.Debugf("Removed logs beyond retention period at the following path: '%v'", oldLogsDirPath) } func (manager *LogFileManager) RemoveAllLogs() error { diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go index ca9e2e8b3b..0a57c03efd 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go @@ -27,10 +27,11 @@ const ( func TestRemoveLogsBeyondRetentionPeriod(t *testing.T) { ctx := context.Background() - mockKurtosisBackend := backend_interface.NewMockKurtosisBackend(t) mockTime := logs_clock.NewMockLogsClock(2023, 2, defaultDay) fileLayout := file_layout.NewPerWeekFileLayout(mockTime) + mockKurtosisBackend := getMockedKurtosisBackendWithEnclavesAndServices(ctx, t, mockTime) + // setup filesystem mockFs := volume_filesystem.NewMockedVolumeFilesystem() week49filepath := getFilepathStr(2022, 49, testEnclaveUuid, testUserService1Uuid) @@ -141,6 +142,27 @@ func TestCreateLogFiles(t *testing.T) { // setup kurtosis backend ctx := context.Background() + mockKurtosisBackend := getMockedKurtosisBackendWithEnclavesAndServices(ctx, t, mockTime) + + expectedServiceUuidFilePath := getFilepathStr(2022, 52, testEnclaveUuid, testUserService1Uuid) + expectedServiceNameFilePath := getFilepathStr(2022, 52, testEnclaveUuid, testUserService1Name) + expectedServiceShortUuidFilePath := getFilepathStr(2022, 52, testEnclaveUuid, uuid_generator.ShortenedUUIDString(testUserService1Uuid)) + + logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, 5) + err := logFileManager.CreateLogFiles(ctx) + require.NoError(t, err) + + _, err = mockFs.Stat(expectedServiceUuidFilePath) + require.NoError(t, err) + + _, err = mockFs.Stat(expectedServiceNameFilePath) + require.NoError(t, err) + + _, err = mockFs.Stat(expectedServiceShortUuidFilePath) + require.NoError(t, err) +} + +func getMockedKurtosisBackendWithEnclavesAndServices(ctx context.Context, t *testing.T, mockTime logs_clock.LogsClock) *backend_interface.MockKurtosisBackend { mockKurtosisBackend := backend_interface.NewMockKurtosisBackend(t) // mock enclave @@ -166,21 +188,5 @@ func TestCreateLogFiles(t *testing.T) { EXPECT(). GetUserServices(ctx, enclaveUuid, &service.ServiceFilters{Names: nil, UUIDs: nil, Statuses: nil}). Return(servicesMap, nil) - - expectedServiceUuidFilePath := getFilepathStr(2022, 52, testEnclaveUuid, testUserService1Uuid) - expectedServiceNameFilePath := getFilepathStr(2022, 52, testEnclaveUuid, testUserService1Name) - expectedServiceShortUuidFilePath := getFilepathStr(2022, 52, testEnclaveUuid, uuid_generator.ShortenedUUIDString(testUserService1Uuid)) - - logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, 5) - err := logFileManager.CreateLogFiles(ctx) - require.NoError(t, err) - - _, err = mockFs.Stat(expectedServiceUuidFilePath) - require.NoError(t, err) - - _, err = mockFs.Stat(expectedServiceNameFilePath) - require.NoError(t, err) - - _, err = mockFs.Stat(expectedServiceShortUuidFilePath) - require.NoError(t, err) + return mockKurtosisBackend } From bf45ed2698da5fc4e0809c33a3435d98e25f8047 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 15 Aug 2024 11:06:08 -0400 Subject: [PATCH 34/78] remove getFilepathStr function --- .../file_layout/per_week_file_layout.go | 2 ++ .../log_file_manager/log_file_manager.go | 14 ++------ .../log_file_manager/log_file_manager_test.go | 34 +++++++++---------- 3 files changed, 22 insertions(+), 28 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go index 7075f41b19..13fa807d0b 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go @@ -31,6 +31,8 @@ func NewPerWeekFileLayout(time logs_clock.LogsClock) *PerWeekFileLayout { } func (pwf *PerWeekFileLayout) GetLogFileLayoutFormat() string { + // Right now this format is specifically made for Vector Logs Aggregators format + // This wil be used my Vector LogsAggregator to determine the path to output to return "/var/log/kurtosis/%%Y/%%V/{{ enclave_uuid }}/{{ service_uuid }}.json" } diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go index b81095f3c1..9338df5d31 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go @@ -95,8 +95,6 @@ func (manager *LogFileManager) StartLogFileManagement(ctx context.Context) { func (manager *LogFileManager) CreateLogFiles(ctx context.Context) error { var err error - year, week := manager.time.Now().ISOWeek() - enclaveToServicesMap, err := manager.getEnclaveAndServiceInfo(ctx) if err != nil { // already wrapped with propagate @@ -109,18 +107,18 @@ func (manager *LogFileManager) CreateLogFiles(ctx context.Context) error { serviceNameStr := string(serviceRegistration.GetName()) serviceShortUuidStr := uuid_generator.ShortenedUUIDString(serviceUuidStr) - serviceUuidFilePathStr := getFilepathStr(year, week, string(enclaveUuid), serviceUuidStr) + serviceUuidFilePathStr := manager.fileLayout.GetLogFilePath(manager.time.Now(), string(enclaveUuid), serviceUuidStr) if err = manager.createLogFileIdempotently(serviceUuidFilePathStr); err != nil { return err } - serviceNameFilePathStr := getFilepathStr(year, week, string(enclaveUuid), serviceNameStr) + serviceNameFilePathStr := manager.fileLayout.GetLogFilePath(manager.time.Now(), string(enclaveUuid), serviceNameStr) if err = manager.createSymlinkLogFile(serviceUuidFilePathStr, serviceNameFilePathStr); err != nil { return err } logrus.Tracef("Created symlinked log file: '%v'", serviceNameFilePathStr) - serviceShortUuidFilePathStr := getFilepathStr(year, week, string(enclaveUuid), serviceShortUuidStr) + serviceShortUuidFilePathStr := manager.fileLayout.GetLogFilePath(manager.time.Now(), string(enclaveUuid), serviceShortUuidStr) if err = manager.createSymlinkLogFile(serviceUuidFilePathStr, serviceShortUuidFilePathStr); err != nil { return err } @@ -255,12 +253,6 @@ func (manager *LogFileManager) createSymlinkLogFile(targetLogFilePath, symlinkLo return nil } -// creates a filepath of format //year/week//serviceIdentifier. -func getFilepathStr(year, week int, enclaveUuid, serviceIdentifier string) string { - formattedWeekNum := fmt.Sprintf("%02d", week) - return fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(year), formattedWeekNum, enclaveUuid, serviceIdentifier, volume_consts.Filetype) -} - // creates a directory path of format //year/week// func getEnclaveLogsDirPath(year, week int, enclaveUuid string) string { logsDirPathForYearAndWeek := getLogsDirPathForWeek(year, week) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go index 0a57c03efd..5d502597c5 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go @@ -34,12 +34,12 @@ func TestRemoveLogsBeyondRetentionPeriod(t *testing.T) { // setup filesystem mockFs := volume_filesystem.NewMockedVolumeFilesystem() - week49filepath := getFilepathStr(2022, 49, testEnclaveUuid, testUserService1Uuid) - week50filepath := getFilepathStr(2022, 50, testEnclaveUuid, testUserService1Uuid) - week51filepath := getFilepathStr(2022, 51, testEnclaveUuid, testUserService1Uuid) - week52filepath := getFilepathStr(2022, 52, testEnclaveUuid, testUserService1Uuid) - week1filepath := getFilepathStr(2023, 1, testEnclaveUuid, testUserService1Uuid) - week2filepath := getFilepathStr(2023, 2, testEnclaveUuid, testUserService1Uuid) + week49filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 49, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 50, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 51, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = mockFs.Create(week49filepath) _, _ = mockFs.Create(week50filepath) @@ -64,10 +64,10 @@ func TestRemoveEnclaveLogs(t *testing.T) { // setup filesystem mockFs := volume_filesystem.NewMockedVolumeFilesystem() - week51filepath := getFilepathStr(2022, 51, testEnclaveUuid, testUserService1Uuid) - week52filepathDiffEnclave := getFilepathStr(2022, 52, "enclaveOne", "serviceTwo") - week52filepath := getFilepathStr(2022, 52, testEnclaveUuid, testUserService1Uuid) - week52filepathDiffService := getFilepathStr(2022, 52, testEnclaveUuid, "serviceThree") + week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 51, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepathDiffEnclave := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0).Now(), "enclaveOne", "serviceTwo") + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepathDiffService := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0).Now(), testEnclaveUuid, "serviceThree") _, _ = mockFs.Create(week51filepath) _, _ = mockFs.Create(week52filepathDiffEnclave) @@ -103,10 +103,10 @@ func TestRemoveAllLogs(t *testing.T) { // setup filesystem mockFs := volume_filesystem.NewMockedVolumeFilesystem() - week51filepath := getFilepathStr(2022, 51, testEnclaveUuid, testUserService1Uuid) - week52filepathDiffEnclave := getFilepathStr(2022, 52, "enclaveOne", "serviceTwo") - week52filepath := getFilepathStr(2022, 52, testEnclaveUuid, testUserService1Uuid) - week52filepathDiffService := getFilepathStr(2022, 52, testEnclaveUuid, "serviceThree") + week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 51, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepathDiffEnclave := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0).Now(), "enclaveOne", "serviceTwo") + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepathDiffService := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0).Now(), testEnclaveUuid, "serviceThree") _, _ = mockFs.Create(week51filepath) _, _ = mockFs.Create(week52filepathDiffEnclave) @@ -144,9 +144,9 @@ func TestCreateLogFiles(t *testing.T) { ctx := context.Background() mockKurtosisBackend := getMockedKurtosisBackendWithEnclavesAndServices(ctx, t, mockTime) - expectedServiceUuidFilePath := getFilepathStr(2022, 52, testEnclaveUuid, testUserService1Uuid) - expectedServiceNameFilePath := getFilepathStr(2022, 52, testEnclaveUuid, testUserService1Name) - expectedServiceShortUuidFilePath := getFilepathStr(2022, 52, testEnclaveUuid, uuid_generator.ShortenedUUIDString(testUserService1Uuid)) + expectedServiceUuidFilePath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) + expectedServiceNameFilePath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Name) + expectedServiceShortUuidFilePath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0).Now(), testEnclaveUuid, uuid_generator.ShortenedUUIDString(testUserService1Uuid)) logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, 5) err := logFileManager.CreateLogFiles(ctx) From f589e5265d5b7e8d432d619909dbb2ad0793a639 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 15 Aug 2024 11:34:59 -0400 Subject: [PATCH 35/78] move log file manager inside logs db client --- .../kurtosis_backend_logs_database_client.go | 14 ++++++++++ .../persistent_volume_logs_database_client.go | 17 +++++++++++ ...istent_volume_logs_database_client_test.go | 8 +++++- .../centralized_logs/logs_database_client.go | 6 ++++ .../engine/enclave_manager/enclave_manager.go | 19 +++++++------ engine/server/engine/main.go | 28 +++++++------------ .../server/engine_connect_server_service.go | 7 +---- .../engine/server/websocket_api_handler.go | 3 -- 8 files changed, 65 insertions(+), 37 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/kurtosis_backend/kurtosis_backend_logs_database_client.go b/engine/server/engine/centralized_logs/client_implementations/kurtosis_backend/kurtosis_backend_logs_database_client.go index c9e44d6ab3..ec6cdde311 100644 --- a/engine/server/engine/centralized_logs/client_implementations/kurtosis_backend/kurtosis_backend_logs_database_client.go +++ b/engine/server/engine/centralized_logs/client_implementations/kurtosis_backend/kurtosis_backend_logs_database_client.go @@ -156,6 +156,20 @@ func (client *kurtosisBackendLogsDatabaseClient) FilterExistingServiceUuids( return filteredServiceUuidsSet, nil } +func (client *kurtosisBackendLogsDatabaseClient) StartLogFileManagement(ctx context.Context) { + // no log file management needs to be done for this logs db client +} + +func (client *kurtosisBackendLogsDatabaseClient) RemoveEnclaveLogs(enclaveUuid string) error { + // no log file management needs to be done for this logs db client + return nil +} + +func (client *kurtosisBackendLogsDatabaseClient) RemoveAllLogs() error { + // no log file management needs to be done for this logs db client + return nil +} + // ==================================================================================================== // // Private helper functions diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client.go index 6880e8db3e..67bd58b6bb 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client.go @@ -5,6 +5,7 @@ import ( "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/enclave" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/logline" @@ -22,17 +23,21 @@ type persistentVolumeLogsDatabaseClient struct { filesystem volume_filesystem.VolumeFilesystem + logFileManager *log_file_manager.LogFileManager + streamStrategy stream_logs_strategy.StreamLogsStrategy } func NewPersistentVolumeLogsDatabaseClient( kurtosisBackend backend_interface.KurtosisBackend, filesystem volume_filesystem.VolumeFilesystem, + logFileManager *log_file_manager.LogFileManager, streamStrategy stream_logs_strategy.StreamLogsStrategy, ) *persistentVolumeLogsDatabaseClient { return &persistentVolumeLogsDatabaseClient{ kurtosisBackend: kurtosisBackend, filesystem: filesystem, + logFileManager: logFileManager, streamStrategy: streamStrategy, } } @@ -127,6 +132,18 @@ func (client *persistentVolumeLogsDatabaseClient) FilterExistingServiceUuids( return filteredServiceUuidsSet, nil } +func (client *persistentVolumeLogsDatabaseClient) StartLogFileManagement(ctx context.Context) { + client.logFileManager.StartLogFileManagement(ctx) +} + +func (client *persistentVolumeLogsDatabaseClient) RemoveEnclaveLogs(enclaveUuid string) error { + return client.logFileManager.RemoveEnclaveLogs(enclaveUuid) +} + +func (client *persistentVolumeLogsDatabaseClient) RemoveAllLogs() error { + return client.logFileManager.RemoveAllLogs() +} + // ==================================================================================================== // // Private helper functions diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go index 82f14c00e9..d245581bde 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go @@ -6,6 +6,8 @@ import ( "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/enclave" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts" @@ -694,7 +696,11 @@ func executeStreamCallAndGetReceivedServiceLogLines( kurtosisBackend := backend_interface.NewMockKurtosisBackend(t) - logsDatabaseClient := NewPersistentVolumeLogsDatabaseClient(kurtosisBackend, underlyingFs, streamStrategy) + // no log file management is done in these tests so values for logFileManager aren't important + mockTime := logs_clock.NewMockLogsClock(0, 0, 0) + fileLayout := file_layout.NewPerWeekFileLayout(mockTime) + logFileManager := log_file_manager.NewLogFileManager(kurtosisBackend, underlyingFs, fileLayout, mockTime, 0) + logsDatabaseClient := NewPersistentVolumeLogsDatabaseClient(kurtosisBackend, underlyingFs, logFileManager, streamStrategy) userServiceLogsByUuidChan, errChan, receivedCancelCtxFunc, err := logsDatabaseClient.StreamUserServiceLogs(ctx, enclaveUuid, userServiceUuids, logLinesFilters, shouldFollowLogs, defaultShouldReturnAllLogs, defaultNumLogLines) if err != nil { diff --git a/engine/server/engine/centralized_logs/logs_database_client.go b/engine/server/engine/centralized_logs/logs_database_client.go index e9779426ba..c7075d0140 100644 --- a/engine/server/engine/centralized_logs/logs_database_client.go +++ b/engine/server/engine/centralized_logs/logs_database_client.go @@ -31,4 +31,10 @@ type LogsDatabaseClient interface { map[service.ServiceUUID]bool, error, ) + + StartLogFileManagement(ctx context.Context) + + RemoveEnclaveLogs(enclaveUuid string) error + + RemoveAllLogs() error } diff --git a/engine/server/engine/enclave_manager/enclave_manager.go b/engine/server/engine/enclave_manager/enclave_manager.go index fbb64957bd..f7d98bf0b0 100644 --- a/engine/server/engine/enclave_manager/enclave_manager.go +++ b/engine/server/engine/enclave_manager/enclave_manager.go @@ -3,12 +3,12 @@ package enclave_manager import ( "context" "fmt" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs" "sort" "strings" "sync" "time" - "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager" "github.com/kurtosis-tech/kurtosis/metrics-library/golang/lib/metrics_client" dockerTypes "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_impls/docker/docker_manager/types" @@ -64,10 +64,11 @@ type EnclaveManager struct { // this is an append only list allExistingAndHistoricalIdentifiers []*types.EnclaveIdentifiers - enclaveCreator *EnclaveCreator - enclavePool *EnclavePool - enclaveEnvVars string - enclaveLogFileManager *log_file_manager.LogFileManager + enclaveCreator *EnclaveCreator + enclavePool *EnclavePool + enclaveEnvVars string + + logsDbClient centralized_logs.LogsDatabaseClient metricsUserID string didUserAcceptSendingMetrics bool @@ -83,7 +84,7 @@ func CreateEnclaveManager( engineVersion string, poolSize uint8, enclaveEnvVars string, - enclaveLogFileManager *log_file_manager.LogFileManager, + logsDbClient centralized_logs.LogsDatabaseClient, metricsUserID string, didUserAcceptSendingMetrics bool, isCI bool, @@ -114,7 +115,7 @@ func CreateEnclaveManager( enclaveCreator: enclaveCreator, enclavePool: enclavePool, enclaveEnvVars: enclaveEnvVars, - enclaveLogFileManager: enclaveLogFileManager, + logsDbClient: logsDbClient, metricsUserID: metricsUserID, didUserAcceptSendingMetrics: didUserAcceptSendingMetrics, isCI: isCI, @@ -277,7 +278,7 @@ func (manager *EnclaveManager) DestroyEnclave(ctx context.Context, enclaveIdenti return stacktrace.Propagate(err, "An error occurred destroying the enclave") } if _, found := successfullyDestroyedEnclaves[enclaveUuid]; found { - if err = manager.enclaveLogFileManager.RemoveEnclaveLogs(string(enclaveUuid)); err != nil { + if err = manager.logsDbClient.RemoveEnclaveLogs(string(enclaveUuid)); err != nil { return stacktrace.Propagate(err, "An error occurred attempting to remove enclave '%v' logs after it was destroyed.", enclaveIdentifier) } return nil @@ -601,7 +602,7 @@ func (manager *EnclaveManager) cleanEnclaves( for enclaveId := range successfullyDestroyedEnclaves { successfullyDestroyedEnclaveIdStrs = append(successfullyDestroyedEnclaveIdStrs, string(enclaveId)) - if err := manager.enclaveLogFileManager.RemoveEnclaveLogs(string(enclaveId)); err != nil { + if err := manager.logsDbClient.RemoveEnclaveLogs(string(enclaveId)); err != nil { logRemovalErr := stacktrace.Propagate(err, "An error occurred removing enclave '%v' logs.", enclaveId) enclaveDestructionErrors = append(enclaveDestructionErrors, logRemovalErr) } diff --git a/engine/server/engine/main.go b/engine/server/engine/main.go index 8206befbe4..217ffe9e42 100644 --- a/engine/server/engine/main.go +++ b/engine/server/engine/main.go @@ -175,15 +175,8 @@ func runMain() error { if err != nil { return stacktrace.Propagate(err, "An error occurred getting the Kurtosis backend for backend type '%v' and config '%+v'", serverArgs.KurtosisBackendType, backendConfig) } - logsDatabaseClient := getLogsDatabaseClient(serverArgs.KurtosisBackendType, kurtosisBackend) - - // TODO: Move log file management into LogsDatabaseClient - osFs := volume_filesystem.NewOsVolumeFilesystem() - realTime := logs_clock.NewRealClock() - perWeekFileLayout := file_layout.NewPerWeekFileLayout(realTime) - logFileManager := log_file_manager.NewLogFileManager(kurtosisBackend, osFs, perWeekFileLayout, realTime, volume_consts.LogRetentionPeriodInWeeks) - logFileManager.StartLogFileManagement(ctx) + logsDatabaseClient.StartLogFileManagement(ctx) enclaveManager, err := getEnclaveManager( kurtosisBackend, @@ -191,7 +184,7 @@ func runMain() error { serverArgs.ImageVersionTag, serverArgs.PoolSize, serverArgs.EnclaveEnvVars, - logFileManager, + logsDatabaseClient, serverArgs.MetricsUserID, serverArgs.DidUserAcceptSendingMetrics, serverArgs.IsCI, @@ -292,7 +285,6 @@ func runMain() error { serverArgs, enclaveManager, logsDatabaseClient, - logFileManager, metricsClient, ) if err != nil { @@ -308,7 +300,6 @@ func runMain() error { serverArgs.MetricsUserID, serverArgs.DidUserAcceptSendingMetrics, logsDatabaseClient, - logFileManager, metricsClient) apiPath, handler := kurtosis_engine_rpc_api_bindingsconnect.NewEngineServiceHandler(engineConnectServer) defer func() { @@ -331,7 +322,7 @@ func getEnclaveManager( engineVersion string, poolSize uint8, enclaveEnvVars string, - enclaveLogFileManager *log_file_manager.LogFileManager, + logsDbClient centralized_logs.LogsDatabaseClient, metricsUserID string, didUserAcceptSendingMetrics bool, isCI bool, @@ -360,7 +351,7 @@ func getEnclaveManager( engineVersion, poolSize, enclaveEnvVars, - enclaveLogFileManager, + logsDbClient, metricsUserID, didUserAcceptSendingMetrics, isCI, @@ -413,10 +404,14 @@ func getLogsDatabaseClient(kurtosisBackendType args.KurtosisBackendType, kurtosi var logsDatabaseClient centralized_logs.LogsDatabaseClient switch kurtosisBackendType { case args.KurtosisBackendType_Docker: - osFs := volume_filesystem.NewOsVolumeFilesystem() realTime := logs_clock.NewRealClock() + + osFs := volume_filesystem.NewOsVolumeFilesystem() + perWeekFileLayout := file_layout.NewPerWeekFileLayout(realTime) + logFileManager := log_file_manager.NewLogFileManager(kurtosisBackend, osFs, perWeekFileLayout, realTime, volume_consts.LogRetentionPeriodInWeeks) perWeekStreamLogsStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(realTime, volume_consts.LogRetentionPeriodInWeeks) - logsDatabaseClient = persistent_volume.NewPersistentVolumeLogsDatabaseClient(kurtosisBackend, osFs, perWeekStreamLogsStrategy) + + logsDatabaseClient = persistent_volume.NewPersistentVolumeLogsDatabaseClient(kurtosisBackend, osFs, logFileManager, perWeekStreamLogsStrategy) case args.KurtosisBackendType_Kubernetes: logsDatabaseClient = kurtosis_backend.NewKurtosisBackendLogsDatabaseClient(kurtosisBackend) } @@ -438,7 +433,6 @@ func restApiServer( serverArgs *args.EngineServerArgs, enclave_manager *enclave_manager.EnclaveManager, logsDatabaseClient centralized_logs.LogsDatabaseClient, - logFileManager *log_file_manager.LogFileManager, metricsClient metrics_client.MetricsClient, ) error { @@ -466,7 +460,6 @@ func restApiServer( engineRuntime := restApi.EngineRuntime{ ImageVersionTag: serverArgs.ImageVersionTag, EnclaveManager: enclave_manager, - LogFileManager: logFileManager, MetricsClient: metricsClient, } engineApi.RegisterHandlers(echoApiRouter, engineApi.NewStrictHandler(engineRuntime, nil)) @@ -483,7 +476,6 @@ func restApiServer( MetricsUserID: serverArgs.MetricsUserID, DidUserAcceptSendingMetrics: serverArgs.DidUserAcceptSendingMetrics, LogsDatabaseClient: logsDatabaseClient, - LogFileManager: logFileManager, MetricsClient: metricsClient, AsyncStarlarkLogs: asyncStarlarkLogs, CorsConfig: *corsConfig, diff --git a/engine/server/engine/server/engine_connect_server_service.go b/engine/server/engine/server/engine_connect_server_service.go index 3fc908e916..ea2d266e9e 100644 --- a/engine/server/engine/server/engine_connect_server_service.go +++ b/engine/server/engine/server/engine_connect_server_service.go @@ -10,7 +10,6 @@ import ( "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/enclave" user_service "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs" - "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/logline" "github.com/kurtosis-tech/kurtosis/engine/server/engine/enclave_manager" "github.com/kurtosis-tech/kurtosis/engine/server/engine/types" @@ -41,8 +40,6 @@ type EngineConnectServerService struct { // The client for consuming container logs from the logs database logsDatabaseClient centralized_logs.LogsDatabaseClient - logFileManager *log_file_manager.LogFileManager - metricsClient metrics_client.MetricsClient } @@ -52,7 +49,6 @@ func NewEngineConnectServerService( metricsUserId string, didUserAcceptSendingMetrics bool, logsDatabaseClient centralized_logs.LogsDatabaseClient, - logFileManager *log_file_manager.LogFileManager, metricsClient metrics_client.MetricsClient, ) *EngineConnectServerService { service := &EngineConnectServerService{ @@ -61,7 +57,6 @@ func NewEngineConnectServerService( metricsUserID: metricsUserId, didUserAcceptSendingMetrics: didUserAcceptSendingMetrics, logsDatabaseClient: logsDatabaseClient, - logFileManager: logFileManager, metricsClient: metricsClient, } return service @@ -265,7 +260,7 @@ func (service *EngineConnectServerService) Clean(ctx context.Context, connectArg return nil, stacktrace.Propagate(err, "An error occurred while cleaning enclaves") } if args.GetShouldCleanAll() { - if err = service.logFileManager.RemoveAllLogs(); err != nil { + if err = service.logsDatabaseClient.RemoveAllLogs(); err != nil { return nil, stacktrace.Propagate(err, "An error occurred removing all logs.") } } diff --git a/engine/server/engine/server/websocket_api_handler.go b/engine/server/engine/server/websocket_api_handler.go index 8cebce2683..7d5b57abe1 100644 --- a/engine/server/engine/server/websocket_api_handler.go +++ b/engine/server/engine/server/websocket_api_handler.go @@ -7,7 +7,6 @@ import ( user_service "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs" - "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager" "github.com/kurtosis-tech/kurtosis/engine/server/engine/enclave_manager" "github.com/kurtosis-tech/kurtosis/engine/server/engine/mapping/to_http" "github.com/kurtosis-tech/kurtosis/engine/server/engine/streaming" @@ -37,8 +36,6 @@ type WebSocketRuntime struct { // The clients for consuming container logs from the logs' database server LogsDatabaseClient centralized_logs.LogsDatabaseClient - LogFileManager *log_file_manager.LogFileManager - MetricsClient metrics_client.MetricsClient // Pool of Starlark log streamers create by package/script runs From 7890081a1f55fa74b4ee71c7d7f3e82c4833aed2 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 15 Aug 2024 12:02:12 -0400 Subject: [PATCH 36/78] lint --- .../file_layout/per_week_file_layout.go | 11 ++++++----- engine/server/engine/main.go | 1 + .../server/engine/server/engine_rest_api_handler.go | 6 +++--- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go index 13fa807d0b..c4fcb7fd8f 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go @@ -13,7 +13,8 @@ import ( ) const ( - oneWeek = 7 * 24 * time.Hour + oneWeekInHours = 7 * 24 + oneWeekDuration = oneWeekInHours * time.Hour // basepath /year/week PerWeekDirPathStr = "%s%s/%s/" @@ -65,7 +66,7 @@ func (pwf *PerWeekFileLayout) getLogFilePathsFromNowTillRetentionPeriod(fs volum // scan for first existing log file firstWeekWithLogs := 0 for i := 0; i < retentionPeriodInWeeks; i++ { - year, week := currentTime.Add(time.Duration(-i) * oneWeek).ISOWeek() + year, week := currentTime.Add(time.Duration(-i) * oneWeekDuration).ISOWeek() filePathStr := getLogFilePath(year, week, enclaveUuid, serviceUuid) if _, err := fs.Stat(filePathStr); err == nil { paths = append(paths, filePathStr) @@ -81,7 +82,7 @@ func (pwf *PerWeekFileLayout) getLogFilePathsFromNowTillRetentionPeriod(fs volum // scan for remaining files as far back as they exist before the retention period for i := firstWeekWithLogs + 1; i < retentionPeriodInWeeks; i++ { - year, week := currentTime.Add(time.Duration(-i) * oneWeek).ISOWeek() + year, week := currentTime.Add(time.Duration(-i) * oneWeekDuration).ISOWeek() filePathStr := getLogFilePath(year, week, enclaveUuid, serviceUuid) if _, err := fs.Stat(filePathStr); err != nil { break @@ -102,7 +103,7 @@ func (pwf *PerWeekFileLayout) getLogFilePathsBeyondRetentionPeriod(fs volume_fil // scan for log files just beyond the retention period for i := 0; i < retentionPeriodIntervals; i++ { numWeeksToGoBack := retentionPeriodInWeeks + i - year, weekToRemove := currentTime.Add(time.Duration(-numWeeksToGoBack) * oneWeek).ISOWeek() + year, weekToRemove := currentTime.Add(time.Duration(-numWeeksToGoBack) * oneWeekDuration).ISOWeek() filePathStr := getLogFilePath(year, weekToRemove, enclaveUuid, serviceUuid) if _, err := fs.Stat(filePathStr); err != nil { continue @@ -114,7 +115,7 @@ func (pwf *PerWeekFileLayout) getLogFilePathsBeyondRetentionPeriod(fs volume_fil } func DurationToWeeks(d time.Duration) int { - return int(math.Round(d.Hours() / float64(7*24))) + return int(math.Round(d.Hours() / float64(oneWeekInHours))) } func getLogFilePath(year, week int, enclaveUuid, serviceUuid string) string { diff --git a/engine/server/engine/main.go b/engine/server/engine/main.go index 217ffe9e42..e9945db5c0 100644 --- a/engine/server/engine/main.go +++ b/engine/server/engine/main.go @@ -460,6 +460,7 @@ func restApiServer( engineRuntime := restApi.EngineRuntime{ ImageVersionTag: serverArgs.ImageVersionTag, EnclaveManager: enclave_manager, + LogsDbClient: logsDatabaseClient, MetricsClient: metricsClient, } engineApi.RegisterHandlers(echoApiRouter, engineApi.NewStrictHandler(engineRuntime, nil)) diff --git a/engine/server/engine/server/engine_rest_api_handler.go b/engine/server/engine/server/engine_rest_api_handler.go index e7f9665024..c3d74540b4 100644 --- a/engine/server/engine/server/engine_rest_api_handler.go +++ b/engine/server/engine/server/engine_rest_api_handler.go @@ -3,9 +3,9 @@ package server import ( "context" "fmt" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs" "net/http" - "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager" "github.com/kurtosis-tech/kurtosis/engine/server/engine/enclave_manager" "github.com/kurtosis-tech/kurtosis/engine/server/engine/mapping/to_http" "github.com/kurtosis-tech/kurtosis/engine/server/engine/types" @@ -23,7 +23,7 @@ type EngineRuntime struct { EnclaveManager *enclave_manager.EnclaveManager - LogFileManager *log_file_manager.LogFileManager + LogsDbClient centralized_logs.LogsDatabaseClient MetricsClient metrics_client.MetricsClient } @@ -41,7 +41,7 @@ func (engine EngineRuntime) DeleteEnclaves(ctx context.Context, request api.Dele }, nil } if removeAll { - if err = engine.LogFileManager.RemoveAllLogs(); err != nil { + if err = engine.LogsDbClient.RemoveAllLogs(); err != nil { response := internalErrorResponseInfof(err, "An error occurred removing all logs") return api.DeleteEnclavesdefaultJSONResponse{ Body: response, From 62f08c3695ca15fd2f7fbfa95366ac70d02efa4a Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 15 Aug 2024 12:05:32 -0400 Subject: [PATCH 37/78] lint --- .../file_layout/per_week_file_layout_test.go | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go index 1c5b14bbde..3c4731ed1b 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go @@ -5,7 +5,6 @@ import ( "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" "github.com/stretchr/testify/require" "testing" - "time" ) const ( @@ -13,7 +12,6 @@ const ( testUserService1Uuid = "test-user-service-1" retentionPeriodInWeeksForTesting = 5 - oneWeekInHours = 7 * 24 * time.Hour defaultYear = 2023 defaultDay = 0 // sunday @@ -48,7 +46,7 @@ func TestGetLogFilePaths(t *testing.T) { week17filepath, } - retentionPeriod := retentionPeriodInWeeksForTesting * oneWeekInHours + retentionPeriod := retentionPeriodInWeeksForTesting * oneWeekDuration logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) require.NoError(t, err) @@ -86,7 +84,7 @@ func TestGetLogFilePathsAcrossNewYear(t *testing.T) { week2filepath, } - retentionPeriod := retentionPeriodInWeeksForTesting * oneWeekInHours + retentionPeriod := retentionPeriodInWeeksForTesting * oneWeekDuration logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) require.NoError(t, err) @@ -124,7 +122,7 @@ func TestGetLogFilePathsAcrossNewYearWith53Weeks(t *testing.T) { week3filepath, } - retentionPeriod := retentionPeriodInWeeksForTesting * oneWeekInHours + retentionPeriod := retentionPeriodInWeeksForTesting * oneWeekDuration logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) require.NoError(t, err) @@ -155,7 +153,7 @@ func TestGetLogFilePathsWithDiffRetentionPeriod(t *testing.T) { week1filepath, week2filepath, } - retentionPeriod := 3 * oneWeekInHours + retentionPeriod := 3 * oneWeekDuration logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) require.NoError(t, err) @@ -187,7 +185,7 @@ func TestGetLogFilePathsReturnsAllAvailableWeeks(t *testing.T) { week1filepath, week2filepath, } - retentionPeriod := retentionPeriodInWeeksForTesting * oneWeekInHours + retentionPeriod := retentionPeriodInWeeksForTesting * oneWeekDuration logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) require.NoError(t, err) @@ -212,7 +210,7 @@ func TestGetLogFilePathsReturnsCorrectPathsIfWeeksMissingInBetween(t *testing.T) _, _ = filesystem.Create(week52filepath) _, _ = filesystem.Create(week1filepath) _, _ = filesystem.Create(week3filepath) - retentionPeriod := retentionPeriodInWeeksForTesting * oneWeekInHours + retentionPeriod := retentionPeriodInWeeksForTesting * oneWeekDuration logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) require.NoError(t, err) @@ -241,7 +239,7 @@ func TestGetLogFilePathsReturnsCorrectPathsIfCurrentWeekHasNoLogsYet(t *testing. week2filepath, } - retentionPeriod := retentionPeriodInWeeksForTesting * oneWeekInHours + retentionPeriod := retentionPeriodInWeeksForTesting * oneWeekDuration logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) require.NoError(t, err) @@ -271,7 +269,7 @@ func TestGetLogFilePathsOneIntervalBeyondRetentionPeriod(t *testing.T) { _, _ = filesystem.Create(week1filepath) _, _ = filesystem.Create(week2filepath) - retentionPeriod := 5 * oneWeekInHours + retentionPeriod := 5 * oneWeekDuration logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, 1, testEnclaveUuid, testUserService1Uuid) require.NoError(t, err) require.Len(t, logFilePaths, 1) @@ -305,7 +303,7 @@ func TestGetLogFilePathsTwoIntervalBeyondRetentionPeriod(t *testing.T) { week48filepath, } - retentionPeriod := 5 * oneWeekInHours + retentionPeriod := 5 * oneWeekDuration logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, 2, testEnclaveUuid, testUserService1Uuid) require.NoError(t, err) @@ -334,7 +332,7 @@ func TestGetLogFilePathsWithNoPathsBeyondRetentionPeriod(t *testing.T) { _, _ = filesystem.Create(week1filepath) _, _ = filesystem.Create(week2filepath) - retentionPeriod := 5 * oneWeekInHours + retentionPeriod := 5 * oneWeekDuration logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, 1, testEnclaveUuid, testUserService1Uuid) require.NoError(t, err) @@ -370,7 +368,7 @@ func TestGetLogFilePathsWithMissingPathBetweenIntervals(t *testing.T) { week47filepath, } - retentionPeriod := 5 * oneWeekInHours + retentionPeriod := 5 * oneWeekDuration // the expected behavior is return all filepaths, even if some are missing logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, 3, testEnclaveUuid, testUserService1Uuid) From 99a2c58cdef6dfca8c1120f41b12f9eb7b4bc19e Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Mon, 19 Aug 2024 10:39:57 -0400 Subject: [PATCH 38/78] add log retention flag --- .../engine_consuming_kurtosis_command.go | 2 +- cli/cli/commands/cluster/set/set.go | 2 +- cli/cli/commands/enclave/add/add.go | 2 +- cli/cli/commands/engine/restart/restart.go | 16 ++++++++++++++- cli/cli/commands/engine/start/start.go | 20 ++++++++++++++++--- cli/cli/commands/kurtosis_context/set/set.go | 2 +- .../engine_existence_guarantor.go | 9 +++++++++ .../helpers/engine_manager/engine_manager.go | 11 ++++++---- engine/launcher/args/args.go | 4 ++++ .../engine_server_launcher.go | 6 +++++- engine/server/engine/main.go | 17 ++++++++++------ 11 files changed, 72 insertions(+), 19 deletions(-) diff --git a/cli/cli/command_framework/highlevel/engine_consuming_kurtosis_command/engine_consuming_kurtosis_command.go b/cli/cli/command_framework/highlevel/engine_consuming_kurtosis_command/engine_consuming_kurtosis_command.go index fd72080716..175edc9cbe 100644 --- a/cli/cli/command_framework/highlevel/engine_consuming_kurtosis_command/engine_consuming_kurtosis_command.go +++ b/cli/cli/command_framework/highlevel/engine_consuming_kurtosis_command/engine_consuming_kurtosis_command.go @@ -187,7 +187,7 @@ func (cmd *EngineConsumingKurtosisCommand) getSetupFunc() func(context.Context) kurtosisBackend := engineManager.GetKurtosisBackend() dontRestartAPIContainers := false - engineClient, closeClientFunc, err := engineManager.StartEngineIdempotentlyWithDefaultVersion(ctx, defaults.DefaultEngineLogLevel, defaults.DefaultEngineEnclavePoolSize, defaults.DefaultGitHubAuthTokenOverride, dontRestartAPIContainers, defaults.DefaultDomain) + engineClient, closeClientFunc, err := engineManager.StartEngineIdempotentlyWithDefaultVersion(ctx, defaults.DefaultEngineLogLevel, defaults.DefaultEngineEnclavePoolSize, defaults.DefaultGitHubAuthTokenOverride, dontRestartAPIContainers, defaults.DefaultDomain, "") if err != nil { return nil, stacktrace.Propagate(err, "An error occurred creating a new Kurtosis engine client") } diff --git a/cli/cli/commands/cluster/set/set.go b/cli/cli/commands/cluster/set/set.go index b31b22ad07..46192a945a 100644 --- a/cli/cli/commands/cluster/set/set.go +++ b/cli/cli/commands/cluster/set/set.go @@ -124,7 +124,7 @@ func run(ctx context.Context, flags *flags.ParsedFlags, args *args.ParsedArgs) e // TODO - fix the idempotent starter longer term if engineStatus == engine_manager.EngineStatus_Stopped { dontRestartAPIContainers := false - _, engineClientCloseFunc, err := engineManagerNewCluster.StartEngineIdempotentlyWithDefaultVersion(ctx, defaults.DefaultEngineLogLevel, defaults.DefaultEngineEnclavePoolSize, defaults.DefaultGitHubAuthTokenOverride, dontRestartAPIContainers, defaults.DefaultDomain) + _, engineClientCloseFunc, err := engineManagerNewCluster.StartEngineIdempotentlyWithDefaultVersion(ctx, defaults.DefaultEngineLogLevel, defaults.DefaultEngineEnclavePoolSize, defaults.DefaultGitHubAuthTokenOverride, dontRestartAPIContainers, defaults.DefaultDomain, "") if err != nil { return stacktrace.Propagate(err, "Engine could not be started after cluster was updated. Its status can be retrieved "+ "running 'kurtosis %s %s' and it can potentially be started running 'kurtosis %s %s'", diff --git a/cli/cli/commands/enclave/add/add.go b/cli/cli/commands/enclave/add/add.go index 1eb3e304e4..92a78cc370 100644 --- a/cli/cli/commands/enclave/add/add.go +++ b/cli/cli/commands/enclave/add/add.go @@ -121,7 +121,7 @@ func run( return stacktrace.Propagate(err, "An error occurred creating an engine manager.") } - engineClient, closeClientFunc, err := engineManager.StartEngineIdempotentlyWithDefaultVersion(ctx, defaults.DefaultEngineLogLevel, defaults.DefaultEngineEnclavePoolSize, defaults.DefaultGitHubAuthTokenOverride, dontRestartAPIContainers, defaults.DefaultDomain) + engineClient, closeClientFunc, err := engineManager.StartEngineIdempotentlyWithDefaultVersion(ctx, defaults.DefaultEngineLogLevel, defaults.DefaultEngineEnclavePoolSize, defaults.DefaultGitHubAuthTokenOverride, dontRestartAPIContainers, defaults.DefaultDomain, "") if err != nil { return stacktrace.Propagate(err, "An error occurred creating a new Kurtosis engine client") } diff --git a/cli/cli/commands/engine/restart/restart.go b/cli/cli/commands/engine/restart/restart.go index 0be78b0b28..caf65cb812 100644 --- a/cli/cli/commands/engine/restart/restart.go +++ b/cli/cli/commands/engine/restart/restart.go @@ -24,6 +24,8 @@ const ( logLevelFlagKey = "log-level" enclavePoolSizeFlagKey = "enclave-pool-size" githubAuthTokenOverrideFlagKey = "github-auth-token" + logRetentionPeriodFlagKey = "log-retention-period" + defaultLogRetentionPeriod = "1week" defaultEngineVersion = "" restartEngineOnSameVersionIfAnyRunning = false @@ -92,6 +94,13 @@ var RestartCmd = &lowlevel.LowlevelKurtosisCommand{ Type: flags.FlagType_String, Default: defaultDomain, }, + { + Key: logRetentionPeriodFlagKey, + Usage: "The length of time that Kurtosis should keep logs for. Eg. if set to 1week, Kurtosis will remove all logs beyond 1 week.", + Shorthand: "", + Type: flags.FlagType_String, + Default: defaultLogRetentionPeriod, + }, }, PreValidationAndRunFunc: nil, RunFunc: run, @@ -158,9 +167,14 @@ func run(_ context.Context, flags *flags.ParsedFlags, _ *args.ParsedArgs) error return stacktrace.Propagate(err, "An error occurred while getting the Kurtosis engine enclave manager UI domain name using the flag with key '%v'; this is a bug in Kurtosis", domainFlagKey) } + logRetentionPeriodStr, err := flags.GetString(logRetentionPeriodFlagKey) + if err != nil { + return stacktrace.Propagate(err, "An error occurred while getting the log retention period string from flag: '%v'", logRetentionPeriodStr) + } + var engineClientCloseFunc func() error var restartEngineErr error - _, engineClientCloseFunc, restartEngineErr = engineManager.RestartEngineIdempotently(ctx, logLevel, engineVersion, restartEngineOnSameVersionIfAnyRunning, enclavePoolSize, shouldStartInDebugMode, githubAuthTokenOverride, shouldRestartAPIContainers, domain) + _, engineClientCloseFunc, restartEngineErr = engineManager.RestartEngineIdempotently(ctx, logLevel, engineVersion, restartEngineOnSameVersionIfAnyRunning, enclavePoolSize, shouldStartInDebugMode, githubAuthTokenOverride, shouldRestartAPIContainers, domain, logRetentionPeriodStr) if restartEngineErr != nil { return stacktrace.Propagate(restartEngineErr, "An error occurred restarting the Kurtosis engine") } diff --git a/cli/cli/commands/engine/start/start.go b/cli/cli/commands/engine/start/start.go index 4420a4b46f..1216b0533f 100644 --- a/cli/cli/commands/engine/start/start.go +++ b/cli/cli/commands/engine/start/start.go @@ -24,6 +24,8 @@ const ( logLevelFlagKey = "log-level" enclavePoolSizeFlagKey = "enclave-pool-size" githubAuthTokenOverrideFlagKey = "github-auth-token" + logRetentionPeriodFlagKey = "log-retention-period" + defaultLogRetentionPeriod = "1week" defaultEngineVersion = "" kurtosisTechEngineImagePrefix = "kurtosistech/engine" @@ -93,6 +95,13 @@ var StartCmd = &lowlevel.LowlevelKurtosisCommand{ Type: flags.FlagType_String, Default: defaultDomain, }, + { + Key: logRetentionPeriodFlagKey, + Usage: "The length of time that Kurtosis should keep logs for. Eg. if set to 1week, Kurtosis will remove all logs beyond 1 week.", + Shorthand: "", + Type: flags.FlagType_String, + Default: defaultLogRetentionPeriod, + }, }, PreValidationAndRunFunc: nil, RunFunc: run, @@ -154,16 +163,21 @@ func run(_ context.Context, flags *flags.ParsedFlags, _ *args.ParsedArgs) error return stacktrace.Propagate(err, "An error occurred while getting the Kurtosis engine enclave manager UI domain name using the flag with key '%v'; this is a bug in Kurtosis", domainFlagKey) } + logRetentionPeriodStr, err := flags.GetString(logRetentionPeriodFlagKey) + if err != nil { + return stacktrace.Propagate(err, "An error occurred while getting the log retention period string from flag: '%v'", logRetentionPeriodStr) + } + if engineVersion == defaultEngineVersion && isDebugMode { engineDebugVersion := fmt.Sprintf("%s-%s", kurtosis_version.KurtosisVersion, defaults.DefaultKurtosisContainerDebugImageNameSuffix) logrus.Infof("Starting Kurtosis engine in debug mode from image '%v%v%v'...", kurtosisTechEngineImagePrefix, imageVersionDelimiter, engineDebugVersion) - _, engineClientCloseFunc, startEngineErr = engineManager.StartEngineIdempotentlyWithCustomVersion(ctx, engineDebugVersion, logLevel, enclavePoolSize, true, githubAuthTokenOverride, shouldRestartAPIContainers, domain) + _, engineClientCloseFunc, startEngineErr = engineManager.StartEngineIdempotentlyWithCustomVersion(ctx, engineDebugVersion, logLevel, enclavePoolSize, true, githubAuthTokenOverride, shouldRestartAPIContainers, domain, logRetentionPeriodStr) } else if engineVersion == defaultEngineVersion { logrus.Infof("Starting Kurtosis engine from image '%v%v%v'...", kurtosisTechEngineImagePrefix, imageVersionDelimiter, kurtosis_version.KurtosisVersion) - _, engineClientCloseFunc, startEngineErr = engineManager.StartEngineIdempotentlyWithDefaultVersion(ctx, logLevel, enclavePoolSize, githubAuthTokenOverride, shouldRestartAPIContainers, domain) + _, engineClientCloseFunc, startEngineErr = engineManager.StartEngineIdempotentlyWithDefaultVersion(ctx, logLevel, enclavePoolSize, githubAuthTokenOverride, shouldRestartAPIContainers, domain, logRetentionPeriodStr) } else { logrus.Infof("Starting Kurtosis engine from image '%v%v%v'...", kurtosisTechEngineImagePrefix, imageVersionDelimiter, engineVersion) - _, engineClientCloseFunc, startEngineErr = engineManager.StartEngineIdempotentlyWithCustomVersion(ctx, engineVersion, logLevel, enclavePoolSize, defaults.DefaultEnableDebugMode, githubAuthTokenOverride, shouldRestartAPIContainers, domain) + _, engineClientCloseFunc, startEngineErr = engineManager.StartEngineIdempotentlyWithCustomVersion(ctx, engineVersion, logLevel, enclavePoolSize, defaults.DefaultEnableDebugMode, githubAuthTokenOverride, shouldRestartAPIContainers, domain, logRetentionPeriodStr) } if startEngineErr != nil { return stacktrace.Propagate(startEngineErr, "An error occurred starting the Kurtosis engine") diff --git a/cli/cli/commands/kurtosis_context/set/set.go b/cli/cli/commands/kurtosis_context/set/set.go index e6bde17d42..a08093f830 100644 --- a/cli/cli/commands/kurtosis_context/set/set.go +++ b/cli/cli/commands/kurtosis_context/set/set.go @@ -148,7 +148,7 @@ func SetContext( } dontRestartAPIContainers := false - _, engineClientCloseFunc, startEngineErr := engineManager.StartEngineIdempotentlyWithDefaultVersion(ctx, logrus.InfoLevel, defaults.DefaultEngineEnclavePoolSize, defaults.DefaultGitHubAuthTokenOverride, dontRestartAPIContainers, defaults.DefaultDomain) + _, engineClientCloseFunc, startEngineErr := engineManager.StartEngineIdempotentlyWithDefaultVersion(ctx, logrus.InfoLevel, defaults.DefaultEngineEnclavePoolSize, defaults.DefaultGitHubAuthTokenOverride, dontRestartAPIContainers, defaults.DefaultDomain, "") if startEngineErr != nil { logrus.Warnf("The context was successfully set to '%s' but Kurtosis failed to start an engine in "+ "this new context. A new engine should be started manually with '%s %s %s'. The error was:\n%v", diff --git a/cli/cli/helpers/engine_manager/engine_existence_guarantor.go b/cli/cli/helpers/engine_manager/engine_existence_guarantor.go index c09a536a14..73a1b1e2d8 100644 --- a/cli/cli/helpers/engine_manager/engine_existence_guarantor.go +++ b/cli/cli/helpers/engine_manager/engine_existence_guarantor.go @@ -88,6 +88,9 @@ type engineExistenceGuarantor struct { // Enclave manager UI domain name domain string + + // Length of time Kurtosis will keep logs for + logRetentionPeriod string } func newEngineExistenceGuarantorWithDefaultVersion( @@ -107,6 +110,7 @@ func newEngineExistenceGuarantorWithDefaultVersion( githubAuthTokenOverride string, restartAPIContainers bool, domain string, + logRetentionPeriod string, ) *engineExistenceGuarantor { return newEngineExistenceGuarantorWithCustomVersion( ctx, @@ -126,6 +130,7 @@ func newEngineExistenceGuarantorWithDefaultVersion( githubAuthTokenOverride, restartAPIContainers, domain, + logRetentionPeriod, ) } @@ -147,6 +152,7 @@ func newEngineExistenceGuarantorWithCustomVersion( githubAuthTokenOverride string, restartAPIContainers bool, domain string, + logRetentionPeriod string, ) *engineExistenceGuarantor { return &engineExistenceGuarantor{ ctx: ctx, @@ -168,6 +174,7 @@ func newEngineExistenceGuarantorWithCustomVersion( githubAuthTokenOverride: githubAuthTokenOverride, restartAPIContainers: restartAPIContainers, domain: domain, + logRetentionPeriod: logRetentionPeriod, } } @@ -228,6 +235,7 @@ func (guarantor *engineExistenceGuarantor) VisitStopped() error { githubAuthToken, guarantor.restartAPIContainers, guarantor.domain, + guarantor.logRetentionPeriod, ) } else { _, _, engineLaunchErr = guarantor.engineServerLauncher.LaunchWithCustomVersion( @@ -249,6 +257,7 @@ func (guarantor *engineExistenceGuarantor) VisitStopped() error { githubAuthToken, guarantor.restartAPIContainers, guarantor.domain, + guarantor.logRetentionPeriod, ) } if engineLaunchErr != nil { diff --git a/cli/cli/helpers/engine_manager/engine_manager.go b/cli/cli/helpers/engine_manager/engine_manager.go index 564240afb4..ea727a7f1d 100644 --- a/cli/cli/helpers/engine_manager/engine_manager.go +++ b/cli/cli/helpers/engine_manager/engine_manager.go @@ -183,7 +183,7 @@ func (manager *EngineManager) StartEngineIdempotentlyWithDefaultVersion( githubAuthTokenOverride string, restartAPIContainers bool, domain string, -) (kurtosis_engine_rpc_api_bindings.EngineServiceClient, func() error, error) { + logRetentionPeriodStr string) (kurtosis_engine_rpc_api_bindings.EngineServiceClient, func() error, error) { status, maybeHostMachinePortBinding, engineVersion, err := manager.GetEngineStatus(ctx) if err != nil { return nil, nil, stacktrace.Propagate(err, "An error occurred retrieving the Kurtosis engine status, which is necessary for creating a connection to the engine") @@ -207,6 +207,7 @@ func (manager *EngineManager) StartEngineIdempotentlyWithDefaultVersion( githubAuthTokenOverride, restartAPIContainers, domain, + logRetentionPeriodStr, ) // TODO Need to handle the Kubernetes case, where a gateway needs to be started after the engine is started but // before we can return an EngineClient @@ -227,7 +228,7 @@ func (manager *EngineManager) StartEngineIdempotentlyWithCustomVersion( githubAuthTokenOverride string, restartAPIContainers bool, domain string, -) (kurtosis_engine_rpc_api_bindings.EngineServiceClient, func() error, error) { + logRetentionPeriodStr string) (kurtosis_engine_rpc_api_bindings.EngineServiceClient, func() error, error) { status, maybeHostMachinePortBinding, engineVersion, err := manager.GetEngineStatus(ctx) if err != nil { return nil, nil, stacktrace.Propagate(err, "An error occurred retrieving the Kurtosis engine status, which is necessary for creating a connection to the engine") @@ -252,6 +253,7 @@ func (manager *EngineManager) StartEngineIdempotentlyWithCustomVersion( githubAuthTokenOverride, restartAPIContainers, domain, + logRetentionPeriodStr, ) engineClient, engineClientCloseFunc, err := manager.startEngineWithGuarantor(ctx, status, engineGuarantor) if err != nil { @@ -353,6 +355,7 @@ func (manager *EngineManager) RestartEngineIdempotently( githubAuthTokenOverride string, shouldRestartAPIContainers bool, domain string, + logRetentionPeriodStr string, ) (kurtosis_engine_rpc_api_bindings.EngineServiceClient, func() error, error) { var versionOfNewEngine string // We try to do our best to restart an engine on the same version the current on is on @@ -378,9 +381,9 @@ func (manager *EngineManager) RestartEngineIdempotently( var engineClientCloseFunc func() error var restartEngineErr error if versionOfNewEngine != defaultEngineVersion { - _, engineClientCloseFunc, restartEngineErr = manager.StartEngineIdempotentlyWithCustomVersion(ctx, versionOfNewEngine, logLevel, poolSize, shouldStartInDebugMode, githubAuthTokenOverride, shouldRestartAPIContainers, domain) + _, engineClientCloseFunc, restartEngineErr = manager.StartEngineIdempotentlyWithCustomVersion(ctx, versionOfNewEngine, logLevel, poolSize, shouldStartInDebugMode, githubAuthTokenOverride, shouldRestartAPIContainers, domain, logRetentionPeriodStr) } else { - _, engineClientCloseFunc, restartEngineErr = manager.StartEngineIdempotentlyWithDefaultVersion(ctx, logLevel, poolSize, githubAuthTokenOverride, shouldRestartAPIContainers, domain) + _, engineClientCloseFunc, restartEngineErr = manager.StartEngineIdempotentlyWithDefaultVersion(ctx, logLevel, poolSize, githubAuthTokenOverride, shouldRestartAPIContainers, domain, logRetentionPeriodStr) } if restartEngineErr != nil { return nil, nil, stacktrace.Propagate(restartEngineErr, "An error occurred starting a new engine") diff --git a/engine/launcher/args/args.go b/engine/launcher/args/args.go index 23ebdb2d55..9604837a9c 100644 --- a/engine/launcher/args/args.go +++ b/engine/launcher/args/args.go @@ -67,6 +67,8 @@ type EngineServerArgs struct { // Enclave manager UI domain name Domain string `json:"domain"` + + LogRetentionPeriod string `json:"logRetentionPeriod"` } var skipValidation = map[string]bool{ @@ -125,6 +127,7 @@ func NewEngineServerArgs( allowedCORSOrigins *[]string, restartAPIContainers bool, domain string, + logRetentionPeriod string, ) (*EngineServerArgs, error) { if enclaveEnvVars == "" { enclaveEnvVars = emptyJsonField @@ -146,6 +149,7 @@ func NewEngineServerArgs( AllowedCORSOrigins: allowedCORSOrigins, RestartAPIContainers: restartAPIContainers, Domain: domain, + LogRetentionPeriod: logRetentionPeriod, } if err := result.validate(); err != nil { return nil, stacktrace.Propagate(err, "An error occurred validating engine server args") diff --git a/engine/launcher/engine_server_launcher/engine_server_launcher.go b/engine/launcher/engine_server_launcher/engine_server_launcher.go index f736180584..f9455b811b 100644 --- a/engine/launcher/engine_server_launcher/engine_server_launcher.go +++ b/engine/launcher/engine_server_launcher/engine_server_launcher.go @@ -48,6 +48,7 @@ func (launcher *EngineServerLauncher) LaunchWithDefaultVersion( githubAuthToken string, restartAPIContainers bool, domain string, + logRetentionPeriod string, ) ( resultPublicIpAddr net.IP, resultPublicGrpcPortSpec *port_spec.PortSpec, @@ -71,7 +72,8 @@ func (launcher *EngineServerLauncher) LaunchWithDefaultVersion( shouldStartInDebugMode, githubAuthToken, restartAPIContainers, - domain) + domain, + logRetentionPeriod) if err != nil { return nil, nil, stacktrace.Propagate(err, "An error occurred launching the engine server container with default version tag '%v'", kurtosis_version.KurtosisVersion) } @@ -97,6 +99,7 @@ func (launcher *EngineServerLauncher) LaunchWithCustomVersion( githubAuthToken string, restartAPIContainers bool, domain string, + logRetentionPeriod string, ) ( resultPublicIpAddr net.IP, resultPublicGrpcPortSpec *port_spec.PortSpec, @@ -121,6 +124,7 @@ func (launcher *EngineServerLauncher) LaunchWithCustomVersion( allowedCORSOrigins, restartAPIContainers, domain, + logRetentionPeriod, ) if err != nil { return nil, nil, stacktrace.Propagate(err, "An error occurred creating the engine server args") diff --git a/engine/server/engine/main.go b/engine/server/engine/main.go index e9945db5c0..2c9ce224a2 100644 --- a/engine/server/engine/main.go +++ b/engine/server/engine/main.go @@ -10,6 +10,7 @@ import ( "fmt" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout" "io/fs" + "math" "net" "net/http" "os" @@ -19,8 +20,6 @@ import ( "strings" "time" - "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts" - "github.com/kurtosis-tech/kurtosis/api/golang/core/kurtosis_core_rpc_api_bindings" "github.com/kurtosis-tech/kurtosis/api/golang/engine/kurtosis_engine_rpc_api_bindings/kurtosis_engine_rpc_api_bindingsconnect" enclaveApi "github.com/kurtosis-tech/kurtosis/api/golang/http_rest/server/core_rest_api" @@ -175,7 +174,12 @@ func runMain() error { if err != nil { return stacktrace.Propagate(err, "An error occurred getting the Kurtosis backend for backend type '%v' and config '%+v'", serverArgs.KurtosisBackendType, backendConfig) } - logsDatabaseClient := getLogsDatabaseClient(serverArgs.KurtosisBackendType, kurtosisBackend) + + logRetentionPeriodDuration, err := time.ParseDuration(serverArgs.LogRetentionPeriod) + if err != nil { + return stacktrace.Propagate(err, "An error occurred parsing a Duration from provided log retention period string: %v", serverArgs.LogRetentionPeriod) + } + logsDatabaseClient := getLogsDatabaseClient(serverArgs.KurtosisBackendType, kurtosisBackend, logRetentionPeriodDuration) logsDatabaseClient.StartLogFileManagement(ctx) enclaveManager, err := getEnclaveManager( @@ -400,16 +404,17 @@ func getKurtosisBackend(ctx context.Context, kurtosisBackendType args.KurtosisBa } // if cluster is docker, return logs client for centralized logging, otherwise use logs db of kurtosis backend which uses k8s logs under the hood -func getLogsDatabaseClient(kurtosisBackendType args.KurtosisBackendType, kurtosisBackend backend_interface.KurtosisBackend) centralized_logs.LogsDatabaseClient { +func getLogsDatabaseClient(kurtosisBackendType args.KurtosisBackendType, kurtosisBackend backend_interface.KurtosisBackend, logRetentionPeriod time.Duration) centralized_logs.LogsDatabaseClient { var logsDatabaseClient centralized_logs.LogsDatabaseClient switch kurtosisBackendType { case args.KurtosisBackendType_Docker: realTime := logs_clock.NewRealClock() + logRetentionPeriodInWeeks := int(math.Round(logRetentionPeriod.Hours() / float64(7*24*time.Hour))) osFs := volume_filesystem.NewOsVolumeFilesystem() perWeekFileLayout := file_layout.NewPerWeekFileLayout(realTime) - logFileManager := log_file_manager.NewLogFileManager(kurtosisBackend, osFs, perWeekFileLayout, realTime, volume_consts.LogRetentionPeriodInWeeks) - perWeekStreamLogsStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(realTime, volume_consts.LogRetentionPeriodInWeeks) + logFileManager := log_file_manager.NewLogFileManager(kurtosisBackend, osFs, perWeekFileLayout, realTime, logRetentionPeriodInWeeks) + perWeekStreamLogsStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(realTime, logRetentionPeriodInWeeks) logsDatabaseClient = persistent_volume.NewPersistentVolumeLogsDatabaseClient(kurtosisBackend, osFs, logFileManager, perWeekStreamLogsStrategy) case args.KurtosisBackendType_Kubernetes: From 581c3fdc649dfd6dbdec3ac58343c056260f17eb Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Mon, 19 Aug 2024 10:46:58 -0400 Subject: [PATCH 39/78] add validation of parsed duration --- cli/cli/commands/engine/restart/restart.go | 7 ++++++- cli/cli/commands/engine/start/start.go | 7 ++++++- engine/server/engine/main.go | 5 ++++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/cli/cli/commands/engine/restart/restart.go b/cli/cli/commands/engine/restart/restart.go index caf65cb812..3dfcd361b8 100644 --- a/cli/cli/commands/engine/restart/restart.go +++ b/cli/cli/commands/engine/restart/restart.go @@ -5,6 +5,7 @@ import ( "fmt" "strconv" "strings" + "time" "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/lowlevel" "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/lowlevel/args" @@ -25,7 +26,7 @@ const ( enclavePoolSizeFlagKey = "enclave-pool-size" githubAuthTokenOverrideFlagKey = "github-auth-token" logRetentionPeriodFlagKey = "log-retention-period" - defaultLogRetentionPeriod = "1week" + defaultLogRetentionPeriod = "168h" defaultEngineVersion = "" restartEngineOnSameVersionIfAnyRunning = false @@ -171,6 +172,10 @@ func run(_ context.Context, flags *flags.ParsedFlags, _ *args.ParsedArgs) error if err != nil { return stacktrace.Propagate(err, "An error occurred while getting the log retention period string from flag: '%v'", logRetentionPeriodStr) } + _, err = time.ParseDuration(logRetentionPeriodStr) + if err != nil { + return stacktrace.Propagate(err, "An error occurred parsing provided log retention period '%v' into a duration. Ensure the provided value has the proper format. Valid time units are \"ns\", \"us\" (or \"µs\"), \"ms\", \"s\", \"m\", \"h\".", logRetentionPeriodStr) + } var engineClientCloseFunc func() error var restartEngineErr error diff --git a/cli/cli/commands/engine/start/start.go b/cli/cli/commands/engine/start/start.go index 1216b0533f..de185df3d8 100644 --- a/cli/cli/commands/engine/start/start.go +++ b/cli/cli/commands/engine/start/start.go @@ -5,6 +5,7 @@ import ( "fmt" "strconv" "strings" + "time" "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/lowlevel" "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/lowlevel/args" @@ -25,7 +26,7 @@ const ( enclavePoolSizeFlagKey = "enclave-pool-size" githubAuthTokenOverrideFlagKey = "github-auth-token" logRetentionPeriodFlagKey = "log-retention-period" - defaultLogRetentionPeriod = "1week" + defaultLogRetentionPeriod = "168h" defaultEngineVersion = "" kurtosisTechEngineImagePrefix = "kurtosistech/engine" @@ -167,6 +168,10 @@ func run(_ context.Context, flags *flags.ParsedFlags, _ *args.ParsedArgs) error if err != nil { return stacktrace.Propagate(err, "An error occurred while getting the log retention period string from flag: '%v'", logRetentionPeriodStr) } + _, err = time.ParseDuration(logRetentionPeriodStr) + if err != nil { + return stacktrace.Propagate(err, "An error occurred parsing provided log retention period '%v' into a duration. Ensure the provided value has the proper format. Valid time units are \"ns\", \"us\" (or \"µs\"), \"ms\", \"s\", \"m\", \"h\".", logRetentionPeriodStr) + } if engineVersion == defaultEngineVersion && isDebugMode { engineDebugVersion := fmt.Sprintf("%s-%s", kurtosis_version.KurtosisVersion, defaults.DefaultKurtosisContainerDebugImageNameSuffix) diff --git a/engine/server/engine/main.go b/engine/server/engine/main.go index 2c9ce224a2..2e1bcb094e 100644 --- a/engine/server/engine/main.go +++ b/engine/server/engine/main.go @@ -177,7 +177,7 @@ func runMain() error { logRetentionPeriodDuration, err := time.ParseDuration(serverArgs.LogRetentionPeriod) if err != nil { - return stacktrace.Propagate(err, "An error occurred parsing a Duration from provided log retention period string: %v", serverArgs.LogRetentionPeriod) + return stacktrace.Propagate(err, "An error occurred parsing a duration from provided log retention period string: %v", serverArgs.LogRetentionPeriod) } logsDatabaseClient := getLogsDatabaseClient(serverArgs.KurtosisBackendType, kurtosisBackend, logRetentionPeriodDuration) logsDatabaseClient.StartLogFileManagement(ctx) @@ -411,6 +411,9 @@ func getLogsDatabaseClient(kurtosisBackendType args.KurtosisBackendType, kurtosi realTime := logs_clock.NewRealClock() logRetentionPeriodInWeeks := int(math.Round(logRetentionPeriod.Hours() / float64(7*24*time.Hour))) + if logRetentionPeriodInWeeks < 1 { + logRetentionPeriodInWeeks = 1 + } osFs := volume_filesystem.NewOsVolumeFilesystem() perWeekFileLayout := file_layout.NewPerWeekFileLayout(realTime) logFileManager := log_file_manager.NewLogFileManager(kurtosisBackend, osFs, perWeekFileLayout, realTime, logRetentionPeriodInWeeks) From a3418c39d44434fe7980c66876d52d58d2766eed Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Mon, 19 Aug 2024 10:52:54 -0400 Subject: [PATCH 40/78] add docs --- cli/cli/commands/engine/restart/restart.go | 3 +-- cli/cli/commands/engine/start/start.go | 3 +-- cli/cli/commands/github/login/login.go | 2 +- cli/cli/defaults/defaults.go | 2 ++ docs/docs/cli-reference/engine-restart.md | 2 ++ docs/docs/cli-reference/engine-start.md | 1 + 6 files changed, 8 insertions(+), 5 deletions(-) diff --git a/cli/cli/commands/engine/restart/restart.go b/cli/cli/commands/engine/restart/restart.go index 3dfcd361b8..4cd9320a28 100644 --- a/cli/cli/commands/engine/restart/restart.go +++ b/cli/cli/commands/engine/restart/restart.go @@ -26,7 +26,6 @@ const ( enclavePoolSizeFlagKey = "enclave-pool-size" githubAuthTokenOverrideFlagKey = "github-auth-token" logRetentionPeriodFlagKey = "log-retention-period" - defaultLogRetentionPeriod = "168h" defaultEngineVersion = "" restartEngineOnSameVersionIfAnyRunning = false @@ -100,7 +99,7 @@ var RestartCmd = &lowlevel.LowlevelKurtosisCommand{ Usage: "The length of time that Kurtosis should keep logs for. Eg. if set to 1week, Kurtosis will remove all logs beyond 1 week.", Shorthand: "", Type: flags.FlagType_String, - Default: defaultLogRetentionPeriod, + Default: defaults.DefaultLogRetentionPeriod, }, }, PreValidationAndRunFunc: nil, diff --git a/cli/cli/commands/engine/start/start.go b/cli/cli/commands/engine/start/start.go index de185df3d8..a5b6df775a 100644 --- a/cli/cli/commands/engine/start/start.go +++ b/cli/cli/commands/engine/start/start.go @@ -26,7 +26,6 @@ const ( enclavePoolSizeFlagKey = "enclave-pool-size" githubAuthTokenOverrideFlagKey = "github-auth-token" logRetentionPeriodFlagKey = "log-retention-period" - defaultLogRetentionPeriod = "168h" defaultEngineVersion = "" kurtosisTechEngineImagePrefix = "kurtosistech/engine" @@ -101,7 +100,7 @@ var StartCmd = &lowlevel.LowlevelKurtosisCommand{ Usage: "The length of time that Kurtosis should keep logs for. Eg. if set to 1week, Kurtosis will remove all logs beyond 1 week.", Shorthand: "", Type: flags.FlagType_String, - Default: defaultLogRetentionPeriod, + Default: defaults.DefaultLogRetentionPeriod, }, }, PreValidationAndRunFunc: nil, diff --git a/cli/cli/commands/github/login/login.go b/cli/cli/commands/github/login/login.go index 4a7ca9b3f4..6ad37e2024 100644 --- a/cli/cli/commands/github/login/login.go +++ b/cli/cli/commands/github/login/login.go @@ -71,7 +71,7 @@ func RestartEngineAfterGitHubAuth(ctx context.Context) error { var engineClientCloseFunc func() error var restartEngineErr error dontRestartAPIContainers := false - _, engineClientCloseFunc, restartEngineErr = engineManager.RestartEngineIdempotently(ctx, defaults.DefaultEngineLogLevel, defaultEngineVersion, restartEngineOnSameVersionIfAnyRunning, defaults.DefaultEngineEnclavePoolSize, defaults.DefaultEnableDebugMode, defaults.DefaultGitHubAuthTokenOverride, dontRestartAPIContainers, defaults.DefaultDomain) + _, engineClientCloseFunc, restartEngineErr = engineManager.RestartEngineIdempotently(ctx, defaults.DefaultEngineLogLevel, defaultEngineVersion, restartEngineOnSameVersionIfAnyRunning, defaults.DefaultEngineEnclavePoolSize, defaults.DefaultEnableDebugMode, defaults.DefaultGitHubAuthTokenOverride, dontRestartAPIContainers, defaults.DefaultDomain, defaults.DefaultLogRetentionPeriod) if restartEngineErr != nil { return stacktrace.Propagate(restartEngineErr, "An error occurred restarting the Kurtosis engine") } diff --git a/cli/cli/defaults/defaults.go b/cli/cli/defaults/defaults.go index 84c52a430d..081138c00b 100644 --- a/cli/cli/defaults/defaults.go +++ b/cli/cli/defaults/defaults.go @@ -26,6 +26,8 @@ const ( DefaultGitHubAuthTokenOverride = "" DefaultDomain = "" + + DefaultLogRetentionPeriod = "168h" ) var DefaultApiContainerLogLevel = logrus.DebugLevel diff --git a/docs/docs/cli-reference/engine-restart.md b/docs/docs/cli-reference/engine-restart.md index 7ed0750d0f..d656178173 100644 --- a/docs/docs/cli-reference/engine-restart.md +++ b/docs/docs/cli-reference/engine-restart.md @@ -14,5 +14,7 @@ You may optionally pass in the following flags with this command: * `--log-level`: The level that the started engine should log at. Options include: `panic`, `fatal`, `error`, `warning`, `info`, `debug`, or `trace`. The engine logs at the `info` level by default. * `--version`: The version (Docker tag) of the Kurtosis engine that should be started. If not set, the engine will start up with the default version. * `--enclave-pool-size`: The size of the Kurtosis engine enclave pool. The enclave pool is a component of the Kurtosis engine that allows us to create and maintain 'n' number of idle enclaves for future use. This functionality allows to improve the performance for each new creation enclave request. +* `--github-auth-token`: The auth token to use for authorizing GitHub operations. If set, this will override the currently logged in GitHub user from `kurtosis github login`, if one exists. Note, this token does not persist when restarting the engine. +* `--log-retention-period`: The duration in which Kurtosis engine will keep logs for. The engine will remove any logs beyond this period. Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". (eg. "300ms", "-1.5h" or "2h45m", "168h") The default is set to 1 week (168h). NOTE: Currently, Kurtosis only supports setting retention on weekly intervals. Ongoing work is occurring to make this interval more granular - see https://github.com/kurtosis-tech/kurtosis/pull/2534 CAUTION: The `--enclave-pool-size` flag is only available for Kubernetes. \ No newline at end of file diff --git a/docs/docs/cli-reference/engine-start.md b/docs/docs/cli-reference/engine-start.md index 39955dc329..5dbb37f0e7 100644 --- a/docs/docs/cli-reference/engine-start.md +++ b/docs/docs/cli-reference/engine-start.md @@ -16,5 +16,6 @@ You may optionally pass in the following flags with this command: * `--version`: The version (Docker tag) of the Kurtosis engine that should be started. If not set, the engine will start up with the default version. * `--enclave-pool-size`: The size of the Kurtosis engine enclave pool. The enclave pool is a component of the Kurtosis engine that allows us to create and maintain 'n' number of idle enclaves for future use. This functionality allows to improve the performance for each new creation enclave request. * `--github-auth-token`: The auth token to use for authorizing GitHub operations. If set, this will override the currently logged in GitHub user from `kurtosis github login`, if one exists. Note, this token does not persist when restarting the engine. +* `--log-retention-period`: The duration in which Kurtosis engine will keep logs for. The engine will remove any logs beyond this period. Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". (eg. "300ms", "-1.5h" or "2h45m", "168h") The default is set to 1 week (168h). NOTE: Currently, Kurtosis only supports setting retention on weekly intervals. Ongoing work is occurring to make this interval more granular - see https://github.com/kurtosis-tech/kurtosis/pull/2534 CAUTION: The `--enclave-pool-size` flag is only available for Kubernetes. \ No newline at end of file From ddd274a7f054142ed22fd4a8cdb87d9a40af03ca Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Mon, 19 Aug 2024 10:55:08 -0400 Subject: [PATCH 41/78] log retention period --- engine/server/engine/main.go | 1 + 1 file changed, 1 insertion(+) diff --git a/engine/server/engine/main.go b/engine/server/engine/main.go index 2e1bcb094e..13d2ed2f9b 100644 --- a/engine/server/engine/main.go +++ b/engine/server/engine/main.go @@ -414,6 +414,7 @@ func getLogsDatabaseClient(kurtosisBackendType args.KurtosisBackendType, kurtosi if logRetentionPeriodInWeeks < 1 { logRetentionPeriodInWeeks = 1 } + logrus.Infof("Setting log retention period to '%v' weeks.", logRetentionPeriodInWeeks) osFs := volume_filesystem.NewOsVolumeFilesystem() perWeekFileLayout := file_layout.NewPerWeekFileLayout(realTime) logFileManager := log_file_manager.NewLogFileManager(kurtosisBackend, osFs, perWeekFileLayout, realTime, logRetentionPeriodInWeeks) From a8761a23c8ee8c04ba7e1050eb2e82a27c48409b Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Mon, 19 Aug 2024 10:57:45 -0400 Subject: [PATCH 42/78] grammar --- engine/server/engine/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine/server/engine/main.go b/engine/server/engine/main.go index 13d2ed2f9b..af5b0ef6ee 100644 --- a/engine/server/engine/main.go +++ b/engine/server/engine/main.go @@ -414,7 +414,7 @@ func getLogsDatabaseClient(kurtosisBackendType args.KurtosisBackendType, kurtosi if logRetentionPeriodInWeeks < 1 { logRetentionPeriodInWeeks = 1 } - logrus.Infof("Setting log retention period to '%v' weeks.", logRetentionPeriodInWeeks) + logrus.Infof("Setting log retention period to '%v' week(s).", logRetentionPeriodInWeeks) osFs := volume_filesystem.NewOsVolumeFilesystem() perWeekFileLayout := file_layout.NewPerWeekFileLayout(realTime) logFileManager := log_file_manager.NewLogFileManager(kurtosisBackend, osFs, perWeekFileLayout, realTime, logRetentionPeriodInWeeks) From a07b1ac97dca749beaf8d6851b65fdc1587c3c5f Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Mon, 19 Aug 2024 11:01:38 -0400 Subject: [PATCH 43/78] fill in default --- .../engine_consuming_kurtosis_command.go | 2 +- cli/cli/commands/cluster/set/set.go | 2 +- cli/cli/commands/enclave/add/add.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cli/cli/command_framework/highlevel/engine_consuming_kurtosis_command/engine_consuming_kurtosis_command.go b/cli/cli/command_framework/highlevel/engine_consuming_kurtosis_command/engine_consuming_kurtosis_command.go index 175edc9cbe..d17f47e2db 100644 --- a/cli/cli/command_framework/highlevel/engine_consuming_kurtosis_command/engine_consuming_kurtosis_command.go +++ b/cli/cli/command_framework/highlevel/engine_consuming_kurtosis_command/engine_consuming_kurtosis_command.go @@ -187,7 +187,7 @@ func (cmd *EngineConsumingKurtosisCommand) getSetupFunc() func(context.Context) kurtosisBackend := engineManager.GetKurtosisBackend() dontRestartAPIContainers := false - engineClient, closeClientFunc, err := engineManager.StartEngineIdempotentlyWithDefaultVersion(ctx, defaults.DefaultEngineLogLevel, defaults.DefaultEngineEnclavePoolSize, defaults.DefaultGitHubAuthTokenOverride, dontRestartAPIContainers, defaults.DefaultDomain, "") + engineClient, closeClientFunc, err := engineManager.StartEngineIdempotentlyWithDefaultVersion(ctx, defaults.DefaultEngineLogLevel, defaults.DefaultEngineEnclavePoolSize, defaults.DefaultGitHubAuthTokenOverride, dontRestartAPIContainers, defaults.DefaultDomain, defaults.DefaultLogRetentionPeriod) if err != nil { return nil, stacktrace.Propagate(err, "An error occurred creating a new Kurtosis engine client") } diff --git a/cli/cli/commands/cluster/set/set.go b/cli/cli/commands/cluster/set/set.go index 46192a945a..7227046ea8 100644 --- a/cli/cli/commands/cluster/set/set.go +++ b/cli/cli/commands/cluster/set/set.go @@ -124,7 +124,7 @@ func run(ctx context.Context, flags *flags.ParsedFlags, args *args.ParsedArgs) e // TODO - fix the idempotent starter longer term if engineStatus == engine_manager.EngineStatus_Stopped { dontRestartAPIContainers := false - _, engineClientCloseFunc, err := engineManagerNewCluster.StartEngineIdempotentlyWithDefaultVersion(ctx, defaults.DefaultEngineLogLevel, defaults.DefaultEngineEnclavePoolSize, defaults.DefaultGitHubAuthTokenOverride, dontRestartAPIContainers, defaults.DefaultDomain, "") + _, engineClientCloseFunc, err := engineManagerNewCluster.StartEngineIdempotentlyWithDefaultVersion(ctx, defaults.DefaultEngineLogLevel, defaults.DefaultEngineEnclavePoolSize, defaults.DefaultGitHubAuthTokenOverride, dontRestartAPIContainers, defaults.DefaultDomain, defaults.DefaultLogRetentionPeriod) if err != nil { return stacktrace.Propagate(err, "Engine could not be started after cluster was updated. Its status can be retrieved "+ "running 'kurtosis %s %s' and it can potentially be started running 'kurtosis %s %s'", diff --git a/cli/cli/commands/enclave/add/add.go b/cli/cli/commands/enclave/add/add.go index 92a78cc370..7c51077de8 100644 --- a/cli/cli/commands/enclave/add/add.go +++ b/cli/cli/commands/enclave/add/add.go @@ -121,7 +121,7 @@ func run( return stacktrace.Propagate(err, "An error occurred creating an engine manager.") } - engineClient, closeClientFunc, err := engineManager.StartEngineIdempotentlyWithDefaultVersion(ctx, defaults.DefaultEngineLogLevel, defaults.DefaultEngineEnclavePoolSize, defaults.DefaultGitHubAuthTokenOverride, dontRestartAPIContainers, defaults.DefaultDomain, "") + engineClient, closeClientFunc, err := engineManager.StartEngineIdempotentlyWithDefaultVersion(ctx, defaults.DefaultEngineLogLevel, defaults.DefaultEngineEnclavePoolSize, defaults.DefaultGitHubAuthTokenOverride, dontRestartAPIContainers, defaults.DefaultDomain, defaults.DefaultLogRetentionPeriod) if err != nil { return stacktrace.Propagate(err, "An error occurred creating a new Kurtosis engine client") } From 02e0bb33e28e7f8ec66efa5fb2e666e332f6e054 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Fri, 23 Aug 2024 15:53:44 -0400 Subject: [PATCH 44/78] start per hour file layout --- .../file_layout/file_layout.go | 2 +- .../file_layout/per_hour_file_layout.go | 106 ++++++++++++ .../file_layout/per_hour_file_layout_test.go | 163 ++++++++++++++++++ .../file_layout/per_week_file_layout.go | 11 +- .../file_layout/per_week_file_layout_test.go | 127 +++++++------- .../log_file_manager/log_file_manager.go | 12 +- .../log_file_manager/log_file_manager_test.go | 42 ++--- .../logs_clock/logs_clock.go | 41 +++-- ...istent_volume_logs_database_client_test.go | 16 +- .../per_week_stream_logs_strategy_test.go | 16 +- .../persistent_volume/volume_consts/consts.go | 18 -- 11 files changed, 414 insertions(+), 140 deletions(-) create mode 100644 engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go create mode 100644 engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go index 40ca4369f6..6e788efe69 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go @@ -21,6 +21,6 @@ type LogFileLayout interface { // GetLogFilePaths retrieves a list of filepaths [filesystem] for [serviceUuid] in [enclaveUuid] // If [retentionPeriodIntervals] is set to -1, retrieves all filepaths from the currentTime till [retentionPeriod] in order // If [retentionPeriodIntervals] is positive, retrieves all filepaths within the range [currentTime - retentionPeriod] and [currentTime - (retentionPeriodIntervals) * retentionPeriod] - // Returned filepaths sorted from most recent to least recent + // Returned filepaths sorted from oldest to most recent GetLogFilePaths(filesystem volume_filesystem.VolumeFilesystem, retentionPeriod time.Duration, retentionPeriodIntervals int, enclaveUuid, serviceUuid string) ([]string, error) } diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go new file mode 100644 index 0000000000..a4e7031895 --- /dev/null +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go @@ -0,0 +1,106 @@ +package file_layout + +import ( + "fmt" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" + "golang.org/x/exp/slices" + "math" + "os" + "strconv" + "time" +) + +const ( + // basepath year/week/day/hour/ + perHourDirPathFmtStr = "%s%s/%s/%s/%s/" + + // ... enclave-uuid/service-uuid + perHourFilePathFmtSt = perHourDirPathFmtStr + "%s/%s%s" +) + +type PerHourFileLayout struct { + time logs_clock.LogsClock +} + +func NewPerHourFileLayout(time logs_clock.LogsClock) *PerHourFileLayout { + return &PerHourFileLayout{ + time: time, + } +} + +func (phf *PerHourFileLayout) GetLogFileLayoutFormat() string { + // Right now this format is specifically made for Vector Logs Aggregators format + // This wil be used my Vector LogsAggregator to determine the path to output to + return fmt.Sprintf("%s%%Y/%%V/%%u/%%H/{{ enclave_uuid }}/{{ service_uuid }}.json", volume_consts.LogsStorageDirpath) +} + +func (phf *PerHourFileLayout) GetLogFilePath(time time.Time, enclaveUuid, serviceUuid string) string { + year, week := time.ISOWeek() + day := time.Weekday() + hour := time.Hour() + return getHourlyLogFilePath(year, week, int(day), hour, enclaveUuid, serviceUuid) +} + +func (phf *PerHourFileLayout) GetLogFilePaths( + filesystem volume_filesystem.VolumeFilesystem, + retentionPeriod time.Duration, + retentionPeriodIntervals int, + enclaveUuid, serviceUuid string, +) ([]string, error) { + var paths []string + currentTime := phf.time.Now() + retentionPeriodInHours := DurationToHours(retentionPeriod) + + // scan for first existing log file + firstHourWithLogs := 0 + for i := 0; i < retentionPeriodInHours; i++ { + year, week, day, hour := TimeToWeekDayHour(currentTime.Add(time.Duration(-i) * time.Hour)) + filePathStr := getHourlyLogFilePath(year, week, day, hour, enclaveUuid, serviceUuid) + if _, err := filesystem.Stat(filePathStr); err == nil { + paths = append(paths, filePathStr) + firstHourWithLogs = i + break + } else { + // return if error is not due to nonexistent file path + if !os.IsNotExist(err) { + return paths, err + } + } + } + + // scan for remaining files as far back as they exist before the retention period + for i := firstHourWithLogs + 1; i < retentionPeriodInHours; i++ { + year, week, day, hour := TimeToWeekDayHour(currentTime.Add(time.Duration(-i) * time.Hour)) + filePathStr := getHourlyLogFilePath(year, week, day, hour, enclaveUuid, serviceUuid) + if _, err := filesystem.Stat(filePathStr); err != nil { + break + } + paths = append(paths, filePathStr) + } + + // reverse for oldest to most recent + slices.Reverse(paths) + + return paths, nil +} + +func getHourlyLogFilePath(year, week, day, hour int, enclaveUuid, serviceUuid string) string { + // these match the format in which Vector outputs week, hours, days + formattedWeekNum := fmt.Sprintf("%02d", week) + formattedDayNum := fmt.Sprintf("%02d", day) + formattedHourNum := fmt.Sprintf("%02d", hour) + return fmt.Sprintf(perHourFilePathFmtSt, volume_consts.LogsStorageDirpath, strconv.Itoa(year), formattedWeekNum, formattedDayNum, formattedHourNum, enclaveUuid, serviceUuid, volume_consts.Filetype) +} + +func TimeToWeekDayHour(time time.Time) (int, int, int, int) { + year, week := time.ISOWeek() + hour := time.Hour() + day := int(time.Weekday()) + return year, week, day, hour +} + +func DurationToHours(duration time.Duration) int { + return int(math.Ceil(duration.Hours())) +} diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go new file mode 100644 index 0000000000..52026b7406 --- /dev/null +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go @@ -0,0 +1,163 @@ +package file_layout + +import ( + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" + "github.com/stretchr/testify/require" + "testing" + "time" +) + +func TestGetLogFilePath(t *testing.T) { + currentTime := logs_clock.NewMockLogsClock(2024, 1, 1, 1) + fileLayout := NewPerHourFileLayout(currentTime) + + expectedFilepath := "/var/log/kurtosis/2024/01/01/01/test-enclave/test-user-service-1.json" + now := currentTime.Now() + actualFilePath := fileLayout.GetLogFilePath(now, testEnclaveUuid, testUserService1Uuid) + require.Equal(t, expectedFilepath, actualFilePath) +} + +func TestGetLogFilePathsWithHourlyRetention(t *testing.T) { + filesystem := volume_filesystem.NewMockedVolumeFilesystem() + + currentTime := logs_clock.NewMockLogsClock(defaultYear, defaultWeek, defaultDay, 5) + fileLayout := NewPerHourFileLayout(currentTime) + + hourZeroFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, defaultDay, 0).Now(), testEnclaveUuid, testUserService1Uuid) + hourOneFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, defaultDay, 1).Now(), testEnclaveUuid, testUserService1Uuid) + hourTwoFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, defaultDay, 2).Now(), testEnclaveUuid, testUserService1Uuid) + hourThreeFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, defaultDay, 3).Now(), testEnclaveUuid, testUserService1Uuid) + hourFourFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, defaultDay, 4).Now(), testEnclaveUuid, testUserService1Uuid) + hourFiveFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, defaultDay, 5).Now(), testEnclaveUuid, testUserService1Uuid) + + createFilepaths(t, filesystem, []string{ + hourZeroFp, + hourOneFp, + hourTwoFp, + hourThreeFp, + hourFourFp, + hourFiveFp, + }) + + expectedLogFilePaths := []string{ + hourZeroFp, + hourOneFp, + hourTwoFp, + hourThreeFp, + hourFourFp, + hourFiveFp, + } + + retentionPeriod := 6 * time.Hour // retention period of 6 hours should return all the file paths + logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) + + require.NoError(t, err) + require.Equal(t, len(expectedLogFilePaths), len(logFilePaths)) + for i, filePath := range expectedLogFilePaths { + require.Equal(t, filePath, logFilePaths[i]) + } +} + +func TestGetLogFilePathsWithHourlyRetentionAcrossDays(t *testing.T) { + filesystem := volume_filesystem.NewMockedVolumeFilesystem() + + currentTime := logs_clock.NewMockLogsClock(defaultYear, defaultWeek, 1, 2) + fileLayout := NewPerHourFileLayout(currentTime) + + hourZeroFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, 0, 21).Now(), testEnclaveUuid, testUserService1Uuid) + hourOneFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, 0, 22).Now(), testEnclaveUuid, testUserService1Uuid) + hourTwoFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, 0, 23).Now(), testEnclaveUuid, testUserService1Uuid) + hourThreeFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) + hourFourFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, 1, 1).Now(), testEnclaveUuid, testUserService1Uuid) + hourFiveFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, 1, 2).Now(), testEnclaveUuid, testUserService1Uuid) + + createFilepaths(t, filesystem, []string{ + hourZeroFp, + hourOneFp, + hourTwoFp, + hourThreeFp, + hourFourFp, + hourFiveFp, + }) + + expectedLogFilePaths := []string{ + hourZeroFp, + hourOneFp, + hourTwoFp, + hourThreeFp, + hourFourFp, + hourFiveFp, + } + + retentionPeriod := 5 * time.Hour // retention period of 6 hours should return all the file paths + logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) + + require.NoError(t, err) + require.Equal(t, len(expectedLogFilePaths), len(logFilePaths)) + for i, filePath := range expectedLogFilePaths { + require.Equal(t, filePath, logFilePaths[i]) + } +} + +func TestGetLogFilePathsWithHourlyRetentionAcrossWeeks(t *testing.T) { + filesystem := volume_filesystem.NewMockedVolumeFilesystem() + + currentTime := logs_clock.NewMockLogsClock(defaultYear, defaultWeek, 1, 2) + fileLayout := NewPerHourFileLayout(currentTime) + + hourZeroFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, 0, 21).Now(), testEnclaveUuid, testUserService1Uuid) + hourOneFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, 0, 22).Now(), testEnclaveUuid, testUserService1Uuid) + hourTwoFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, 0, 23).Now(), testEnclaveUuid, testUserService1Uuid) + hourThreeFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) + hourFourFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, 1, 1).Now(), testEnclaveUuid, testUserService1Uuid) + hourFiveFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, 1, 2).Now(), testEnclaveUuid, testUserService1Uuid) + + createFilepaths(t, filesystem, []string{ + hourZeroFp, + hourOneFp, + hourTwoFp, + hourThreeFp, + hourFourFp, + hourFiveFp, + }) + + expectedLogFilePaths := []string{ + hourZeroFp, + hourOneFp, + hourTwoFp, + hourThreeFp, + hourFourFp, + hourFiveFp, + } + + retentionPeriod := 5 * time.Hour // retention period of 6 hours should return all the file paths + logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) + + require.NoError(t, err) + require.Equal(t, len(expectedLogFilePaths), len(logFilePaths)) + for i, filePath := range expectedLogFilePaths { + require.Equal(t, filePath, logFilePaths[i]) + } +} + +func TestGetLogFilePathsWithHourlyRetentionAcrossYears(t *testing.T) { + +} + +func createFilepaths(t *testing.T, filesystem volume_filesystem.VolumeFilesystem, filepaths []string) { + for _, path := range filepaths { + _, err := filesystem.Create(path) + require.NoError(t, err) + } +} + +// test get log file paths per hour across year + +// test get log file paths across days + +// test get log file paths across weeks + +// test get log file paths within the same day + +// test getting log file paths across days diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go index c4fcb7fd8f..b63324dfb6 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go @@ -16,11 +16,11 @@ const ( oneWeekInHours = 7 * 24 oneWeekDuration = oneWeekInHours * time.Hour - // basepath /year/week - PerWeekDirPathStr = "%s%s/%s/" + // basepath year/week + perWeekDirPathFmtStr = "%s%s/%s/" // ... enclave uuid/service uuid - PerWeekFilePathFmtStr = PerWeekDirPathStr + "%s/%s%s" + perWeekFilePathFmtStr = perWeekDirPathFmtStr + "%s/%s%s" ) type PerWeekFileLayout struct { @@ -34,7 +34,8 @@ func NewPerWeekFileLayout(time logs_clock.LogsClock) *PerWeekFileLayout { func (pwf *PerWeekFileLayout) GetLogFileLayoutFormat() string { // Right now this format is specifically made for Vector Logs Aggregators format // This wil be used my Vector LogsAggregator to determine the path to output to - return "/var/log/kurtosis/%%Y/%%V/{{ enclave_uuid }}/{{ service_uuid }}.json" + // is there a way to get rid of the /var/log/kurtosis? + return fmt.Sprintf("%s%%Y/%%V/{{ enclave_uuid }}/{{ service_uuid }}.json", volume_consts.LogsStorageDirpath) } func (pwf *PerWeekFileLayout) GetLogFilePath(time time.Time, enclaveUuid, serviceUuid string) string { @@ -120,5 +121,5 @@ func DurationToWeeks(d time.Duration) int { func getLogFilePath(year, week int, enclaveUuid, serviceUuid string) string { formattedWeekNum := fmt.Sprintf("%02d", week) - return fmt.Sprintf(PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(year), formattedWeekNum, enclaveUuid, serviceUuid, volume_consts.Filetype) + return fmt.Sprintf(perWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(year), formattedWeekNum, enclaveUuid, serviceUuid, volume_consts.Filetype) } diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go index 3c4731ed1b..f08bbbc614 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go @@ -14,6 +14,7 @@ const ( retentionPeriodInWeeksForTesting = 5 defaultYear = 2023 + defaultWeek = 17 defaultDay = 0 // sunday ) @@ -21,15 +22,15 @@ func TestGetLogFilePaths(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() currentWeek := 17 - currentTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) + currentTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay, 0) fileLayout := NewPerWeekFileLayout(currentTime) - week12filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 12, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week13filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 13, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week14filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 14, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week15filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 15, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week16filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 16, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week17filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 17, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week12filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 12, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week13filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 13, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week14filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 14, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week15filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 15, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week16filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 16, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week17filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 17, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = filesystem.Create(week12filepath) _, _ = filesystem.Create(week13filepath) @@ -60,15 +61,15 @@ func TestGetLogFilePathsAcrossNewYear(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() currentWeek := 2 - currentTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) + currentTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay, 0) fileLayout := NewPerWeekFileLayout(currentTime) // ../week/enclave uuid/service uuid.json - week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear-1, 50, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear-1, 51, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear-1, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear-1, 50, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear-1, 51, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear-1, 52, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 1, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 2, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = filesystem.Create(week50filepath) _, _ = filesystem.Create(week51filepath) @@ -98,15 +99,15 @@ func TestGetLogFilePathsAcrossNewYearWith53Weeks(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() currentWeek := 3 - currentTime := logs_clock.NewMockLogsClock(2016, currentWeek, 1) + currentTime := logs_clock.NewMockLogsClock(2016, currentWeek, 1, 0) fileLayout := NewPerWeekFileLayout(currentTime) // According to ISOWeek, 2015 has 53 weeks - week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2015, 51, 3).Now(), testEnclaveUuid, testUserService1Uuid) - week53filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2015, 52, 3).Now(), testEnclaveUuid, testUserService1Uuid) - week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2016, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2016, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week3filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2016, 3, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2015, 51, 7, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week53filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2015, 52, 7, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2016, 1, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2016, 2, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week3filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2016, 3, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = filesystem.Create(week52filepath) _, _ = filesystem.Create(week53filepath) @@ -136,13 +137,13 @@ func TestGetLogFilePathsWithDiffRetentionPeriod(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() currentWeek := 2 - mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) + mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay, 0) fileLayout := NewPerWeekFileLayout(mockTime) // ../week/enclave uuid/service uuid.json - week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear-1, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear-1, 52, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 1, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 2, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = filesystem.Create(week52filepath) _, _ = filesystem.Create(week1filepath) @@ -167,13 +168,13 @@ func TestGetLogFilePathsReturnsAllAvailableWeeks(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() currentWeek := 2 - currentTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) + currentTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay, 0) fileLayout := NewPerWeekFileLayout(currentTime) // ../week/enclave uuid/service uuid.json - week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear-1, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear-1, 52, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 1, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 2, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = filesystem.Create(week52filepath) _, _ = filesystem.Create(week1filepath) @@ -199,13 +200,13 @@ func TestGetLogFilePathsReturnsCorrectPathsIfWeeksMissingInBetween(t *testing.T) filesystem := volume_filesystem.NewMockedVolumeFilesystem() currentWeek := 3 - currentTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) + currentTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay, 0) fileLayout := NewPerWeekFileLayout(currentTime) // ../week/enclave uuid/service uuid.json - week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week3filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 3, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 0, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 1, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week3filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 3, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = filesystem.Create(week52filepath) _, _ = filesystem.Create(week1filepath) @@ -222,12 +223,12 @@ func TestGetLogFilePathsReturnsCorrectPathsIfCurrentWeekHasNoLogsYet(t *testing. filesystem := volume_filesystem.NewMockedVolumeFilesystem() currentWeek := 3 - currentTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) + currentTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay, 0) fileLayout := NewPerWeekFileLayout(currentTime) // ../week/enclave uuid/service uuid.json - week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 1, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 2, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) // no logs for week current week exist yet _, _ = filesystem.Create(week1filepath) @@ -252,15 +253,15 @@ func TestGetLogFilePathsReturnsCorrectPathsIfCurrentWeekHasNoLogsYet(t *testing. func TestGetLogFilePathsOneIntervalBeyondRetentionPeriod(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() - mockTime := logs_clock.NewMockLogsClock(2023, 2, defaultDay) + mockTime := logs_clock.NewMockLogsClock(2023, 2, defaultDay, 0) fileLayout := NewPerWeekFileLayout(mockTime) - week49filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 49, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 50, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 51, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week49filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 49, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 50, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 51, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 1, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 2, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = filesystem.Create(week49filepath) _, _ = filesystem.Create(week50filepath) @@ -279,16 +280,16 @@ func TestGetLogFilePathsOneIntervalBeyondRetentionPeriod(t *testing.T) { func TestGetLogFilePathsTwoIntervalBeyondRetentionPeriod(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() - mockTime := logs_clock.NewMockLogsClock(2023, 2, defaultDay) + mockTime := logs_clock.NewMockLogsClock(2023, 2, defaultDay, 0) fileLayout := NewPerWeekFileLayout(mockTime) - week48filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 48, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week49filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 49, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 50, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 51, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week48filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 48, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week49filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 49, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 50, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 51, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 1, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 2, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = filesystem.Create(week48filepath) _, _ = filesystem.Create(week49filepath) @@ -317,14 +318,14 @@ func TestGetLogFilePathsTwoIntervalBeyondRetentionPeriod(t *testing.T) { func TestGetLogFilePathsWithNoPathsBeyondRetentionPeriod(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() - mockTime := logs_clock.NewMockLogsClock(2023, 2, defaultDay) + mockTime := logs_clock.NewMockLogsClock(2023, 2, defaultDay, 0) fileLayout := NewPerWeekFileLayout(mockTime) - week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 50, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 51, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 50, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 51, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 1, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 2, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = filesystem.Create(week50filepath) _, _ = filesystem.Create(week51filepath) @@ -342,16 +343,16 @@ func TestGetLogFilePathsWithNoPathsBeyondRetentionPeriod(t *testing.T) { func TestGetLogFilePathsWithMissingPathBetweenIntervals(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() - mockTime := logs_clock.NewMockLogsClock(2023, 2, defaultDay) + mockTime := logs_clock.NewMockLogsClock(2023, 2, defaultDay, 0) fileLayout := NewPerWeekFileLayout(mockTime) - week47filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 48, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week49filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 49, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 50, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 51, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week47filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 48, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week49filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 49, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 50, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 51, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 1, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 2, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = filesystem.Create(week47filepath) // 48 is missing diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go index 9338df5d31..881db4607d 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go @@ -21,6 +21,10 @@ import ( const ( oneWeek = 7 * 24 * time.Hour + + removeLogsWaitHours = 6 * time.Hour + + createLogsWaitMinutes = 1 * time.Minute ) // LogFileManager is responsible for creating and removing log files from filesystem. @@ -55,10 +59,10 @@ func NewLogFileManager( func (manager *LogFileManager) StartLogFileManagement(ctx context.Context) { // Schedule thread for removing log files beyond retention period go func() { - logrus.Debugf("Scheduling log removal for log retention every '%v' hours...", volume_consts.RemoveLogsWaitHours) + logrus.Debugf("Scheduling log removal for log retention every '%v' hours...", removeLogsWaitHours) manager.RemoveLogsBeyondRetentionPeriod(ctx) - logRemovalTicker := time.NewTicker(volume_consts.RemoveLogsWaitHours) + logRemovalTicker := time.NewTicker(removeLogsWaitHours) for range logRemovalTicker.C { logrus.Debug("Attempting to remove old log file paths...") manager.RemoveLogsBeyondRetentionPeriod(ctx) @@ -72,9 +76,9 @@ func (manager *LogFileManager) StartLogFileManagement(ctx context.Context) { // The LogsAggregator is configured to write logs to three different log file paths, one for uuid, service name, and shortened uuid // This is so that the logs are retrievable by each identifier even when enclaves are stopped. More context on this here: https://github.com/kurtosis-tech/kurtosis/pull/1213 // To prevent storing duplicate logs, the CreateLogFiles will ensure that the service name and short uuid log files are just symlinks to the uuid log file path - logFileCreatorTicker := time.NewTicker(volume_consts.CreateLogsWaitMinutes) + logFileCreatorTicker := time.NewTicker(createLogsWaitMinutes) - logrus.Debugf("Scheduling log file path creation every '%v' minutes...", volume_consts.CreateLogsWaitMinutes) + logrus.Debugf("Scheduling log file path creation every '%v' minutes...", createLogsWaitMinutes) for range logFileCreatorTicker.C { logrus.Trace("Creating log file paths...") err := manager.CreateLogFiles(ctx) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go index 5d502597c5..8e19aa18e4 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go @@ -27,19 +27,19 @@ const ( func TestRemoveLogsBeyondRetentionPeriod(t *testing.T) { ctx := context.Background() - mockTime := logs_clock.NewMockLogsClock(2023, 2, defaultDay) + mockTime := logs_clock.NewMockLogsClock(2023, 2, defaultDay, 0) fileLayout := file_layout.NewPerWeekFileLayout(mockTime) mockKurtosisBackend := getMockedKurtosisBackendWithEnclavesAndServices(ctx, t, mockTime) // setup filesystem mockFs := volume_filesystem.NewMockedVolumeFilesystem() - week49filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 49, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 50, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 51, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week49filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 49, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 50, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 51, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 1, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 2, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = mockFs.Create(week49filepath) _, _ = mockFs.Create(week50filepath) @@ -58,16 +58,16 @@ func TestRemoveLogsBeyondRetentionPeriod(t *testing.T) { func TestRemoveEnclaveLogs(t *testing.T) { mockKurtosisBackend := backend_interface.NewMockKurtosisBackend(t) - mockTime := logs_clock.NewMockLogsClock(2022, 52, defaultDay) + mockTime := logs_clock.NewMockLogsClock(2022, 52, defaultDay, 0) fileLayout := file_layout.NewPerWeekFileLayout(mockTime) // setup filesystem mockFs := volume_filesystem.NewMockedVolumeFilesystem() - week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 51, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week52filepathDiffEnclave := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0).Now(), "enclaveOne", "serviceTwo") - week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week52filepathDiffService := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0).Now(), testEnclaveUuid, "serviceThree") + week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 51, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepathDiffEnclave := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0, 0).Now(), "enclaveOne", "serviceTwo") + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepathDiffService := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0, 0).Now(), testEnclaveUuid, "serviceThree") _, _ = mockFs.Create(week51filepath) _, _ = mockFs.Create(week52filepathDiffEnclave) @@ -97,16 +97,16 @@ func TestRemoveEnclaveLogs(t *testing.T) { func TestRemoveAllLogs(t *testing.T) { mockKurtosisBackend := backend_interface.NewMockKurtosisBackend(t) - mockTime := logs_clock.NewMockLogsClock(2022, 52, defaultDay) + mockTime := logs_clock.NewMockLogsClock(2022, 52, defaultDay, 0) fileLayout := file_layout.NewPerWeekFileLayout(mockTime) // setup filesystem mockFs := volume_filesystem.NewMockedVolumeFilesystem() - week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 51, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week52filepathDiffEnclave := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0).Now(), "enclaveOne", "serviceTwo") - week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week52filepathDiffService := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0).Now(), testEnclaveUuid, "serviceThree") + week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 51, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepathDiffEnclave := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0, 0).Now(), "enclaveOne", "serviceTwo") + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepathDiffService := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0, 0).Now(), testEnclaveUuid, "serviceThree") _, _ = mockFs.Create(week51filepath) _, _ = mockFs.Create(week52filepathDiffEnclave) @@ -136,7 +136,7 @@ func TestRemoveAllLogs(t *testing.T) { } func TestCreateLogFiles(t *testing.T) { - mockTime := logs_clock.NewMockLogsClock(2022, 52, defaultDay) + mockTime := logs_clock.NewMockLogsClock(2022, 52, defaultDay, 0) mockFs := volume_filesystem.NewMockedVolumeFilesystem() fileLayout := file_layout.NewPerWeekFileLayout(mockTime) @@ -144,9 +144,9 @@ func TestCreateLogFiles(t *testing.T) { ctx := context.Background() mockKurtosisBackend := getMockedKurtosisBackendWithEnclavesAndServices(ctx, t, mockTime) - expectedServiceUuidFilePath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) - expectedServiceNameFilePath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Name) - expectedServiceShortUuidFilePath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0).Now(), testEnclaveUuid, uuid_generator.ShortenedUUIDString(testUserService1Uuid)) + expectedServiceUuidFilePath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + expectedServiceNameFilePath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0, 0).Now(), testEnclaveUuid, testUserService1Name) + expectedServiceShortUuidFilePath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0, 0).Now(), testEnclaveUuid, uuid_generator.ShortenedUUIDString(testUserService1Uuid)) logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, 5) err := logFileManager.CreateLogFiles(ctx) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock/logs_clock.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock/logs_clock.go index f2a199589f..e06fa53dc9 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock/logs_clock.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock/logs_clock.go @@ -1,6 +1,9 @@ package logs_clock -import "time" +import ( + "fmt" + "time" +) const ( daysInWeek = 7 @@ -24,31 +27,45 @@ func (clock *RealLogsClock) Now() time.Time { } type MockLogsClock struct { - year, week, day int + year, week, day, hour int } // week 00-52 // day 0-7 -func NewMockLogsClock(year, week, day int) *MockLogsClock { +// hour 0-23 +func NewMockLogsClock(year, week, day, hour int) *MockLogsClock { return &MockLogsClock{ year: year, week: week, day: day, + hour: hour, } } // The mocked Now() function returns a time object representing the start of date specified by the year, week, and day func (clock *MockLogsClock) Now() time.Time { - // Create a time.Time object for January 1st of the given year - startOfYear := time.Date(clock.year, time.January, 1, 0, 0, 0, 0, time.UTC) + // Start with the first day of the year + firstDay := time.Date(clock.year, time.January, 1, 0, 0, 0, 0, time.UTC) + + // Adjust to the first ISO week of the year + isoYear, isoWeek := firstDay.ISOWeek() + if isoYear != clock.year { + // The first day of the year might be in the last week of the previous year + firstDay = firstDay.AddDate(0, 0, 8) + } - // Calculate the number of days to add to reach the start of the desired week. - daysToAdd := time.Duration(clock.week * daysInWeek) + // Find the difference to the desired week + days := (clock.week - isoWeek) * 7 - // Calculate the start of the desired week by adding days to the start of the year. - startOfWeek := startOfYear.Add(daysToAdd * 24 * time.Hour) + // Move to the desired day and hour + targetDay := firstDay.AddDate(0, 0, days+(clock.day-1)) + targetTime := targetDay.Add(time.Duration(clock.hour) * time.Hour) + + // Adjust if needed to ensure the correct ISO week and day + resultYear, resultWeek := targetTime.ISOWeek() + if resultYear != clock.year || resultWeek != clock.week || int(targetTime.Weekday()) != clock.day || targetTime.Hour() != clock.hour { + fmt.Printf("invalid year, week, day, hour combination") + } - // Adjust the start of the week to the beginning of the week (usually Sunday or Monday). - startOfWeek = startOfWeek.Add(time.Duration(clock.day) * 24 * time.Hour) - return startOfWeek + return targetTime } diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go index d245581bde..cc3fb557ac 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go @@ -131,7 +131,7 @@ func TestStreamUserServiceLogsPerWeek_WithFilters(t *testing.T) { } underlyingFs := createFilledPerWeekFilesystem(startingWeek) - mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay) + mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay, 0) perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( @@ -214,7 +214,7 @@ func TestStreamUserServiceLogsPerWeek_NoLogsFromPersistentVolume(t *testing.T) { } underlyingFs := createEmptyPerWeekFilesystem(startingWeek) - mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay) + mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay, 0) perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( @@ -319,7 +319,7 @@ func TestStreamUserServiceLogsPerWeek_ThousandsOfLogLinesSuccessfulExecution(t * _, err = file1.WriteString(logLinesStr) require.NoError(t, err) - mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay) + mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay, 0) perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( @@ -406,7 +406,7 @@ func TestStreamUserServiceLogsPerWeek_EmptyLogLines(t *testing.T) { _, err = file1.WriteString(logLinesStr) require.NoError(t, err) - mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay) + mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay, 0) perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( @@ -473,7 +473,7 @@ func TestStreamUserServiceLogsPerWeek_WithLogsAcrossWeeks(t *testing.T) { _, err = week3.WriteString(week3logLinesStr) require.NoError(t, err) - mockTime := logs_clock.NewMockLogsClock(defaultYear, 4, defaultDay) + mockTime := logs_clock.NewMockLogsClock(defaultYear, 4, defaultDay, 0) perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( @@ -542,7 +542,7 @@ func TestStreamUserServiceLogsPerWeek_WithLogLineAcrossWeeks(t *testing.T) { _, err = week3.WriteString(week3logLinesStr) require.NoError(t, err) - mockTime := logs_clock.NewMockLogsClock(defaultYear, 4, defaultDay) + mockTime := logs_clock.NewMockLogsClock(defaultYear, 4, defaultDay, 0) perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( @@ -593,7 +593,7 @@ func TestStreamUserServiceLogsPerWeekReturnsTimestampedLogLines(t *testing.T) { _, err = file.WriteString(timestampedLogLinesStr) require.NoError(t, err) - mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay) + mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay, 0) perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) expectedTime, err := time.Parse(utcFormat, defaultUTCTimestampStr) @@ -697,7 +697,7 @@ func executeStreamCallAndGetReceivedServiceLogLines( kurtosisBackend := backend_interface.NewMockKurtosisBackend(t) // no log file management is done in these tests so values for logFileManager aren't important - mockTime := logs_clock.NewMockLogsClock(0, 0, 0) + mockTime := logs_clock.NewMockLogsClock(0, 0, 0, 0) fileLayout := file_layout.NewPerWeekFileLayout(mockTime) logFileManager := log_file_manager.NewLogFileManager(kurtosisBackend, underlyingFs, fileLayout, mockTime, 0) logsDatabaseClient := NewPersistentVolumeLogsDatabaseClient(kurtosisBackend, underlyingFs, logFileManager, streamStrategy) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy_test.go index 6339688daa..d684aa5503 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy_test.go @@ -55,7 +55,7 @@ func TestGetLogFilePaths(t *testing.T) { week17filepath, } - mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) + mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay, 0) strategy := NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) logFilePaths, err := strategy.getLogFilePaths(filesystem, retentionPeriodInWeeksForTesting, testEnclaveUuid, testUserService1Uuid) @@ -92,7 +92,7 @@ func TestGetLogFilePathsAcrossNewYear(t *testing.T) { week2filepath, } - mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) + mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay, 0) strategy := NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) logFilePaths, err := strategy.getLogFilePaths(filesystem, retentionPeriodInWeeksForTesting, testEnclaveUuid, testUserService1Uuid) @@ -129,7 +129,7 @@ func TestGetLogFilePathsAcrossNewYearWith53Weeks(t *testing.T) { week3filepath, } - mockTime := logs_clock.NewMockLogsClock(2016, currentWeek, 1) + mockTime := logs_clock.NewMockLogsClock(2016, currentWeek, 1, 0) strategy := NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) logFilePaths, err := strategy.getLogFilePaths(filesystem, retentionPeriodInWeeksForTesting, testEnclaveUuid, testUserService1Uuid) @@ -161,7 +161,7 @@ func TestGetLogFilePathsWithDiffRetentionPeriod(t *testing.T) { week2filepath, } - mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) + mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay, 0) strategy := NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) logFilePaths, err := strategy.getLogFilePaths(filesystem, retentionPeriod, testEnclaveUuid, testUserService1Uuid) @@ -193,7 +193,7 @@ func TestGetLogFilePathsReturnsAllAvailableWeeks(t *testing.T) { currentWeek := 2 - mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) + mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay, 0) strategy := NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) logFilePaths, err := strategy.getLogFilePaths(filesystem, retentionPeriodInWeeksForTesting, testEnclaveUuid, testUserService1Uuid) @@ -218,7 +218,7 @@ func TestGetLogFilePathsReturnsCorrectPathsIfWeeksMissingInBetween(t *testing.T) currentWeek := 3 - mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) + mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay, 0) strategy := NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) logFilePaths, err := strategy.getLogFilePaths(filesystem, retentionPeriodInWeeksForTesting, testEnclaveUuid, testUserService1Uuid) @@ -230,7 +230,7 @@ func TestGetLogFilePathsReturnsCorrectPathsIfWeeksMissingInBetween(t *testing.T) func TestGetLogFilePathsReturnsCorrectPathsIfCurrentWeekHasNoLogsYet(t *testing.T) { // currently in week 3 currentWeek := 3 - mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay) + mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay, 0) filesystem := volume_filesystem.NewMockedVolumeFilesystem() @@ -265,7 +265,7 @@ func TestIsWithinRetentionPeriod(t *testing.T) { } // week 41 would put the log line outside the retention period - mockTime := logs_clock.NewMockLogsClock(2023, 41, 0) + mockTime := logs_clock.NewMockLogsClock(2023, 41, 0, 0) strategy := NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) timestamp, err := parseTimestampFromJsonLogLine(jsonLogLine) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts/consts.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts/consts.go index a2f53c054c..c0582c807b 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts/consts.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts/consts.go @@ -1,9 +1,5 @@ package volume_consts -import ( - "time" -) - const ( // Location of logs on the filesystem of the engine LogsStorageDirpath = "/var/log/kurtosis/" @@ -17,20 +13,6 @@ const ( EndOfJsonLine = "}" - // promise to keep 1 weeks of logs for users - LogRetentionPeriodInWeeks = 1 - - RemoveLogsWaitHours = 6 * time.Hour - - CreateLogsWaitMinutes = 1 * time.Minute - // basepath/enclave uuid/service uuid PerFileFmtStr = "%s%s/%s%s" - - // TODO: remove these from consts once PerWeekFileLayout is fully merged - // basepath /year/week - PerWeekDirPathStr = "%s%s/%s/" - - // ... enclave uuid/service uuid - PerWeekFilePathFmtStr = PerWeekDirPathStr + "%s/%s%s" ) From 703e13c1b06f757221aab53604c84b68428b5c24 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Mon, 14 Oct 2024 20:14:55 +0900 Subject: [PATCH 45/78] rename weekly and hourly filepath methods --- .../file_layout/file_layout.go | 4 +-- .../file_layout/per_hour_file_layout.go | 36 +++++++++++++++++-- .../file_layout/per_hour_file_layout_test.go | 4 +++ .../file_layout/per_week_file_layout.go | 10 +++--- .../per_week_stream_logs_strategy.go | 4 +-- 5 files changed, 46 insertions(+), 12 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go index 6e788efe69..2e2720bb9d 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go @@ -9,8 +9,8 @@ type LogFileLayout interface { // GetLogFileLayoutFormat returns a string representation the "format" that files are laid out in // Formats are composed: // - "/" - representing a nested directory - // - "" - representing where an enclave uuid is inserted - // - "" - representing where a service uuid is inserted + // - "{{ enclaveUuid }}" - representing where an enclave uuid is inserted + // - "{{ serviceUuid }}" - representing where a service uuid is inserted // - time formats specified by strftime https://cplusplus.com/reference/ctime/strftime/ // - any other ascii text GetLogFileLayoutFormat() string diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go index a4e7031895..012f4af97f 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go @@ -50,15 +50,27 @@ func (phf *PerHourFileLayout) GetLogFilePaths( enclaveUuid, serviceUuid string, ) ([]string, error) { var paths []string - currentTime := phf.time.Now() retentionPeriodInHours := DurationToHours(retentionPeriod) + if retentionPeriodIntervals < 0 { + return phf.getLogFilePathsFromNowTillRetentionPeriod(filesystem, retentionPeriodInHours, enclaveUuid, serviceUuid) + } else { + paths = phf.getLogFilePathsBeyondRetentionPeriod(filesystem, retentionPeriodInHours, retentionPeriodIntervals, enclaveUuid, serviceUuid) + } + + return paths, nil +} + +func (phf *PerHourFileLayout) getLogFilePathsFromNowTillRetentionPeriod(fs volume_filesystem.VolumeFilesystem, retentionPeriodInHours int, enclaveUuid, serviceUuid string) ([]string, error) { + var paths []string + currentTime := phf.time.Now() + // scan for first existing log file firstHourWithLogs := 0 for i := 0; i < retentionPeriodInHours; i++ { year, week, day, hour := TimeToWeekDayHour(currentTime.Add(time.Duration(-i) * time.Hour)) filePathStr := getHourlyLogFilePath(year, week, day, hour, enclaveUuid, serviceUuid) - if _, err := filesystem.Stat(filePathStr); err == nil { + if _, err := fs.Stat(filePathStr); err == nil { paths = append(paths, filePathStr) firstHourWithLogs = i break @@ -74,7 +86,7 @@ func (phf *PerHourFileLayout) GetLogFilePaths( for i := firstHourWithLogs + 1; i < retentionPeriodInHours; i++ { year, week, day, hour := TimeToWeekDayHour(currentTime.Add(time.Duration(-i) * time.Hour)) filePathStr := getHourlyLogFilePath(year, week, day, hour, enclaveUuid, serviceUuid) - if _, err := filesystem.Stat(filePathStr); err != nil { + if _, err := fs.Stat(filePathStr); err != nil { break } paths = append(paths, filePathStr) @@ -86,6 +98,24 @@ func (phf *PerHourFileLayout) GetLogFilePaths( return paths, nil } +func (phf *PerHourFileLayout) getLogFilePathsBeyondRetentionPeriod(fs volume_filesystem.VolumeFilesystem, retentionPeriodInHours int, retentionPeriodIntervals int, enclaveUuid, serviceUuid string) []string { + var paths []string + currentTime := phf.time.Now() + + // scan for log files just beyond the retention period + for i := 0; i < retentionPeriodIntervals; i++ { + numHoursToGoBack := retentionPeriodInHours + i + year, week, day, hour := TimeToWeekDayHour(currentTime.Add(time.Duration(-numHoursToGoBack) * time.Hour)) + filePathStr := getHourlyLogFilePath(year, week, day, hour, enclaveUuid, serviceUuid) + if _, err := fs.Stat(filePathStr); err != nil { + continue + } + paths = append(paths, filePathStr) + } + + return paths +} + func getHourlyLogFilePath(year, week, day, hour int, enclaveUuid, serviceUuid string) string { // these match the format in which Vector outputs week, hours, days formattedWeekNum := fmt.Sprintf("%02d", week) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go index 52026b7406..2841c18c7f 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go @@ -145,6 +145,10 @@ func TestGetLogFilePathsWithHourlyRetentionAcrossYears(t *testing.T) { } +func TestDurationToHour(t *testing.T) { + +} + func createFilepaths(t *testing.T, filesystem volume_filesystem.VolumeFilesystem, filepaths []string) { for _, path := range filepaths { _, err := filesystem.Create(path) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go index b63324dfb6..0b6799beb8 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go @@ -40,7 +40,7 @@ func (pwf *PerWeekFileLayout) GetLogFileLayoutFormat() string { func (pwf *PerWeekFileLayout) GetLogFilePath(time time.Time, enclaveUuid, serviceUuid string) string { year, week := time.ISOWeek() - return getLogFilePath(year, week, enclaveUuid, serviceUuid) + return getWeeklyFilePath(year, week, enclaveUuid, serviceUuid) } func (pwf *PerWeekFileLayout) GetLogFilePaths( @@ -68,7 +68,7 @@ func (pwf *PerWeekFileLayout) getLogFilePathsFromNowTillRetentionPeriod(fs volum firstWeekWithLogs := 0 for i := 0; i < retentionPeriodInWeeks; i++ { year, week := currentTime.Add(time.Duration(-i) * oneWeekDuration).ISOWeek() - filePathStr := getLogFilePath(year, week, enclaveUuid, serviceUuid) + filePathStr := getWeeklyFilePath(year, week, enclaveUuid, serviceUuid) if _, err := fs.Stat(filePathStr); err == nil { paths = append(paths, filePathStr) firstWeekWithLogs = i @@ -84,7 +84,7 @@ func (pwf *PerWeekFileLayout) getLogFilePathsFromNowTillRetentionPeriod(fs volum // scan for remaining files as far back as they exist before the retention period for i := firstWeekWithLogs + 1; i < retentionPeriodInWeeks; i++ { year, week := currentTime.Add(time.Duration(-i) * oneWeekDuration).ISOWeek() - filePathStr := getLogFilePath(year, week, enclaveUuid, serviceUuid) + filePathStr := getWeeklyFilePath(year, week, enclaveUuid, serviceUuid) if _, err := fs.Stat(filePathStr); err != nil { break } @@ -105,7 +105,7 @@ func (pwf *PerWeekFileLayout) getLogFilePathsBeyondRetentionPeriod(fs volume_fil for i := 0; i < retentionPeriodIntervals; i++ { numWeeksToGoBack := retentionPeriodInWeeks + i year, weekToRemove := currentTime.Add(time.Duration(-numWeeksToGoBack) * oneWeekDuration).ISOWeek() - filePathStr := getLogFilePath(year, weekToRemove, enclaveUuid, serviceUuid) + filePathStr := getWeeklyFilePath(year, weekToRemove, enclaveUuid, serviceUuid) if _, err := fs.Stat(filePathStr); err != nil { continue } @@ -119,7 +119,7 @@ func DurationToWeeks(d time.Duration) int { return int(math.Round(d.Hours() / float64(oneWeekInHours))) } -func getLogFilePath(year, week int, enclaveUuid, serviceUuid string) string { +func getWeeklyFilePath(year, week int, enclaveUuid, serviceUuid string) string { formattedWeekNum := fmt.Sprintf("%02d", week) return fmt.Sprintf(perWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(year), formattedWeekNum, enclaveUuid, serviceUuid, volume_consts.Filetype) } diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go index 26d7be80ae..7ee7192431 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go @@ -112,9 +112,9 @@ func (strategy *PerWeekStreamLogsStrategy) StreamLogs( // [getLogFilePaths] returns a list of log file paths containing logs for [serviceUuid] in [enclaveUuid] // going [retentionPeriodInWeeks] back from the [currentWeek]. // Notes: -// - File paths are of the format '/week/enclave uuid/service uuid.json' where 'week' is %V strftime specifier +// - File paths are of the format '/week/{{ enclave uuid }}/{{ service uuid }}.json' where 'week' is %V strftime specifier // - The list of file paths is returned in order of oldest logs to most recent logs e.g. [ 03/80124/1234.json, /04/801234/1234.json, ...] -// - If a file path does not exist, the function with exits and returns whatever file paths were found +// - If a file path does not exist, the function exits and returns whatever file paths were found func (strategy *PerWeekStreamLogsStrategy) getLogFilePaths(filesystem volume_filesystem.VolumeFilesystem, retentionPeriodInWeeks int, enclaveUuid, serviceUuid string) ([]string, error) { // TODO: embed FileLayout into StreamLogsStrategy interface perWeekFileLayout := file_layout.NewPerWeekFileLayout(strategy.time) From a35a8ac1679371791d1ee9f08f913ac857851531 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Mon, 14 Oct 2024 20:38:30 +0900 Subject: [PATCH 46/78] use new mock logs clock constructor for per week --- .../file_layout/per_week_file_layout_test.go | 127 +++++++++--------- .../logs_clock/logs_clock.go | 46 +++---- 2 files changed, 84 insertions(+), 89 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go index f08bbbc614..456d668ed0 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go @@ -14,7 +14,6 @@ const ( retentionPeriodInWeeksForTesting = 5 defaultYear = 2023 - defaultWeek = 17 defaultDay = 0 // sunday ) @@ -22,15 +21,15 @@ func TestGetLogFilePaths(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() currentWeek := 17 - currentTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay, 0) + currentTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) fileLayout := NewPerWeekFileLayout(currentTime) - week12filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 12, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week13filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 13, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week14filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 14, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week15filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 15, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week16filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 16, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week17filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 17, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week12filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear, 12, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week13filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear, 13, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week14filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear, 14, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week15filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear, 15, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week16filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear, 16, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week17filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear, 17, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = filesystem.Create(week12filepath) _, _ = filesystem.Create(week13filepath) @@ -61,15 +60,15 @@ func TestGetLogFilePathsAcrossNewYear(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() currentWeek := 2 - currentTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay, 0) + currentTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) fileLayout := NewPerWeekFileLayout(currentTime) // ../week/enclave uuid/service uuid.json - week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear-1, 50, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear-1, 51, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear-1, 52, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 1, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 2, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear-1, 50, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear-1, 51, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear-1, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = filesystem.Create(week50filepath) _, _ = filesystem.Create(week51filepath) @@ -99,15 +98,15 @@ func TestGetLogFilePathsAcrossNewYearWith53Weeks(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() currentWeek := 3 - currentTime := logs_clock.NewMockLogsClock(2016, currentWeek, 1, 0) + currentTime := logs_clock.NewMockLogsClockPerDay(2016, currentWeek, 1) fileLayout := NewPerWeekFileLayout(currentTime) // According to ISOWeek, 2015 has 53 weeks - week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2015, 51, 7, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week53filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2015, 52, 7, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2016, 1, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2016, 2, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week3filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2016, 3, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2015, 51, 3).Now(), testEnclaveUuid, testUserService1Uuid) + week53filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2015, 52, 3).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2016, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2016, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week3filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2016, 3, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = filesystem.Create(week52filepath) _, _ = filesystem.Create(week53filepath) @@ -137,13 +136,13 @@ func TestGetLogFilePathsWithDiffRetentionPeriod(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() currentWeek := 2 - mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay, 0) + mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) fileLayout := NewPerWeekFileLayout(mockTime) // ../week/enclave uuid/service uuid.json - week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear-1, 52, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 1, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 2, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear-1, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = filesystem.Create(week52filepath) _, _ = filesystem.Create(week1filepath) @@ -168,13 +167,13 @@ func TestGetLogFilePathsReturnsAllAvailableWeeks(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() currentWeek := 2 - currentTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay, 0) + currentTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) fileLayout := NewPerWeekFileLayout(currentTime) // ../week/enclave uuid/service uuid.json - week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear-1, 52, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 1, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 2, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear-1, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = filesystem.Create(week52filepath) _, _ = filesystem.Create(week1filepath) @@ -200,13 +199,13 @@ func TestGetLogFilePathsReturnsCorrectPathsIfWeeksMissingInBetween(t *testing.T) filesystem := volume_filesystem.NewMockedVolumeFilesystem() currentWeek := 3 - currentTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay, 0) + currentTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) fileLayout := NewPerWeekFileLayout(currentTime) // ../week/enclave uuid/service uuid.json - week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 0, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 1, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week3filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 3, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week3filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear, 3, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = filesystem.Create(week52filepath) _, _ = filesystem.Create(week1filepath) @@ -223,12 +222,12 @@ func TestGetLogFilePathsReturnsCorrectPathsIfCurrentWeekHasNoLogsYet(t *testing. filesystem := volume_filesystem.NewMockedVolumeFilesystem() currentWeek := 3 - currentTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay, 0) + currentTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) fileLayout := NewPerWeekFileLayout(currentTime) // ../week/enclave uuid/service uuid.json - week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 1, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, 2, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) // no logs for week current week exist yet _, _ = filesystem.Create(week1filepath) @@ -253,15 +252,15 @@ func TestGetLogFilePathsReturnsCorrectPathsIfCurrentWeekHasNoLogsYet(t *testing. func TestGetLogFilePathsOneIntervalBeyondRetentionPeriod(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() - mockTime := logs_clock.NewMockLogsClock(2023, 2, defaultDay, 0) + mockTime := logs_clock.NewMockLogsClockPerDay(2023, 2, defaultDay) fileLayout := NewPerWeekFileLayout(mockTime) - week49filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 49, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 50, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 51, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 1, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 2, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week49filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 49, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 50, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 51, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2023, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2023, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = filesystem.Create(week49filepath) _, _ = filesystem.Create(week50filepath) @@ -280,16 +279,16 @@ func TestGetLogFilePathsOneIntervalBeyondRetentionPeriod(t *testing.T) { func TestGetLogFilePathsTwoIntervalBeyondRetentionPeriod(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() - mockTime := logs_clock.NewMockLogsClock(2023, 2, defaultDay, 0) + mockTime := logs_clock.NewMockLogsClockPerDay(2023, 2, defaultDay) fileLayout := NewPerWeekFileLayout(mockTime) - week48filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 48, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week49filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 49, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 50, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 51, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 1, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 2, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week48filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 48, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week49filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 49, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 50, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 51, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2023, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2023, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = filesystem.Create(week48filepath) _, _ = filesystem.Create(week49filepath) @@ -318,14 +317,14 @@ func TestGetLogFilePathsTwoIntervalBeyondRetentionPeriod(t *testing.T) { func TestGetLogFilePathsWithNoPathsBeyondRetentionPeriod(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() - mockTime := logs_clock.NewMockLogsClock(2023, 2, defaultDay, 0) + mockTime := logs_clock.NewMockLogsClockPerDay(2023, 2, defaultDay) fileLayout := NewPerWeekFileLayout(mockTime) - week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 50, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 51, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 1, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 2, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 50, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 51, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2023, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2023, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = filesystem.Create(week50filepath) _, _ = filesystem.Create(week51filepath) @@ -343,16 +342,16 @@ func TestGetLogFilePathsWithNoPathsBeyondRetentionPeriod(t *testing.T) { func TestGetLogFilePathsWithMissingPathBetweenIntervals(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() - mockTime := logs_clock.NewMockLogsClock(2023, 2, defaultDay, 0) + mockTime := logs_clock.NewMockLogsClockPerDay(2023, 2, defaultDay) fileLayout := NewPerWeekFileLayout(mockTime) - week47filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 48, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week49filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 49, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 50, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 51, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 1, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 2, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week47filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 48, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week49filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 49, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 50, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 51, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2023, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2023, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = filesystem.Create(week47filepath) // 48 is missing diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock/logs_clock.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock/logs_clock.go index e06fa53dc9..8ac3997139 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock/logs_clock.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock/logs_clock.go @@ -1,7 +1,6 @@ package logs_clock import ( - "fmt" "time" ) @@ -26,13 +25,22 @@ func (clock *RealLogsClock) Now() time.Time { return time.Now() } +// week 00-52 +// day 0-7 +// hour 0-23 type MockLogsClock struct { year, week, day, hour int } -// week 00-52 -// day 0-7 -// hour 0-23 +func NewMockLogsClockPerDay(year, week, day int) *MockLogsClock { + return &MockLogsClock{ + year: year, + week: week, + day: day, + hour: 0, + } +} + func NewMockLogsClock(year, week, day, hour int) *MockLogsClock { return &MockLogsClock{ year: year, @@ -44,28 +52,16 @@ func NewMockLogsClock(year, week, day, hour int) *MockLogsClock { // The mocked Now() function returns a time object representing the start of date specified by the year, week, and day func (clock *MockLogsClock) Now() time.Time { - // Start with the first day of the year - firstDay := time.Date(clock.year, time.January, 1, 0, 0, 0, 0, time.UTC) + // Create a time.Time object for January 1st of the given year + startOfYear := time.Date(clock.year, time.January, 1, 0, 0, 0, 0, time.UTC) - // Adjust to the first ISO week of the year - isoYear, isoWeek := firstDay.ISOWeek() - if isoYear != clock.year { - // The first day of the year might be in the last week of the previous year - firstDay = firstDay.AddDate(0, 0, 8) - } - - // Find the difference to the desired week - days := (clock.week - isoWeek) * 7 + // Calculate the number of days to add to reach the start of the desired week. + daysToAdd := time.Duration(clock.week * daysInWeek) - // Move to the desired day and hour - targetDay := firstDay.AddDate(0, 0, days+(clock.day-1)) - targetTime := targetDay.Add(time.Duration(clock.hour) * time.Hour) - - // Adjust if needed to ensure the correct ISO week and day - resultYear, resultWeek := targetTime.ISOWeek() - if resultYear != clock.year || resultWeek != clock.week || int(targetTime.Weekday()) != clock.day || targetTime.Hour() != clock.hour { - fmt.Printf("invalid year, week, day, hour combination") - } + // Calculate the start of the desired week by adding days to the start of the year. + startOfWeek := startOfYear.Add(daysToAdd * 24 * time.Hour) - return targetTime + // Adjust the start of the week to the beginning of the week (usually Sunday or Monday). + startOfWeek = startOfWeek.Add(time.Duration(clock.day) * 24 * time.Hour) + return startOfWeek } From fcf9a22b3c819ac42276a327e8903ffdf4593fdb Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Mon, 14 Oct 2024 21:46:28 +0900 Subject: [PATCH 47/78] test mock logs clock --- .../logs_clock/logs_clock.go | 32 ++++--- .../logs_clock/logs_clock_test.go | 86 +++++++++++++++++++ 2 files changed, 107 insertions(+), 11 deletions(-) create mode 100644 engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock/logs_clock_test.go diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock/logs_clock.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock/logs_clock.go index 8ac3997139..710a4b3d13 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock/logs_clock.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock/logs_clock.go @@ -41,7 +41,7 @@ func NewMockLogsClockPerDay(year, week, day int) *MockLogsClock { } } -func NewMockLogsClock(year, week, day, hour int) *MockLogsClock { +func NewMockLogsClockPerHour(year, week, day, hour int) *MockLogsClock { return &MockLogsClock{ year: year, week: week, @@ -50,18 +50,28 @@ func NewMockLogsClock(year, week, day, hour int) *MockLogsClock { } } -// The mocked Now() function returns a time object representing the start of date specified by the year, week, and day func (clock *MockLogsClock) Now() time.Time { - // Create a time.Time object for January 1st of the given year - startOfYear := time.Date(clock.year, time.January, 1, 0, 0, 0, 0, time.UTC) + // Create a time object for January 4th of the given year (ISO week 1 always includes January 4th). + startOfYear := time.Date(clock.year, time.January, 4, clock.hour, 0, 0, 0, time.UTC) - // Calculate the number of days to add to reach the start of the desired week. - daysToAdd := time.Duration(clock.week * daysInWeek) + // Get the Monday of the first ISO week of the year + isoYearStart := startOfYear.AddDate(0, 0, int(time.Monday-startOfYear.Weekday())) - // Calculate the start of the desired week by adding days to the start of the year. - startOfWeek := startOfYear.Add(daysToAdd * 24 * time.Hour) + // Adjust for Sunday as day 0 in the tests (Go uses Sunday as the first day of the week, but ISO uses Monday). + var dayToAdd int + if clock.day == 0 { + // If the test input day is 0 (Sunday), we need to handle it as the 7th day of the week. + dayToAdd = 6 + } else { + // Otherwise, shift the day back by 1 to align with ISO (Monday as 1, etc.). + dayToAdd = clock.day - 1 + } + + // Calculate the number of days to add based on the week and adjusted day. + daysToAdd := (clock.week-1)*daysInWeek + dayToAdd + + // Add the calculated days to the ISO week start and return the result. + mockTime := isoYearStart.AddDate(0, 0, daysToAdd) - // Adjust the start of the week to the beginning of the week (usually Sunday or Monday). - startOfWeek = startOfWeek.Add(time.Duration(clock.day) * 24 * time.Hour) - return startOfWeek + return mockTime } diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock/logs_clock_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock/logs_clock_test.go new file mode 100644 index 0000000000..c79e7bd6af --- /dev/null +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock/logs_clock_test.go @@ -0,0 +1,86 @@ +package logs_clock + +import ( + "testing" +) + +func TestMockLogsClockPerDay(t *testing.T) { + tests := []struct { + year int + week int + day int + description string + }{ + {2024, 1, 0, "First day of ISO week 1 (Sunday)"}, + {2024, 1, 1, "Second day of ISO week 1 (Monday)"}, + {2024, 1, 2, "Third day of ISO week 1 (Tuesday)"}, + {2024, 1, 3, "Fourth day of ISO week 1 (Wednesday)"}, + {2024, 1, 4, "Fifth day of ISO week 1 (Thursday)"}, + {2024, 1, 5, "Sixth day of ISO week 1 (Friday)"}, + {2024, 1, 6, "Last day of ISO week 1 (Saturday)"}, + {2024, 52, 0, "First day of ISO week 52 (Sunday)"}, + {2024, 52, 1, "First day of ISO week 52 (Monday)"}, + {2024, 52, 5, "Fifth day of ISO week 52 (Friday)"}, + {2024, 52, 6, "Last day of ISO week 52 (Saturday)"}, + {2024, 48, 0, "First day of ISO week 48 (Sunday)"}, + {2024, 48, 4, "Fifth day of ISO week 48 (Thursday)"}, + {2024, 24, 2, "Third day of ISO week 24 (Tuesday)"}, + } + + for _, test := range tests { + t.Run(test.description, func(t *testing.T) { + clock := NewMockLogsClockPerDay(test.year, test.week, test.day) + result := clock.Now() + + // Get the ISO week and day from the result + year, week := result.ISOWeek() + day := int(result.Weekday()) + + if year != test.year || week != test.week || day != test.day { + t.Errorf("Expected (year: %d, week: %d, day: %d) but got (year: %d, week: %d, day: %d)", + test.year, test.week, test.day, year, week, day) + } + }) + } +} + +func TestMockLogsClockPerHour(t *testing.T) { + tests := []struct { + year int + week int + day int + hour int + description string + }{ + {2024, 1, 0, 0, "First day of ISO week 1, hour 0 (Sunday)"}, + {2024, 1, 0, 12, "First day of ISO week 1, hour 12 (Sunday)"}, + {2024, 1, 1, 0, "Second day of ISO week 1, hour 0 (Monday)"}, + {2024, 1, 1, 6, "Second day of ISO week 1, hour 6 (Monday)"}, + {2024, 1, 2, 0, "Third day of ISO week 1, hour 0 (Tuesday)"}, + {2024, 1, 6, 23, "Last day of ISO week 1, hour 23 (Saturday)"}, + {2024, 52, 0, 0, "First day of ISO week 52, hour 0 (Sunday)"}, + {2024, 52, 1, 0, "First day of ISO week 52, hour 0 (Monday)"}, + {2024, 52, 5, 12, "Fifth day of ISO week 52, hour 12 (Friday)"}, + {2024, 52, 6, 0, "Last day of ISO week 52, hour 0 (Saturday)"}, + {2024, 48, 0, 0, "First day of ISO week 48, hour 0 (Sunday)"}, + {2024, 48, 4, 18, "Fifth day of ISO week 48, hour 18 (Thursday)"}, + {2024, 24, 2, 15, "Third day of ISO week 24, hour 15 (Tuesday)"}, + } + + for _, test := range tests { + t.Run(test.description, func(t *testing.T) { + clock := NewMockLogsClockPerHour(test.year, test.week, test.day, test.hour) + result := clock.Now() + + // Get the ISO week, day, and hour from the result + year, week := result.ISOWeek() + day := int(result.Weekday()) + hour := result.Hour() + + if year != test.year || week != test.week || day != test.day || hour != test.hour { + t.Errorf("Expected (year: %d, week: %d, day: %d, hour: %d) but got (year: %d, week: %d, day: %d, hour: %d)", + test.year, test.week, test.day, test.hour, year, week, day, hour) + } + }) + } +} From 0fe7f9e1d1f324c1a01e40f525444ac2e4e1da3d Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Mon, 14 Oct 2024 22:49:55 +0900 Subject: [PATCH 48/78] fix tests --- .../file_layout/per_hour_file_layout_test.go | 52 +++++++++---------- .../file_layout/per_week_file_layout_test.go | 1 + 2 files changed, 25 insertions(+), 28 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go index 2841c18c7f..a50bbbf24e 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go @@ -9,7 +9,7 @@ import ( ) func TestGetLogFilePath(t *testing.T) { - currentTime := logs_clock.NewMockLogsClock(2024, 1, 1, 1) + currentTime := logs_clock.NewMockLogsClockPerHour(2024, 1, 1, 1) fileLayout := NewPerHourFileLayout(currentTime) expectedFilepath := "/var/log/kurtosis/2024/01/01/01/test-enclave/test-user-service-1.json" @@ -21,15 +21,15 @@ func TestGetLogFilePath(t *testing.T) { func TestGetLogFilePathsWithHourlyRetention(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() - currentTime := logs_clock.NewMockLogsClock(defaultYear, defaultWeek, defaultDay, 5) + currentTime := logs_clock.NewMockLogsClockPerHour(defaultYear, defaultWeek, defaultDay, 5) fileLayout := NewPerHourFileLayout(currentTime) - hourZeroFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, defaultDay, 0).Now(), testEnclaveUuid, testUserService1Uuid) - hourOneFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, defaultDay, 1).Now(), testEnclaveUuid, testUserService1Uuid) - hourTwoFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, defaultDay, 2).Now(), testEnclaveUuid, testUserService1Uuid) - hourThreeFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, defaultDay, 3).Now(), testEnclaveUuid, testUserService1Uuid) - hourFourFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, defaultDay, 4).Now(), testEnclaveUuid, testUserService1Uuid) - hourFiveFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, defaultDay, 5).Now(), testEnclaveUuid, testUserService1Uuid) + hourZeroFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(defaultYear, defaultWeek, defaultDay, 0).Now(), testEnclaveUuid, testUserService1Uuid) + hourOneFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(defaultYear, defaultWeek, defaultDay, 1).Now(), testEnclaveUuid, testUserService1Uuid) + hourTwoFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(defaultYear, defaultWeek, defaultDay, 2).Now(), testEnclaveUuid, testUserService1Uuid) + hourThreeFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(defaultYear, defaultWeek, defaultDay, 3).Now(), testEnclaveUuid, testUserService1Uuid) + hourFourFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(defaultYear, defaultWeek, defaultDay, 4).Now(), testEnclaveUuid, testUserService1Uuid) + hourFiveFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(defaultYear, defaultWeek, defaultDay, 5).Now(), testEnclaveUuid, testUserService1Uuid) createFilepaths(t, filesystem, []string{ hourZeroFp, @@ -62,15 +62,15 @@ func TestGetLogFilePathsWithHourlyRetention(t *testing.T) { func TestGetLogFilePathsWithHourlyRetentionAcrossDays(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() - currentTime := logs_clock.NewMockLogsClock(defaultYear, defaultWeek, 1, 2) + currentTime := logs_clock.NewMockLogsClockPerHour(defaultYear, defaultWeek, 2, 2) fileLayout := NewPerHourFileLayout(currentTime) - hourZeroFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, 0, 21).Now(), testEnclaveUuid, testUserService1Uuid) - hourOneFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, 0, 22).Now(), testEnclaveUuid, testUserService1Uuid) - hourTwoFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, 0, 23).Now(), testEnclaveUuid, testUserService1Uuid) - hourThreeFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) - hourFourFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, 1, 1).Now(), testEnclaveUuid, testUserService1Uuid) - hourFiveFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, 1, 2).Now(), testEnclaveUuid, testUserService1Uuid) + hourZeroFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(defaultYear, defaultWeek, 1, 21).Now(), testEnclaveUuid, testUserService1Uuid) + hourOneFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(defaultYear, defaultWeek, 1, 22).Now(), testEnclaveUuid, testUserService1Uuid) + hourTwoFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(defaultYear, defaultWeek, 1, 23).Now(), testEnclaveUuid, testUserService1Uuid) + hourThreeFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(defaultYear, defaultWeek, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) + hourFourFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(defaultYear, defaultWeek, 2, 1).Now(), testEnclaveUuid, testUserService1Uuid) + hourFiveFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(defaultYear, defaultWeek, 2, 2).Now(), testEnclaveUuid, testUserService1Uuid) createFilepaths(t, filesystem, []string{ hourZeroFp, @@ -90,7 +90,7 @@ func TestGetLogFilePathsWithHourlyRetentionAcrossDays(t *testing.T) { hourFiveFp, } - retentionPeriod := 5 * time.Hour // retention period of 6 hours should return all the file paths + retentionPeriod := 6 * time.Hour // retention period of 6 hours should return all the file paths logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) require.NoError(t, err) @@ -103,15 +103,15 @@ func TestGetLogFilePathsWithHourlyRetentionAcrossDays(t *testing.T) { func TestGetLogFilePathsWithHourlyRetentionAcrossWeeks(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() - currentTime := logs_clock.NewMockLogsClock(defaultYear, defaultWeek, 1, 2) + currentTime := logs_clock.NewMockLogsClockPerHour(defaultYear, 18, 1, 2) fileLayout := NewPerHourFileLayout(currentTime) - hourZeroFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, 0, 21).Now(), testEnclaveUuid, testUserService1Uuid) - hourOneFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, 0, 22).Now(), testEnclaveUuid, testUserService1Uuid) - hourTwoFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, 0, 23).Now(), testEnclaveUuid, testUserService1Uuid) - hourThreeFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) - hourFourFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, 1, 1).Now(), testEnclaveUuid, testUserService1Uuid) - hourFiveFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(defaultYear, defaultWeek, 1, 2).Now(), testEnclaveUuid, testUserService1Uuid) + hourZeroFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(defaultYear, 17, 0, 21).Now(), testEnclaveUuid, testUserService1Uuid) + hourOneFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(defaultYear, 17, 0, 22).Now(), testEnclaveUuid, testUserService1Uuid) + hourTwoFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(defaultYear, 17, 0, 23).Now(), testEnclaveUuid, testUserService1Uuid) + hourThreeFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(defaultYear, 18, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) + hourFourFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(defaultYear, 18, 1, 1).Now(), testEnclaveUuid, testUserService1Uuid) + hourFiveFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(defaultYear, 18, 1, 2).Now(), testEnclaveUuid, testUserService1Uuid) createFilepaths(t, filesystem, []string{ hourZeroFp, @@ -131,7 +131,7 @@ func TestGetLogFilePathsWithHourlyRetentionAcrossWeeks(t *testing.T) { hourFiveFp, } - retentionPeriod := 5 * time.Hour // retention period of 6 hours should return all the file paths + retentionPeriod := 6 * time.Hour // retention period of 6 hours should return all the file paths logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) require.NoError(t, err) @@ -157,11 +157,7 @@ func createFilepaths(t *testing.T, filesystem volume_filesystem.VolumeFilesystem } // test get log file paths per hour across year - // test get log file paths across days - // test get log file paths across weeks - // test get log file paths within the same day - // test getting log file paths across days diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go index 456d668ed0..86eb46e62f 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go @@ -14,6 +14,7 @@ const ( retentionPeriodInWeeksForTesting = 5 defaultYear = 2023 + defaultWeek = 17 defaultDay = 0 // sunday ) From 80dfc9400137a1983f7abe8bad3184d926127159 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Mon, 14 Oct 2024 22:50:06 +0900 Subject: [PATCH 49/78] add todo --- .../persistent_volume/log_file_manager/log_file_manager.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go index 881db4607d..f011f8b481 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go @@ -257,6 +257,8 @@ func (manager *LogFileManager) createSymlinkLogFile(targetLogFilePath, symlinkLo return nil } +// TODO: implement the functionality from these methods into file layout + // creates a directory path of format //year/week// func getEnclaveLogsDirPath(year, week int, enclaveUuid string) string { logsDirPathForYearAndWeek := getLogsDirPathForWeek(year, week) From 878b65e1b800a9bed29eb12d3a2b499eb74913ef Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Mon, 14 Oct 2024 23:18:47 +0900 Subject: [PATCH 50/78] refactor --- .../file_layout/per_hour_file_layout_test.go | 12 +++--- .../file_layout/per_week_file_layout.go | 4 +- .../log_file_manager/log_file_manager_test.go | 42 +++++++++---------- ...istent_volume_logs_database_client_test.go | 42 +++++++++---------- .../per_week_stream_logs_strategy_test.go | 19 +++++---- engine/server/go.mod | 4 +- engine/server/go.sum | 16 +++++++ 7 files changed, 79 insertions(+), 60 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go index a50bbbf24e..516d1e85d9 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go @@ -145,6 +145,12 @@ func TestGetLogFilePathsWithHourlyRetentionAcrossYears(t *testing.T) { } +// test get log file paths per hour across year +// test get log file paths across days +// test get log file paths across weeks +// test get log file paths within the same day +// test getting log file paths across days + func TestDurationToHour(t *testing.T) { } @@ -155,9 +161,3 @@ func createFilepaths(t *testing.T, filesystem volume_filesystem.VolumeFilesystem require.NoError(t, err) } } - -// test get log file paths per hour across year -// test get log file paths across days -// test get log file paths across weeks -// test get log file paths within the same day -// test getting log file paths across days diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go index 0b6799beb8..47684d9e76 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go @@ -20,7 +20,7 @@ const ( perWeekDirPathFmtStr = "%s%s/%s/" // ... enclave uuid/service uuid - perWeekFilePathFmtStr = perWeekDirPathFmtStr + "%s/%s%s" + PerWeekFilePathFmtStr = perWeekDirPathFmtStr + "%s/%s%s" ) type PerWeekFileLayout struct { @@ -121,5 +121,5 @@ func DurationToWeeks(d time.Duration) int { func getWeeklyFilePath(year, week int, enclaveUuid, serviceUuid string) string { formattedWeekNum := fmt.Sprintf("%02d", week) - return fmt.Sprintf(perWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(year), formattedWeekNum, enclaveUuid, serviceUuid, volume_consts.Filetype) + return fmt.Sprintf(PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(year), formattedWeekNum, enclaveUuid, serviceUuid, volume_consts.Filetype) } diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go index 8e19aa18e4..855610fe44 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go @@ -27,19 +27,19 @@ const ( func TestRemoveLogsBeyondRetentionPeriod(t *testing.T) { ctx := context.Background() - mockTime := logs_clock.NewMockLogsClock(2023, 2, defaultDay, 0) + mockTime := logs_clock.NewMockLogsClockPerDay(2023, 2, defaultDay) fileLayout := file_layout.NewPerWeekFileLayout(mockTime) mockKurtosisBackend := getMockedKurtosisBackendWithEnclavesAndServices(ctx, t, mockTime) // setup filesystem mockFs := volume_filesystem.NewMockedVolumeFilesystem() - week49filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 49, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 50, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 51, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 1, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2023, 2, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week49filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 49, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 50, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 51, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2023, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week2filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2023, 2, 0).Now(), testEnclaveUuid, testUserService1Uuid) _, _ = mockFs.Create(week49filepath) _, _ = mockFs.Create(week50filepath) @@ -58,16 +58,16 @@ func TestRemoveLogsBeyondRetentionPeriod(t *testing.T) { func TestRemoveEnclaveLogs(t *testing.T) { mockKurtosisBackend := backend_interface.NewMockKurtosisBackend(t) - mockTime := logs_clock.NewMockLogsClock(2022, 52, defaultDay, 0) + mockTime := logs_clock.NewMockLogsClockPerDay(2022, 52, defaultDay) fileLayout := file_layout.NewPerWeekFileLayout(mockTime) // setup filesystem mockFs := volume_filesystem.NewMockedVolumeFilesystem() - week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 51, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week52filepathDiffEnclave := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0, 0).Now(), "enclaveOne", "serviceTwo") - week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week52filepathDiffService := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0, 0).Now(), testEnclaveUuid, "serviceThree") + week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 51, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepathDiffEnclave := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 52, 0).Now(), "enclaveOne", "serviceTwo") + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepathDiffService := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 52, 0).Now(), testEnclaveUuid, "serviceThree") _, _ = mockFs.Create(week51filepath) _, _ = mockFs.Create(week52filepathDiffEnclave) @@ -97,16 +97,16 @@ func TestRemoveEnclaveLogs(t *testing.T) { func TestRemoveAllLogs(t *testing.T) { mockKurtosisBackend := backend_interface.NewMockKurtosisBackend(t) - mockTime := logs_clock.NewMockLogsClock(2022, 52, defaultDay, 0) + mockTime := logs_clock.NewMockLogsClockPerDay(2022, 52, defaultDay) fileLayout := file_layout.NewPerWeekFileLayout(mockTime) // setup filesystem mockFs := volume_filesystem.NewMockedVolumeFilesystem() - week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 51, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week52filepathDiffEnclave := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0, 0).Now(), "enclaveOne", "serviceTwo") - week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - week52filepathDiffService := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0, 0).Now(), testEnclaveUuid, "serviceThree") + week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 51, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepathDiffEnclave := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 52, 0).Now(), "enclaveOne", "serviceTwo") + week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) + week52filepathDiffService := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 52, 0).Now(), testEnclaveUuid, "serviceThree") _, _ = mockFs.Create(week51filepath) _, _ = mockFs.Create(week52filepathDiffEnclave) @@ -136,7 +136,7 @@ func TestRemoveAllLogs(t *testing.T) { } func TestCreateLogFiles(t *testing.T) { - mockTime := logs_clock.NewMockLogsClock(2022, 52, defaultDay, 0) + mockTime := logs_clock.NewMockLogsClockPerDay(2022, 52, defaultDay) mockFs := volume_filesystem.NewMockedVolumeFilesystem() fileLayout := file_layout.NewPerWeekFileLayout(mockTime) @@ -144,9 +144,9 @@ func TestCreateLogFiles(t *testing.T) { ctx := context.Background() mockKurtosisBackend := getMockedKurtosisBackendWithEnclavesAndServices(ctx, t, mockTime) - expectedServiceUuidFilePath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) - expectedServiceNameFilePath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0, 0).Now(), testEnclaveUuid, testUserService1Name) - expectedServiceShortUuidFilePath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClock(2022, 52, 0, 0).Now(), testEnclaveUuid, uuid_generator.ShortenedUUIDString(testUserService1Uuid)) + expectedServiceUuidFilePath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) + expectedServiceNameFilePath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Name) + expectedServiceShortUuidFilePath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 52, 0).Now(), testEnclaveUuid, uuid_generator.ShortenedUUIDString(testUserService1Uuid)) logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, 5) err := logFileManager.CreateLogFiles(ctx) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go index cc3fb557ac..5118e56a7d 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go @@ -131,7 +131,7 @@ func TestStreamUserServiceLogsPerWeek_WithFilters(t *testing.T) { } underlyingFs := createFilledPerWeekFilesystem(startingWeek) - mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay, 0) + mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( @@ -214,7 +214,7 @@ func TestStreamUserServiceLogsPerWeek_NoLogsFromPersistentVolume(t *testing.T) { } underlyingFs := createEmptyPerWeekFilesystem(startingWeek) - mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay, 0) + mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( @@ -313,13 +313,13 @@ func TestStreamUserServiceLogsPerWeek_ThousandsOfLogLinesSuccessfulExecution(t * underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() // %02d to format week num with leading zeros so 1-9 are converted to 01-09 for %V format formattedWeekNum := fmt.Sprintf("%02d", startingWeek) - file1PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, string(enclaveUuid), testUserService1Uuid, volume_consts.Filetype) + file1PathStr := fmt.Sprintf(file_layout.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, string(enclaveUuid), testUserService1Uuid, volume_consts.Filetype) file1, err := underlyingFs.Create(file1PathStr) require.NoError(t, err) _, err = file1.WriteString(logLinesStr) require.NoError(t, err) - mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay, 0) + mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( @@ -400,13 +400,13 @@ func TestStreamUserServiceLogsPerWeek_EmptyLogLines(t *testing.T) { underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() formattedWeekNum := fmt.Sprintf("%02d", startingWeek) - file1PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, string(enclaveUuid), testUserService1Uuid, volume_consts.Filetype) + file1PathStr := fmt.Sprintf(file_layout.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, string(enclaveUuid), testUserService1Uuid, volume_consts.Filetype) file1, err := underlyingFs.Create(file1PathStr) require.NoError(t, err) _, err = file1.WriteString(logLinesStr) require.NoError(t, err) - mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay, 0) + mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( @@ -460,20 +460,20 @@ func TestStreamUserServiceLogsPerWeek_WithLogsAcrossWeeks(t *testing.T) { week4logLinesStr := strings.Join(week4logLines, "\n") formattedWeekFour := fmt.Sprintf("%02d", 4) - week4filepath := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekFour, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) + week4filepath := fmt.Sprintf(file_layout.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekFour, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) week4, err := underlyingFs.Create(week4filepath) require.NoError(t, err) _, err = week4.WriteString(week4logLinesStr) require.NoError(t, err) formattedWeekThree := fmt.Sprintf("%02d", 3) - week3filepath := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekThree, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) + week3filepath := fmt.Sprintf(file_layout.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekThree, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) week3, err := underlyingFs.Create(week3filepath) require.NoError(t, err) _, err = week3.WriteString(week3logLinesStr) require.NoError(t, err) - mockTime := logs_clock.NewMockLogsClock(defaultYear, 4, defaultDay, 0) + mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, 4, defaultDay) perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( @@ -529,20 +529,20 @@ func TestStreamUserServiceLogsPerWeek_WithLogLineAcrossWeeks(t *testing.T) { week4logLinesStr := strings.Join(week4logLines, "\n") + "\n" formattedWeekFour := fmt.Sprintf("%02d", 4) - week4filepath := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekFour, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) + week4filepath := fmt.Sprintf(file_layout.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekFour, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) week4, err := underlyingFs.Create(week4filepath) require.NoError(t, err) _, err = week4.WriteString(week4logLinesStr) require.NoError(t, err) formattedWeekThree := fmt.Sprintf("%02d", 3) - week3filepath := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekThree, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) + week3filepath := fmt.Sprintf(file_layout.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekThree, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) week3, err := underlyingFs.Create(week3filepath) require.NoError(t, err) _, err = week3.WriteString(week3logLinesStr) require.NoError(t, err) - mockTime := logs_clock.NewMockLogsClock(defaultYear, 4, defaultDay, 0) + mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, 4, defaultDay) perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( @@ -587,13 +587,13 @@ func TestStreamUserServiceLogsPerWeekReturnsTimestampedLogLines(t *testing.T) { underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() formattedWeekNum := fmt.Sprintf("%02d", startingWeek) - filepath := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) + filepath := fmt.Sprintf(file_layout.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) file, err := underlyingFs.Create(filepath) require.NoError(t, err) _, err = file.WriteString(timestampedLogLinesStr) require.NoError(t, err) - mockTime := logs_clock.NewMockLogsClock(defaultYear, startingWeek, defaultDay, 0) + mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) expectedTime, err := time.Parse(utcFormat, defaultUTCTimestampStr) @@ -697,7 +697,7 @@ func executeStreamCallAndGetReceivedServiceLogLines( kurtosisBackend := backend_interface.NewMockKurtosisBackend(t) // no log file management is done in these tests so values for logFileManager aren't important - mockTime := logs_clock.NewMockLogsClock(0, 0, 0, 0) + mockTime := logs_clock.NewMockLogsClockPerDay(0, 0, 0) fileLayout := file_layout.NewPerWeekFileLayout(mockTime) logFileManager := log_file_manager.NewLogFileManager(kurtosisBackend, underlyingFs, fileLayout, mockTime, 0) logsDatabaseClient := NewPersistentVolumeLogsDatabaseClient(kurtosisBackend, underlyingFs, logFileManager, streamStrategy) @@ -784,9 +784,9 @@ func createFilledPerWeekFilesystem(week int) volume_filesystem.VolumeFilesystem logLinesStr := strings.Join(logLines, "\n") // %02d to format week num with leading zeros so 1-9 are converted to 01-09 for %V format formattedWeekNum := fmt.Sprintf("%02d", week) - file1PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) - file2PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService2Uuid, volume_consts.Filetype) - file3PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService3Uuid, volume_consts.Filetype) + file1PathStr := fmt.Sprintf(file_layout.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) + file2PathStr := fmt.Sprintf(file_layout.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService2Uuid, volume_consts.Filetype) + file3PathStr := fmt.Sprintf(file_layout.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService3Uuid, volume_consts.Filetype) mapFs := volume_filesystem.NewMockedVolumeFilesystem() @@ -819,9 +819,9 @@ func createEmptyPerFileFilesystem() volume_filesystem.VolumeFilesystem { func createEmptyPerWeekFilesystem(week int) volume_filesystem.VolumeFilesystem { // %02d to format week num with leading zeros so 1-9 are converted to 01-09 for %V format formattedWeekNum := fmt.Sprintf("%02d", week) - file1PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) - file2PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService2Uuid, volume_consts.Filetype) - file3PathStr := fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService3Uuid, volume_consts.Filetype) + file1PathStr := fmt.Sprintf(file_layout.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) + file2PathStr := fmt.Sprintf(file_layout.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService2Uuid, volume_consts.Filetype) + file3PathStr := fmt.Sprintf(file_layout.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService3Uuid, volume_consts.Filetype) mapFs := volume_filesystem.NewMockedVolumeFilesystem() diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy_test.go index d684aa5503..6d52dea218 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy_test.go @@ -3,6 +3,7 @@ package stream_logs_strategy import ( "bufio" "fmt" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" @@ -55,7 +56,7 @@ func TestGetLogFilePaths(t *testing.T) { week17filepath, } - mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay, 0) + mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) strategy := NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) logFilePaths, err := strategy.getLogFilePaths(filesystem, retentionPeriodInWeeksForTesting, testEnclaveUuid, testUserService1Uuid) @@ -92,7 +93,7 @@ func TestGetLogFilePathsAcrossNewYear(t *testing.T) { week2filepath, } - mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay, 0) + mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) strategy := NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) logFilePaths, err := strategy.getLogFilePaths(filesystem, retentionPeriodInWeeksForTesting, testEnclaveUuid, testUserService1Uuid) @@ -129,7 +130,7 @@ func TestGetLogFilePathsAcrossNewYearWith53Weeks(t *testing.T) { week3filepath, } - mockTime := logs_clock.NewMockLogsClock(2016, currentWeek, 1, 0) + mockTime := logs_clock.NewMockLogsClockPerDay(2016, currentWeek, 1) strategy := NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) logFilePaths, err := strategy.getLogFilePaths(filesystem, retentionPeriodInWeeksForTesting, testEnclaveUuid, testUserService1Uuid) @@ -161,7 +162,7 @@ func TestGetLogFilePathsWithDiffRetentionPeriod(t *testing.T) { week2filepath, } - mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay, 0) + mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) strategy := NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) logFilePaths, err := strategy.getLogFilePaths(filesystem, retentionPeriod, testEnclaveUuid, testUserService1Uuid) @@ -193,7 +194,7 @@ func TestGetLogFilePathsReturnsAllAvailableWeeks(t *testing.T) { currentWeek := 2 - mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay, 0) + mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) strategy := NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) logFilePaths, err := strategy.getLogFilePaths(filesystem, retentionPeriodInWeeksForTesting, testEnclaveUuid, testUserService1Uuid) @@ -218,7 +219,7 @@ func TestGetLogFilePathsReturnsCorrectPathsIfWeeksMissingInBetween(t *testing.T) currentWeek := 3 - mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay, 0) + mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) strategy := NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) logFilePaths, err := strategy.getLogFilePaths(filesystem, retentionPeriodInWeeksForTesting, testEnclaveUuid, testUserService1Uuid) @@ -230,7 +231,7 @@ func TestGetLogFilePathsReturnsCorrectPathsIfWeeksMissingInBetween(t *testing.T) func TestGetLogFilePathsReturnsCorrectPathsIfCurrentWeekHasNoLogsYet(t *testing.T) { // currently in week 3 currentWeek := 3 - mockTime := logs_clock.NewMockLogsClock(defaultYear, currentWeek, defaultDay, 0) + mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) filesystem := volume_filesystem.NewMockedVolumeFilesystem() @@ -265,7 +266,7 @@ func TestIsWithinRetentionPeriod(t *testing.T) { } // week 41 would put the log line outside the retention period - mockTime := logs_clock.NewMockLogsClock(2023, 41, 0, 0) + mockTime := logs_clock.NewMockLogsClockPerDay(2023, 41, 0) strategy := NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) timestamp, err := parseTimestampFromJsonLogLine(jsonLogLine) @@ -281,7 +282,7 @@ func TestIsWithinRetentionPeriod(t *testing.T) { func getWeekFilepathStr(year, week int) string { // %02d to format week num with leading zeros so 1-9 are converted to 01-09 for %V format formattedWeekNum := fmt.Sprintf("%02d", week) - return fmt.Sprintf(volume_consts.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(year), formattedWeekNum, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) + return fmt.Sprintf(file_layout.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(year), formattedWeekNum, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) } func TestGetCompleteJsonLogString(t *testing.T) { diff --git a/engine/server/go.mod b/engine/server/go.mod index 4660cedcc6..77720dcce2 100644 --- a/engine/server/go.mod +++ b/engine/server/go.mod @@ -1,6 +1,8 @@ module github.com/kurtosis-tech/kurtosis/engine/server -go 1.20 +go 1.21 + +toolchain go1.22.7 replace ( github.com/kurtosis-tech/kurtosis/api/golang => ../../api/golang diff --git a/engine/server/go.sum b/engine/server/go.sum index c027f4c074..7091283936 100644 --- a/engine/server/go.sum +++ b/engine/server/go.sum @@ -25,6 +25,7 @@ cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUM cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/compute v1.20.1 h1:6aKEtlUiwEpJzM001l0yFkpXmUVXaN8W+fbkb2AZNbg= +cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= @@ -53,6 +54,7 @@ github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMz github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= @@ -65,6 +67,7 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/containerd/containerd v1.7.2 h1:UF2gdONnxO8I6byZXDi5sXWiWvlW3D/sci7dTQimEJo= github.com/containerd/containerd v1.7.2/go.mod h1:afcz74+K10M/+cjGHIVQrCt3RAQhUSCAjJ9iMYhhkuI= github.com/containerd/typeurl/v2 v2.1.1 h1:3Q4Pt7i8nYwy2KmQWIw2+1hTvwTE/6w9FqcttATPO/4= @@ -72,6 +75,7 @@ github.com/containerd/typeurl/v2 v2.1.1/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3H github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0= +github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -96,8 +100,11 @@ github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5y github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.10.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byAbud7miNWJ1WwEVf8= +github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gammazero/deque v0.1.0 h1:f9LnNmq66VDeuAlSAapemq/U7hJ2jpIWa4c09q8Dlik= github.com/gammazero/deque v0.1.0/go.mod h1:KQw7vFau1hHuM8xmI9RbgKFbAsQFWmBpqQ2KenFLk6M= github.com/gammazero/workerpool v1.1.2 h1:vuioDQbgrz4HoaCi2q1HLlOXdpbap5AET7xu5/qj87g= @@ -126,6 +133,7 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= +github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -200,6 +208,7 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= @@ -243,6 +252,7 @@ github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfn github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -292,7 +302,9 @@ github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWk github.com/oapi-codegen/runtime v1.1.0 h1:rJpoNUawn5XTvekgfkvSZr0RqEnoYpFkyvrzfWeFKWM= github.com/oapi-codegen/runtime v1.1.0/go.mod h1:BeSfBkWWWnAnGdyS+S/GnlbmHKzf8/hwkvelJZDeKA8= github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= +github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0-rc3 h1:fzg1mXZFj8YdPeNkRXMg+zb88BFV0Ys52cJydRwBkb8= @@ -312,6 +324,7 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/segmentio/backo-go v1.0.0 h1:kbOAtGJY2DqOR0jfRkYEorx/b18RgtepGtY3+Cpe6qA= @@ -344,6 +357,7 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= @@ -481,6 +495,7 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= +golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -727,6 +742,7 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= +gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From ea3206fc27a15eb4e05e1e52223c776e4b143c0d Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Tue, 15 Oct 2024 16:44:56 +0900 Subject: [PATCH 51/78] add across years test --- .../file_layout/per_hour_file_layout_test.go | 73 +++++++++++++++++-- 1 file changed, 66 insertions(+), 7 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go index 516d1e85d9..3943b10c56 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go @@ -142,22 +142,81 @@ func TestGetLogFilePathsWithHourlyRetentionAcrossWeeks(t *testing.T) { } func TestGetLogFilePathsWithHourlyRetentionAcrossYears(t *testing.T) { + filesystem := volume_filesystem.NewMockedVolumeFilesystem() -} + currentTime := logs_clock.NewMockLogsClockPerHour(2024, 1, 1, 2) + fileLayout := NewPerHourFileLayout(currentTime) -// test get log file paths per hour across year -// test get log file paths across days -// test get log file paths across weeks -// test get log file paths within the same day -// test getting log file paths across days + hourZeroFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(2023, 52, 0, 21).Now(), testEnclaveUuid, testUserService1Uuid) + hourOneFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(2023, 52, 0, 22).Now(), testEnclaveUuid, testUserService1Uuid) + hourTwoFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(2023, 52, 0, 23).Now(), testEnclaveUuid, testUserService1Uuid) + hourThreeFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(2024, 1, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) + hourFourFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(2024, 1, 1, 1).Now(), testEnclaveUuid, testUserService1Uuid) + hourFiveFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(2024, 1, 1, 2).Now(), testEnclaveUuid, testUserService1Uuid) -func TestDurationToHour(t *testing.T) { + createFilepaths(t, filesystem, []string{ + hourZeroFp, + hourOneFp, + hourTwoFp, + hourThreeFp, + hourFourFp, + hourFiveFp, + }) + + expectedLogFilePaths := []string{ + hourZeroFp, + hourOneFp, + hourTwoFp, + hourThreeFp, + hourFourFp, + hourFiveFp, + } + + retentionPeriod := 6 * time.Hour // retention period of 6 hours should return all the file paths + logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) + + require.NoError(t, err) + require.Equal(t, len(expectedLogFilePaths), len(logFilePaths)) + for i, filePath := range expectedLogFilePaths { + require.Equal(t, filePath, logFilePaths[i]) + } } +func TestGetLogFilePathsWithHourlyRetentionWithinSameDay(t *testing.T) { + +} + +// +//func TestGetLogFilePathsWithHourlyRetentionReturnsCorrectPathsIfHoursMissingInBetween(t *testing.T) { +// filesystem := volume_filesystem.NewMockedVolumeFilesystem() +// +// currentTime := logs_clock.NewMockLogsClockPerHour(defaultYear, defaultWeek, defaultDay, 1) +// fileLayout := NewPerWeekFileLayout(currentTime) +// +// // ../week/enclave uuid/service uuid.json +// week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) +// week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) +// week3filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear, 3, 0).Now(), testEnclaveUuid, testUserService1Uuid) +// +// _, _ = filesystem.Create(week52filepath) +// _, _ = filesystem.Create(week1filepath) +// _, _ = filesystem.Create(week3filepath) +// retentionPeriod := retentionPeriodInWeeksForTesting * oneWeekDuration +// logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) +// +// require.NoError(t, err) +// require.Len(t, logFilePaths, 1) +// require.Equal(t, week3filepath, logFilePaths[0]) // should only return week 3 because week 2 is missing +//} + func createFilepaths(t *testing.T, filesystem volume_filesystem.VolumeFilesystem, filepaths []string) { for _, path := range filepaths { _, err := filesystem.Create(path) require.NoError(t, err) } } + +func TestDurationToHour(t *testing.T) { + +} From c0d65099f8b6332a95624aaa3c357aa5c2bf79e5 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Wed, 16 Oct 2024 19:55:14 +0900 Subject: [PATCH 52/78] remove with file layout --- .../file_layout/file_layout.go | 4 ++ .../log_file_manager/log_file_manager.go | 50 +++++++------------ 2 files changed, 21 insertions(+), 33 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go index 2e2720bb9d..a3f9e2b2f4 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go @@ -23,4 +23,8 @@ type LogFileLayout interface { // If [retentionPeriodIntervals] is positive, retrieves all filepaths within the range [currentTime - retentionPeriod] and [currentTime - (retentionPeriodIntervals) * retentionPeriod] // Returned filepaths sorted from oldest to most recent GetLogFilePaths(filesystem volume_filesystem.VolumeFilesystem, retentionPeriod time.Duration, retentionPeriodIntervals int, enclaveUuid, serviceUuid string) ([]string, error) + + // GetAllLogFilePaths retrieves all filepaths associated with [enclaveUuid] in [filesystem] + // If [enclaveUuid] is the empty string, returns logs for all enclaves + GetAllLogFilesPaths(filesystem volume_filesystem.VolumeFilesystem, enclaveUuid string) ([]string, error) } diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go index f011f8b481..cda6e6ca7f 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go @@ -2,20 +2,17 @@ package log_file_manager import ( "context" - "fmt" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/enclave" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/uuid_generator" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock" - "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" "github.com/kurtosis-tech/stacktrace" "github.com/sirupsen/logrus" "k8s.io/apimachinery/pkg/api/errors" "os" - "strconv" "time" ) @@ -25,6 +22,8 @@ const ( removeLogsWaitHours = 6 * time.Hour createLogsWaitMinutes = 1 * time.Minute + + emptyEnclaveUuid = "" ) // LogFileManager is responsible for creating and removing log files from filesystem. @@ -187,21 +186,26 @@ func (manager *LogFileManager) RemoveLogsBeyondRetentionPeriod(ctx context.Conte } func (manager *LogFileManager) RemoveAllLogs() error { - // only removes logs for this year because Docker prevents all logs from base logs storage file path - year, _ := manager.time.Now().ISOWeek() - if err := manager.filesystem.RemoveAll(getLogsDirPathForYear(year)); err != nil { - return stacktrace.Propagate(err, "An error occurred attempting to remove all logs.") + logFilePaths, err := manager.fileLayout.GetAllLogFilesPaths(manager.filesystem, emptyEnclaveUuid) + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting all log file paths.") + } + for _, filePath := range logFilePaths { + if err := manager.filesystem.Remove(filePath); err != nil { + return stacktrace.Propagate(err, "An error occurred removing log file path '%v'.", filePath) + } } return nil } func (manager *LogFileManager) RemoveEnclaveLogs(enclaveUuid string) error { - currentTime := manager.time.Now() - for i := 0; i < manager.logRetentionPeriodInWeeks; i++ { - year, week := currentTime.Add(time.Duration(-i) * oneWeek).ISOWeek() - enclaveLogsDirPathForWeek := getEnclaveLogsDirPath(year, week, enclaveUuid) - if err := manager.filesystem.RemoveAll(enclaveLogsDirPathForWeek); err != nil { - return stacktrace.Propagate(err, "An error occurred attempting to remove logs for enclave '%v' logs at the following path: %v", enclaveUuid, enclaveLogsDirPathForWeek) + enclaveLogFilePaths, err := manager.fileLayout.GetAllLogFilesPaths(manager.filesystem, enclaveUuid) + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting all log file paths for '%v'.", enclaveUuid) + } + for _, filePath := range enclaveLogFilePaths { + if err := manager.filesystem.Remove(filePath); err != nil { + return stacktrace.Propagate(err, "An error occurred removing enclave '%v' log file path '%v'.", enclaveUuid, filePath) } } return nil @@ -256,23 +260,3 @@ func (manager *LogFileManager) createSymlinkLogFile(targetLogFilePath, symlinkLo } return nil } - -// TODO: implement the functionality from these methods into file layout - -// creates a directory path of format //year/week// -func getEnclaveLogsDirPath(year, week int, enclaveUuid string) string { - logsDirPathForYearAndWeek := getLogsDirPathForWeek(year, week) - return fmt.Sprintf("%s%s/", logsDirPathForYearAndWeek, enclaveUuid) -} - -// creates a directory path of format //year/week/ -func getLogsDirPathForWeek(year, week int) string { - logsDirPathForYear := getLogsDirPathForYear(year) - formattedWeekNum := fmt.Sprintf("%02d", week) - return fmt.Sprintf("%s%s/", logsDirPathForYear, formattedWeekNum) -} - -// creates a directory path of format //year/ -func getLogsDirPathForYear(year int) string { - return fmt.Sprintf("%s%s/", volume_consts.LogsStorageDirpath, strconv.Itoa(year)) -} From ee54acd053d3592f89b86294c72c7040ca7ff818 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Wed, 16 Oct 2024 20:15:58 +0900 Subject: [PATCH 53/78] add walk to filesystem interface --- .../file_layout/file_layout.go | 2 +- .../file_layout/per_hour_file_layout.go | 22 +++++++++++++++++++ .../file_layout/per_week_file_layout.go | 22 +++++++++++++++++++ .../log_file_manager/log_file_manager.go | 4 ++-- .../volume_filesystem/volume_filesystem.go | 10 +++++++++ engine/server/engine/main.go | 4 ++-- 6 files changed, 59 insertions(+), 5 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go index a3f9e2b2f4..3b1535bd25 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go @@ -26,5 +26,5 @@ type LogFileLayout interface { // GetAllLogFilePaths retrieves all filepaths associated with [enclaveUuid] in [filesystem] // If [enclaveUuid] is the empty string, returns logs for all enclaves - GetAllLogFilesPaths(filesystem volume_filesystem.VolumeFilesystem, enclaveUuid string) ([]string, error) + GetAllLogFilePaths(filesystem volume_filesystem.VolumeFilesystem, enclaveUuid string) ([]string, error) } diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go index 012f4af97f..33f37a506d 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go @@ -5,7 +5,9 @@ import ( "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" + "github.com/kurtosis-tech/stacktrace" "golang.org/x/exp/slices" + "io/fs" "math" "os" "strconv" @@ -61,6 +63,26 @@ func (phf *PerHourFileLayout) GetLogFilePaths( return paths, nil } +func (phf *PerHourFileLayout) GetAllLogFilePaths(filesystem volume_filesystem.VolumeFilesystem, enclaveUuid string) ([]string, error) { + var paths []string + + root := "" + walkFunc := func(path string, info fs.FileInfo, err error) error { + paths = append(paths, path) + // first check that the path matches the format cause then it's a potential path in this file layout + + //if it does check that it has the desired enclave uuid if enclave uuid isn't empty + return nil + } + + err := filesystem.Walk(root, walkFunc) + if err != nil { + return []string{}, stacktrace.Propagate(err, "An error occurred walking file path.") + } + + return paths, nil +} + func (phf *PerHourFileLayout) getLogFilePathsFromNowTillRetentionPeriod(fs volume_filesystem.VolumeFilesystem, retentionPeriodInHours int, enclaveUuid, serviceUuid string) ([]string, error) { var paths []string currentTime := phf.time.Now() diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go index 47684d9e76..3e5c98be0d 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go @@ -5,7 +5,9 @@ import ( "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" + "github.com/kurtosis-tech/stacktrace" "golang.org/x/exp/slices" + "io/fs" "math" "os" "strconv" @@ -60,6 +62,26 @@ func (pwf *PerWeekFileLayout) GetLogFilePaths( return paths, nil } +func (pwf *PerWeekFileLayout) GetAllLogFilePaths(filesystem volume_filesystem.VolumeFilesystem, enclaveUuid string) ([]string, error) { + var paths []string + + root := "" + walkFunc := func(path string, info fs.FileInfo, err error) error { + paths = append(paths, path) + // first check that the path matches the format cause then it's a potential path in this file layout + + //if it does check that it has the desired enclave uuid if enclave uuid isn't empty + return nil + } + + err := filesystem.Walk(root, walkFunc) + if err != nil { + return []string{}, stacktrace.Propagate(err, "An error occurred walking file path.") + } + + return paths, nil +} + func (pwf *PerWeekFileLayout) getLogFilePathsFromNowTillRetentionPeriod(fs volume_filesystem.VolumeFilesystem, retentionPeriodInWeeks int, enclaveUuid, serviceUuid string) ([]string, error) { var paths []string currentTime := pwf.time.Now() diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go index cda6e6ca7f..5bf1e1bc71 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go @@ -186,7 +186,7 @@ func (manager *LogFileManager) RemoveLogsBeyondRetentionPeriod(ctx context.Conte } func (manager *LogFileManager) RemoveAllLogs() error { - logFilePaths, err := manager.fileLayout.GetAllLogFilesPaths(manager.filesystem, emptyEnclaveUuid) + logFilePaths, err := manager.fileLayout.GetAllLogFilePaths(manager.filesystem, emptyEnclaveUuid) if err != nil { return stacktrace.Propagate(err, "An error occurred getting all log file paths.") } @@ -199,7 +199,7 @@ func (manager *LogFileManager) RemoveAllLogs() error { } func (manager *LogFileManager) RemoveEnclaveLogs(enclaveUuid string) error { - enclaveLogFilePaths, err := manager.fileLayout.GetAllLogFilesPaths(manager.filesystem, enclaveUuid) + enclaveLogFilePaths, err := manager.fileLayout.GetAllLogFilePaths(manager.filesystem, enclaveUuid) if err != nil { return stacktrace.Propagate(err, "An error occurred getting all log file paths for '%v'.", enclaveUuid) } diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem/volume_filesystem.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem/volume_filesystem.go index 72f2520ac0..0d03848883 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem/volume_filesystem.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem/volume_filesystem.go @@ -4,6 +4,7 @@ import ( "github.com/spf13/afero" "io" "os" + "path/filepath" ) // VolumeFilesystem interface is an abstraction of the disk filesystem @@ -15,6 +16,7 @@ type VolumeFilesystem interface { RemoveAll(path string) error Remove(filepath string) error Symlink(target, link string) error + Walk(root string, walkFn filepath.WalkFunc) error } type VolumeFile interface { @@ -58,6 +60,10 @@ func (fs *OsVolumeFilesystem) Symlink(target, link string) error { return os.Symlink(target, link) } +func (fs *OsVolumeFilesystem) Walk(root string, fn filepath.WalkFunc) error { + return filepath.Walk(root, fn) +} + // MockedVolumeFilesystem is an implementation used for unit testing type MockedVolumeFilesystem struct { // uses an underlying map filesystem that's easy to mock file data with @@ -93,3 +99,7 @@ func (fs *MockedVolumeFilesystem) Symlink(target, link string) error { _, err := fs.mapFS.Create(link) return err } + +func (fs *MockedVolumeFilesystem) Walk(root string, fn filepath.WalkFunc) error { + return afero.Walk(fs.mapFS, root, fn) +} diff --git a/engine/server/engine/main.go b/engine/server/engine/main.go index af5b0ef6ee..058249ee1f 100644 --- a/engine/server/engine/main.go +++ b/engine/server/engine/main.go @@ -416,8 +416,8 @@ func getLogsDatabaseClient(kurtosisBackendType args.KurtosisBackendType, kurtosi } logrus.Infof("Setting log retention period to '%v' week(s).", logRetentionPeriodInWeeks) osFs := volume_filesystem.NewOsVolumeFilesystem() - perWeekFileLayout := file_layout.NewPerWeekFileLayout(realTime) - logFileManager := log_file_manager.NewLogFileManager(kurtosisBackend, osFs, perWeekFileLayout, realTime, logRetentionPeriodInWeeks) + perHourFileLayout := file_layout.NewPerHourFileLayout(logs_clock.NewRealClock()) + logFileManager := log_file_manager.NewLogFileManager(kurtosisBackend, osFs, perHourFileLayout, realTime, logRetentionPeriodInWeeks) perWeekStreamLogsStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(realTime, logRetentionPeriodInWeeks) logsDatabaseClient = persistent_volume.NewPersistentVolumeLogsDatabaseClient(kurtosisBackend, osFs, logFileManager, perWeekStreamLogsStrategy) From e4667a47d6e39eb3b3e403e6db86e025dc5bd5e9 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 17 Oct 2024 13:52:37 +0900 Subject: [PATCH 54/78] impl get all filepaths in log file mngr instead --- .../file_layout/file_layout.go | 4 --- .../file_layout/per_hour_file_layout.go | 22 ------------- .../file_layout/per_week_file_layout.go | 22 ------------- .../log_file_manager/log_file_manager.go | 33 ++++++++++++++----- .../log_file_manager/log_file_manager_test.go | 9 ++--- ...istent_volume_logs_database_client_test.go | 2 +- 6 files changed, 31 insertions(+), 61 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go index 3b1535bd25..2e2720bb9d 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/file_layout.go @@ -23,8 +23,4 @@ type LogFileLayout interface { // If [retentionPeriodIntervals] is positive, retrieves all filepaths within the range [currentTime - retentionPeriod] and [currentTime - (retentionPeriodIntervals) * retentionPeriod] // Returned filepaths sorted from oldest to most recent GetLogFilePaths(filesystem volume_filesystem.VolumeFilesystem, retentionPeriod time.Duration, retentionPeriodIntervals int, enclaveUuid, serviceUuid string) ([]string, error) - - // GetAllLogFilePaths retrieves all filepaths associated with [enclaveUuid] in [filesystem] - // If [enclaveUuid] is the empty string, returns logs for all enclaves - GetAllLogFilePaths(filesystem volume_filesystem.VolumeFilesystem, enclaveUuid string) ([]string, error) } diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go index 33f37a506d..012f4af97f 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go @@ -5,9 +5,7 @@ import ( "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" - "github.com/kurtosis-tech/stacktrace" "golang.org/x/exp/slices" - "io/fs" "math" "os" "strconv" @@ -63,26 +61,6 @@ func (phf *PerHourFileLayout) GetLogFilePaths( return paths, nil } -func (phf *PerHourFileLayout) GetAllLogFilePaths(filesystem volume_filesystem.VolumeFilesystem, enclaveUuid string) ([]string, error) { - var paths []string - - root := "" - walkFunc := func(path string, info fs.FileInfo, err error) error { - paths = append(paths, path) - // first check that the path matches the format cause then it's a potential path in this file layout - - //if it does check that it has the desired enclave uuid if enclave uuid isn't empty - return nil - } - - err := filesystem.Walk(root, walkFunc) - if err != nil { - return []string{}, stacktrace.Propagate(err, "An error occurred walking file path.") - } - - return paths, nil -} - func (phf *PerHourFileLayout) getLogFilePathsFromNowTillRetentionPeriod(fs volume_filesystem.VolumeFilesystem, retentionPeriodInHours int, enclaveUuid, serviceUuid string) ([]string, error) { var paths []string currentTime := phf.time.Now() diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go index 3e5c98be0d..47684d9e76 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go @@ -5,9 +5,7 @@ import ( "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" - "github.com/kurtosis-tech/stacktrace" "golang.org/x/exp/slices" - "io/fs" "math" "os" "strconv" @@ -62,26 +60,6 @@ func (pwf *PerWeekFileLayout) GetLogFilePaths( return paths, nil } -func (pwf *PerWeekFileLayout) GetAllLogFilePaths(filesystem volume_filesystem.VolumeFilesystem, enclaveUuid string) ([]string, error) { - var paths []string - - root := "" - walkFunc := func(path string, info fs.FileInfo, err error) error { - paths = append(paths, path) - // first check that the path matches the format cause then it's a potential path in this file layout - - //if it does check that it has the desired enclave uuid if enclave uuid isn't empty - return nil - } - - err := filesystem.Walk(root, walkFunc) - if err != nil { - return []string{}, stacktrace.Propagate(err, "An error occurred walking file path.") - } - - return paths, nil -} - func (pwf *PerWeekFileLayout) getLogFilePathsFromNowTillRetentionPeriod(fs volume_filesystem.VolumeFilesystem, retentionPeriodInWeeks int, enclaveUuid, serviceUuid string) ([]string, error) { var paths []string currentTime := pwf.time.Now() diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go index 5bf1e1bc71..c0b3d8d2cc 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go @@ -11,8 +11,10 @@ import ( "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" "github.com/kurtosis-tech/stacktrace" "github.com/sirupsen/logrus" + "io/fs" "k8s.io/apimachinery/pkg/api/errors" "os" + "strings" "time" ) @@ -37,20 +39,18 @@ type LogFileManager struct { time logs_clock.LogsClock logRetentionPeriodInWeeks int + + baseFilePath string } -func NewLogFileManager( - kurtosisBackend backend_interface.KurtosisBackend, - filesystem volume_filesystem.VolumeFilesystem, - fileLayout file_layout.LogFileLayout, - time logs_clock.LogsClock, - logRetentionPeriodInWeeks int) *LogFileManager { +func NewLogFileManager(kurtosisBackend backend_interface.KurtosisBackend, filesystem volume_filesystem.VolumeFilesystem, fileLayout file_layout.LogFileLayout, time logs_clock.LogsClock, logRetentionPeriodInWeeks int, baseFilePath string) *LogFileManager { return &LogFileManager{ kurtosisBackend: kurtosisBackend, filesystem: filesystem, fileLayout: fileLayout, time: time, logRetentionPeriodInWeeks: logRetentionPeriodInWeeks, + baseFilePath: baseFilePath, } } @@ -186,7 +186,7 @@ func (manager *LogFileManager) RemoveLogsBeyondRetentionPeriod(ctx context.Conte } func (manager *LogFileManager) RemoveAllLogs() error { - logFilePaths, err := manager.fileLayout.GetAllLogFilePaths(manager.filesystem, emptyEnclaveUuid) + logFilePaths, err := manager.getAllLogFilePaths(emptyEnclaveUuid) if err != nil { return stacktrace.Propagate(err, "An error occurred getting all log file paths.") } @@ -199,7 +199,7 @@ func (manager *LogFileManager) RemoveAllLogs() error { } func (manager *LogFileManager) RemoveEnclaveLogs(enclaveUuid string) error { - enclaveLogFilePaths, err := manager.fileLayout.GetAllLogFilePaths(manager.filesystem, enclaveUuid) + enclaveLogFilePaths, err := manager.getAllLogFilePaths(enclaveUuid) if err != nil { return stacktrace.Propagate(err, "An error occurred getting all log file paths for '%v'.", enclaveUuid) } @@ -260,3 +260,20 @@ func (manager *LogFileManager) createSymlinkLogFile(targetLogFilePath, symlinkLo } return nil } + +func (manager *LogFileManager) getAllLogFilePaths(enclaveUuid string) ([]string, error) { + var paths []string + walkFunc := func(path string, info fs.FileInfo, err error) error { + paths = append(paths, path) + if enclaveUuid != emptyEnclaveUuid && strings.Contains(path, enclaveUuid) { + paths = append(paths, path) + } else { + paths = append(paths, path) + } + return nil + } + if err := manager.filesystem.Walk(manager.baseFilePath, walkFunc); err != nil { + return []string{}, stacktrace.Propagate(err, "An error occurred walking file path.") + } + return paths, nil +} diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go index 855610fe44..c7da874544 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go @@ -10,6 +10,7 @@ import ( "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/uuid_generator" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" "github.com/stretchr/testify/require" "net" @@ -48,7 +49,7 @@ func TestRemoveLogsBeyondRetentionPeriod(t *testing.T) { _, _ = mockFs.Create(week1filepath) _, _ = mockFs.Create(week2filepath) - logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, 5) + logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, 5, volume_consts.LogsStorageDirpath) logFileManager.RemoveLogsBeyondRetentionPeriod(ctx) // should remove week 49 logs _, err := mockFs.Stat(week49filepath) @@ -74,7 +75,7 @@ func TestRemoveEnclaveLogs(t *testing.T) { _, _ = mockFs.Create(week52filepath) _, _ = mockFs.Create(week52filepathDiffService) - logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, 5) + logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, 5, volume_consts.LogsStorageDirpath) err := logFileManager.RemoveEnclaveLogs(testEnclaveUuid) // should remove only all log files for enclave one require.NoError(t, err) @@ -113,7 +114,7 @@ func TestRemoveAllLogs(t *testing.T) { _, _ = mockFs.Create(week52filepath) _, _ = mockFs.Create(week52filepathDiffService) - logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, 5) + logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, 5, volume_consts.LogsStorageDirpath) err := logFileManager.RemoveAllLogs() require.NoError(t, err) @@ -148,7 +149,7 @@ func TestCreateLogFiles(t *testing.T) { expectedServiceNameFilePath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Name) expectedServiceShortUuidFilePath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 52, 0).Now(), testEnclaveUuid, uuid_generator.ShortenedUUIDString(testUserService1Uuid)) - logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, 5) + logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, 5, volume_consts.LogsStorageDirpath) err := logFileManager.CreateLogFiles(ctx) require.NoError(t, err) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go index 5118e56a7d..36ee7c5e19 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go @@ -699,7 +699,7 @@ func executeStreamCallAndGetReceivedServiceLogLines( // no log file management is done in these tests so values for logFileManager aren't important mockTime := logs_clock.NewMockLogsClockPerDay(0, 0, 0) fileLayout := file_layout.NewPerWeekFileLayout(mockTime) - logFileManager := log_file_manager.NewLogFileManager(kurtosisBackend, underlyingFs, fileLayout, mockTime, 0) + logFileManager := log_file_manager.NewLogFileManager(kurtosisBackend, underlyingFs, fileLayout, mockTime, 0, volume_consts.LogsStorageDirpath) logsDatabaseClient := NewPersistentVolumeLogsDatabaseClient(kurtosisBackend, underlyingFs, logFileManager, streamStrategy) userServiceLogsByUuidChan, errChan, receivedCancelCtxFunc, err := logsDatabaseClient.StreamUserServiceLogs(ctx, enclaveUuid, userServiceUuids, logLinesFilters, shouldFollowLogs, defaultShouldReturnAllLogs, defaultNumLogLines) From d0b9481162e17c6ffacbc7c3b90d1e02200ccd93 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 17 Oct 2024 14:05:25 +0900 Subject: [PATCH 55/78] fix get all log file paths and tests --- .../log_file_manager/log_file_manager.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go index c0b3d8d2cc..68b5d568b1 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go @@ -264,11 +264,14 @@ func (manager *LogFileManager) createSymlinkLogFile(targetLogFilePath, symlinkLo func (manager *LogFileManager) getAllLogFilePaths(enclaveUuid string) ([]string, error) { var paths []string walkFunc := func(path string, info fs.FileInfo, err error) error { - paths = append(paths, path) - if enclaveUuid != emptyEnclaveUuid && strings.Contains(path, enclaveUuid) { - paths = append(paths, path) + if enclaveUuid != emptyEnclaveUuid { + if strings.Contains(path, enclaveUuid) && !info.IsDir() { + paths = append(paths, path) + } } else { - paths = append(paths, path) + if !info.IsDir() { + paths = append(paths, path) + } } return nil } From f8806c26c4bb999ff93d48809c30f8eb78acd17b Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 17 Oct 2024 15:03:35 +0900 Subject: [PATCH 56/78] use duration instead of int --- .../log_file_manager/log_file_manager.go | 25 ++++----- .../log_file_manager/log_file_manager_test.go | 12 +++- ...istent_volume_logs_database_client_test.go | 14 ++--- .../per_week_stream_logs_strategy.go | 55 +++++++------------ .../per_week_stream_logs_strategy_test.go | 16 +++--- engine/server/engine/main.go | 16 ++---- 6 files changed, 59 insertions(+), 79 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go index 68b5d568b1..3a17098fea 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go @@ -19,8 +19,6 @@ import ( ) const ( - oneWeek = 7 * 24 * time.Hour - removeLogsWaitHours = 6 * time.Hour createLogsWaitMinutes = 1 * time.Minute @@ -38,19 +36,19 @@ type LogFileManager struct { time logs_clock.LogsClock - logRetentionPeriodInWeeks int + logRetentionPeriod time.Duration baseFilePath string } -func NewLogFileManager(kurtosisBackend backend_interface.KurtosisBackend, filesystem volume_filesystem.VolumeFilesystem, fileLayout file_layout.LogFileLayout, time logs_clock.LogsClock, logRetentionPeriodInWeeks int, baseFilePath string) *LogFileManager { +func NewLogFileManager(kurtosisBackend backend_interface.KurtosisBackend, filesystem volume_filesystem.VolumeFilesystem, fileLayout file_layout.LogFileLayout, time logs_clock.LogsClock, logRetentionPeriod time.Duration, baseFilePath string) *LogFileManager { return &LogFileManager{ - kurtosisBackend: kurtosisBackend, - filesystem: filesystem, - fileLayout: fileLayout, - time: time, - logRetentionPeriodInWeeks: logRetentionPeriodInWeeks, - baseFilePath: baseFilePath, + kurtosisBackend: kurtosisBackend, + filesystem: filesystem, + fileLayout: fileLayout, + time: time, + logRetentionPeriod: logRetentionPeriod, + baseFilePath: baseFilePath, } } @@ -146,22 +144,21 @@ func (manager *LogFileManager) RemoveLogsBeyondRetentionPeriod(ctx context.Conte serviceNameStr := string(serviceRegistration.GetName()) serviceShortUuidStr := uuid_generator.ShortenedUUIDString(serviceUuidStr) - retentionPeriod := time.Duration(manager.logRetentionPeriodInWeeks) * oneWeek - oldServiceLogFilesByUuid, err := manager.fileLayout.GetLogFilePaths(manager.filesystem, retentionPeriod, 1, string(enclaveUuid), serviceUuidStr) + oldServiceLogFilesByUuid, err := manager.fileLayout.GetLogFilePaths(manager.filesystem, manager.logRetentionPeriod, 1, string(enclaveUuid), serviceUuidStr) if err != nil { logrus.Errorf("An error occurred getting log file paths for service '%v' in enclave '%v' logs beyond retention: %v", serviceUuidStr, enclaveUuid, err) } else { pathsToRemove = append(pathsToRemove, oldServiceLogFilesByUuid...) } - oldServiceLogFilesByName, err := manager.fileLayout.GetLogFilePaths(manager.filesystem, retentionPeriod, 1, string(enclaveUuid), serviceNameStr) + oldServiceLogFilesByName, err := manager.fileLayout.GetLogFilePaths(manager.filesystem, manager.logRetentionPeriod, 1, string(enclaveUuid), serviceNameStr) if err != nil { logrus.Errorf("An error occurred getting log file paths for service '%v' in enclave '%v' logs beyond retention: %v", serviceNameStr, enclaveUuid, err) } else { pathsToRemove = append(pathsToRemove, oldServiceLogFilesByName...) } - oldServiceLogFilesByShortUuid, err := manager.fileLayout.GetLogFilePaths(manager.filesystem, retentionPeriod, 1, string(enclaveUuid), serviceShortUuidStr) + oldServiceLogFilesByShortUuid, err := manager.fileLayout.GetLogFilePaths(manager.filesystem, manager.logRetentionPeriod, 1, string(enclaveUuid), serviceShortUuidStr) if err != nil { logrus.Errorf("An error occurred getting log file paths for service '%v' in enclave '%v' logs beyond retention: %v", serviceShortUuidStr, enclaveUuid, err) } else { diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go index c7da874544..dde02fdd78 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go @@ -16,6 +16,7 @@ import ( "net" "os" "testing" + "time" ) const ( @@ -75,7 +76,7 @@ func TestRemoveEnclaveLogs(t *testing.T) { _, _ = mockFs.Create(week52filepath) _, _ = mockFs.Create(week52filepathDiffService) - logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, 5, volume_consts.LogsStorageDirpath) + logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, convertWeeksToDuration(5), volume_consts.LogsStorageDirpath) err := logFileManager.RemoveEnclaveLogs(testEnclaveUuid) // should remove only all log files for enclave one require.NoError(t, err) @@ -114,7 +115,7 @@ func TestRemoveAllLogs(t *testing.T) { _, _ = mockFs.Create(week52filepath) _, _ = mockFs.Create(week52filepathDiffService) - logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, 5, volume_consts.LogsStorageDirpath) + logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, convertWeeksToDuration(5), volume_consts.LogsStorageDirpath) err := logFileManager.RemoveAllLogs() require.NoError(t, err) @@ -149,7 +150,7 @@ func TestCreateLogFiles(t *testing.T) { expectedServiceNameFilePath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Name) expectedServiceShortUuidFilePath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 52, 0).Now(), testEnclaveUuid, uuid_generator.ShortenedUUIDString(testUserService1Uuid)) - logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, 5, volume_consts.LogsStorageDirpath) + logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, convertWeeksToDuration(5), volume_consts.LogsStorageDirpath) err := logFileManager.CreateLogFiles(ctx) require.NoError(t, err) @@ -191,3 +192,8 @@ func getMockedKurtosisBackendWithEnclavesAndServices(ctx context.Context, t *tes Return(servicesMap, nil) return mockKurtosisBackend } + +func convertWeeksToDuration(retentionPeriodInWeeks int) time.Duration { + const hoursInWeek = 7 * 24 // 7 days * 24 hours + return time.Duration(retentionPeriodInWeeks*hoursInWeek) * time.Hour +} diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go index 36ee7c5e19..8597d18dc9 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go @@ -132,7 +132,7 @@ func TestStreamUserServiceLogsPerWeek_WithFilters(t *testing.T) { underlyingFs := createFilledPerWeekFilesystem(startingWeek) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -215,7 +215,7 @@ func TestStreamUserServiceLogsPerWeek_NoLogsFromPersistentVolume(t *testing.T) { underlyingFs := createEmptyPerWeekFilesystem(startingWeek) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -320,7 +320,7 @@ func TestStreamUserServiceLogsPerWeek_ThousandsOfLogLinesSuccessfulExecution(t * require.NoError(t, err) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -407,7 +407,7 @@ func TestStreamUserServiceLogsPerWeek_EmptyLogLines(t *testing.T) { require.NoError(t, err) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -474,7 +474,7 @@ func TestStreamUserServiceLogsPerWeek_WithLogsAcrossWeeks(t *testing.T) { require.NoError(t, err) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, 4, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -543,7 +543,7 @@ func TestStreamUserServiceLogsPerWeek_WithLogLineAcrossWeeks(t *testing.T) { require.NoError(t, err) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, 4, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -594,7 +594,7 @@ func TestStreamUserServiceLogsPerWeekReturnsTimestampedLogLines(t *testing.T) { require.NoError(t, err) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) expectedTime, err := time.Parse(utcFormat, defaultUTCTimestampStr) require.NoError(t, err) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go index 7ee7192431..f681fd394e 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go @@ -25,24 +25,26 @@ const ( oneWeek = 7 * 24 * time.Hour ) -// PerWeekStreamLogsStrategy pulls logs from filesystem where there is a log file per year, per week, per enclave, per service +// StreamLogsStrategyImpl pulls logs from filesystem where there is a log file per year, per week, per enclave, per service // Weeks are denoted 01-52 // e.g. // [.../28/d3e8832d671f/61830789f03a.json] is the file containing logs from service with uuid 61830789f03a, in enclave with uuid d3e8832d671f, // in the 28th week of the current year -type PerWeekStreamLogsStrategy struct { - time logs_clock.LogsClock - logRetentionPeriodInWeeks int +type StreamLogsStrategyImpl struct { + time logs_clock.LogsClock + logRetentionPeriod time.Duration + fileLayout file_layout.LogFileLayout } -func NewPerWeekStreamLogsStrategy(time logs_clock.LogsClock, logRetentionPeriodInWeeks int) *PerWeekStreamLogsStrategy { - return &PerWeekStreamLogsStrategy{ - time: time, - logRetentionPeriodInWeeks: logRetentionPeriodInWeeks, +func NewStreamLogsStrategyImpl(time logs_clock.LogsClock, logRetentionPeriod time.Duration, fileLayout file_layout.LogFileLayout) *StreamLogsStrategyImpl { + return &StreamLogsStrategyImpl{ + time: time, + logRetentionPeriod: logRetentionPeriod, + fileLayout: fileLayout, } } -func (strategy *PerWeekStreamLogsStrategy) StreamLogs( +func (strategy *StreamLogsStrategyImpl) StreamLogs( ctx context.Context, fs volume_filesystem.VolumeFilesystem, logLineSender *logline.LogLineSender, @@ -54,7 +56,7 @@ func (strategy *PerWeekStreamLogsStrategy) StreamLogs( shouldReturnAllLogs bool, numLogLines uint32, ) { - paths, err := strategy.getLogFilePaths(fs, strategy.logRetentionPeriodInWeeks, string(enclaveUuid), string(serviceUuid)) + paths, err := strategy.fileLayout.GetLogFilePaths(fs, strategy.logRetentionPeriod, -1, string(enclaveUuid), string(serviceUuid)) if err != nil { streamErrChan <- stacktrace.Propagate(err, "An error occurred retrieving log file paths for service '%v' in enclave '%v'.", serviceUuid, enclaveUuid) return @@ -67,12 +69,6 @@ func (strategy *PerWeekStreamLogsStrategy) StreamLogs( serviceUuid, enclaveUuid) return } - if len(paths) > strategy.logRetentionPeriodInWeeks { - logrus.Warnf( - `We expected to retrieve logs going back '%v' weeks, but instead retrieved logs going back '%v' weeks. - This means logs past the retention period are being returned, likely a bug in Kurtosis.`, - strategy.logRetentionPeriodInWeeks, len(paths)) - } logsReader, files, err := getLogsReader(fs, paths) if err != nil { @@ -109,19 +105,6 @@ func (strategy *PerWeekStreamLogsStrategy) StreamLogs( } } -// [getLogFilePaths] returns a list of log file paths containing logs for [serviceUuid] in [enclaveUuid] -// going [retentionPeriodInWeeks] back from the [currentWeek]. -// Notes: -// - File paths are of the format '/week/{{ enclave uuid }}/{{ service uuid }}.json' where 'week' is %V strftime specifier -// - The list of file paths is returned in order of oldest logs to most recent logs e.g. [ 03/80124/1234.json, /04/801234/1234.json, ...] -// - If a file path does not exist, the function exits and returns whatever file paths were found -func (strategy *PerWeekStreamLogsStrategy) getLogFilePaths(filesystem volume_filesystem.VolumeFilesystem, retentionPeriodInWeeks int, enclaveUuid, serviceUuid string) ([]string, error) { - // TODO: embed FileLayout into StreamLogsStrategy interface - perWeekFileLayout := file_layout.NewPerWeekFileLayout(strategy.time) - retentionPeriod := time.Duration(retentionPeriodInWeeks) * oneWeek - return perWeekFileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, enclaveUuid, serviceUuid) -} - // Returns a Reader over all logs in [logFilePaths] and the open file descriptors of the associated [logFilePaths] func getLogsReader(filesystem volume_filesystem.VolumeFilesystem, logFilePaths []string) (*bufio.Reader, []volume_filesystem.VolumeFile, error) { var fileReaders []io.Reader @@ -143,7 +126,7 @@ func getLogsReader(filesystem volume_filesystem.VolumeFilesystem, logFilePaths [ return bufio.NewReader(combinedLogsReader), files, nil } -func (strategy *PerWeekStreamLogsStrategy) streamAllLogs( +func (strategy *StreamLogsStrategyImpl) streamAllLogs( ctx context.Context, logsReader *bufio.Reader, logLineSender *logline.LogLineSender, @@ -181,7 +164,7 @@ func (strategy *PerWeekStreamLogsStrategy) streamAllLogs( } // tail -n X -func (strategy *PerWeekStreamLogsStrategy) streamTailLogs( +func (strategy *StreamLogsStrategyImpl) streamTailLogs( ctx context.Context, logsReader *bufio.Reader, numLogLines uint32, @@ -266,7 +249,7 @@ func isValidJsonEnding(line string) bool { return endOfLine == volume_consts.EndOfJsonLine } -func (strategy *PerWeekStreamLogsStrategy) sendJsonLogLine(jsonLog JsonLog, conjunctiveLogLinesFiltersWithRegex []logline.LogLineFilterWithRegex, logLineSender *logline.LogLineSender, serviceUuid service.ServiceUUID) error { +func (strategy *StreamLogsStrategyImpl) sendJsonLogLine(jsonLog JsonLog, conjunctiveLogLinesFiltersWithRegex []logline.LogLineFilterWithRegex, logLineSender *logline.LogLineSender, serviceUuid service.ServiceUUID) error { // each logLineStr is of the following structure: {"enclave_uuid": "...", "service_uuid":"...", "log": "...",.. "timestamp":"..."} // eg. {"container_type":"api-container", "container_id":"8f8558ba", "container_name":"/kurtosis-api--ffd", // "log":"hi","timestamp":"2023-08-14T14:57:49Z"} @@ -307,14 +290,14 @@ func (strategy *PerWeekStreamLogsStrategy) sendJsonLogLine(jsonLog JsonLog, conj } // Returns true if [logLine] has no timestamp -func (strategy *PerWeekStreamLogsStrategy) isWithinRetentionPeriod(logLine *logline.LogLine) (bool, error) { - retentionPeriod := strategy.time.Now().Add(time.Duration(-strategy.logRetentionPeriodInWeeks) * oneWeek) +func (strategy *StreamLogsStrategyImpl) isWithinRetentionPeriod(logLine *logline.LogLine) (bool, error) { + oldestTimeWithinRetentionPeriod := strategy.time.Now().Add(-strategy.logRetentionPeriod) timestamp := logLine.GetTimestamp() - return timestamp.After(retentionPeriod), nil + return timestamp.After(oldestTimeWithinRetentionPeriod), nil } // Continue streaming log lines as they are written to log file (tail -f [filepath]) -func (strategy *PerWeekStreamLogsStrategy) followLogs( +func (strategy *StreamLogsStrategyImpl) followLogs( ctx context.Context, filepath string, logLineSender *logline.LogLineSender, diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy_test.go index 6d52dea218..ed8cc5e642 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy_test.go @@ -57,7 +57,7 @@ func TestGetLogFilePaths(t *testing.T) { } mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) - strategy := NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) + strategy := NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) logFilePaths, err := strategy.getLogFilePaths(filesystem, retentionPeriodInWeeksForTesting, testEnclaveUuid, testUserService1Uuid) require.NoError(t, err) @@ -94,7 +94,7 @@ func TestGetLogFilePathsAcrossNewYear(t *testing.T) { } mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) - strategy := NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) + strategy := NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) logFilePaths, err := strategy.getLogFilePaths(filesystem, retentionPeriodInWeeksForTesting, testEnclaveUuid, testUserService1Uuid) require.NoError(t, err) @@ -131,7 +131,7 @@ func TestGetLogFilePathsAcrossNewYearWith53Weeks(t *testing.T) { } mockTime := logs_clock.NewMockLogsClockPerDay(2016, currentWeek, 1) - strategy := NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) + strategy := NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) logFilePaths, err := strategy.getLogFilePaths(filesystem, retentionPeriodInWeeksForTesting, testEnclaveUuid, testUserService1Uuid) require.NoError(t, err) @@ -163,7 +163,7 @@ func TestGetLogFilePathsWithDiffRetentionPeriod(t *testing.T) { } mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) - strategy := NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) + strategy := NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) logFilePaths, err := strategy.getLogFilePaths(filesystem, retentionPeriod, testEnclaveUuid, testUserService1Uuid) require.NoError(t, err) @@ -195,7 +195,7 @@ func TestGetLogFilePathsReturnsAllAvailableWeeks(t *testing.T) { currentWeek := 2 mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) - strategy := NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) + strategy := NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) logFilePaths, err := strategy.getLogFilePaths(filesystem, retentionPeriodInWeeksForTesting, testEnclaveUuid, testUserService1Uuid) require.NoError(t, err) @@ -220,7 +220,7 @@ func TestGetLogFilePathsReturnsCorrectPathsIfWeeksMissingInBetween(t *testing.T) currentWeek := 3 mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) - strategy := NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) + strategy := NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) logFilePaths, err := strategy.getLogFilePaths(filesystem, retentionPeriodInWeeksForTesting, testEnclaveUuid, testUserService1Uuid) require.NoError(t, err) @@ -249,7 +249,7 @@ func TestGetLogFilePathsReturnsCorrectPathsIfCurrentWeekHasNoLogsYet(t *testing. week2filepath, } - strategy := NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) + strategy := NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) logFilePaths, err := strategy.getLogFilePaths(filesystem, retentionPeriodInWeeksForTesting, testEnclaveUuid, testUserService1Uuid) require.NoError(t, err) @@ -267,7 +267,7 @@ func TestIsWithinRetentionPeriod(t *testing.T) { // week 41 would put the log line outside the retention period mockTime := logs_clock.NewMockLogsClockPerDay(2023, 41, 0) - strategy := NewPerWeekStreamLogsStrategy(mockTime, retentionPeriodInWeeksForTesting) + strategy := NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) timestamp, err := parseTimestampFromJsonLogLine(jsonLogLine) require.NoError(t, err) diff --git a/engine/server/engine/main.go b/engine/server/engine/main.go index 058249ee1f..fe07ba0da1 100644 --- a/engine/server/engine/main.go +++ b/engine/server/engine/main.go @@ -9,8 +9,8 @@ import ( "context" "fmt" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts" "io/fs" - "math" "net" "net/http" "os" @@ -410,17 +410,11 @@ func getLogsDatabaseClient(kurtosisBackendType args.KurtosisBackendType, kurtosi case args.KurtosisBackendType_Docker: realTime := logs_clock.NewRealClock() - logRetentionPeriodInWeeks := int(math.Round(logRetentionPeriod.Hours() / float64(7*24*time.Hour))) - if logRetentionPeriodInWeeks < 1 { - logRetentionPeriodInWeeks = 1 - } - logrus.Infof("Setting log retention period to '%v' week(s).", logRetentionPeriodInWeeks) osFs := volume_filesystem.NewOsVolumeFilesystem() - perHourFileLayout := file_layout.NewPerHourFileLayout(logs_clock.NewRealClock()) - logFileManager := log_file_manager.NewLogFileManager(kurtosisBackend, osFs, perHourFileLayout, realTime, logRetentionPeriodInWeeks) - perWeekStreamLogsStrategy := stream_logs_strategy.NewPerWeekStreamLogsStrategy(realTime, logRetentionPeriodInWeeks) - - logsDatabaseClient = persistent_volume.NewPersistentVolumeLogsDatabaseClient(kurtosisBackend, osFs, logFileManager, perWeekStreamLogsStrategy) + perHourFileLayout := file_layout.NewPerHourFileLayout(realTime) + logFileManager := log_file_manager.NewLogFileManager(kurtosisBackend, osFs, perHourFileLayout, realTime, logRetentionPeriod, volume_consts.LogsStorageDirpath) + streamLogsStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(realTime, logRetentionPeriod, perHourFileLayout) + logsDatabaseClient = persistent_volume.NewPersistentVolumeLogsDatabaseClient(kurtosisBackend, osFs, logFileManager, streamLogsStrategy) case args.KurtosisBackendType_Kubernetes: logsDatabaseClient = kurtosis_backend.NewKurtosisBackendLogsDatabaseClient(kurtosisBackend) } From b1d5ef2d16c39b22b697605efa413227a339e366 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 17 Oct 2024 19:22:58 +0900 Subject: [PATCH 57/78] revert go work to go1.2 --- go.work | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.work b/go.work index 318f912450..25ef877ed8 100644 --- a/go.work +++ b/go.work @@ -20,4 +20,4 @@ use ( ./name_generator ./path-compression connect-server -) +) \ No newline at end of file From 646fa158a26930b9446b0abcd91014b863dc40f3 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 17 Oct 2024 19:26:09 +0900 Subject: [PATCH 58/78] revert go mods --- cli/cli/go.sum | 21 +++++++++++++++++++++ enclave-manager/server/go.sum | 14 ++++++++++++++ engine/server/go.mod | 4 +--- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/cli/cli/go.sum b/cli/cli/go.sum index 417886b8f6..780d095316 100644 --- a/cli/cli/go.sum +++ b/cli/cli/go.sum @@ -4,7 +4,9 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= cloud.google.com/go v0.110.4 h1:1JYyxKMN9hd5dR2MYTPWkGUgcoxVVhg0LKNKEo0qvmk= cloud.google.com/go/compute v1.20.1 h1:6aKEtlUiwEpJzM001l0yFkpXmUVXaN8W+fbkb2AZNbg= +cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= @@ -18,6 +20,7 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= +github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= @@ -44,6 +47,7 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= @@ -111,6 +115,7 @@ github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vc github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/compose-spec/compose-go v1.17.0 h1:cvje90CU94dQyTnJoHJYjx9yE4Iggse1XmGcO3Qi5ts= @@ -129,6 +134,7 @@ github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7Do github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0= +github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -169,6 +175,7 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.10.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byAbud7miNWJ1WwEVf8= +github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= @@ -178,8 +185,10 @@ github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiD github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= github.com/gammazero/deque v0.1.0 h1:f9LnNmq66VDeuAlSAapemq/U7hJ2jpIWa4c09q8Dlik= github.com/gammazero/deque v0.1.0/go.mod h1:KQw7vFau1hHuM8xmI9RbgKFbAsQFWmBpqQ2KenFLk6M= github.com/gammazero/workerpool v1.1.2 h1:vuioDQbgrz4HoaCi2q1HLlOXdpbap5AET7xu5/qj87g= @@ -216,8 +225,10 @@ github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+ github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-playground/validator/v10 v10.14.1 h1:9c50NUPC30zyuKprjL3vNZ0m5oG+jU0zvx4AqHGnv4k= github.com/go-playground/validator/v10 v10.14.1/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= @@ -234,6 +245,7 @@ github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6Wezm github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= @@ -299,6 +311,7 @@ github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= @@ -325,6 +338,7 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 h1:2VTzZjLZBgl62/EtslCrtky5vbi9dd7HrQPQIx6wqiw= +github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -424,6 +438,7 @@ github.com/kurtosis-tech/vscode-kurtosis/starlark-lsp v0.0.0-20230406131103-c466 github.com/kurtosis-tech/vscode-kurtosis/starlark-lsp v0.0.0-20230406131103-c466e04f1b89/go.mod h1:pU+cJk1CpUQJTVt2+LOQ+wAfe8pcsmw8svuuMVR+GYA= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= @@ -455,6 +470,7 @@ github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebG github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= +github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/mholt/archiver v3.1.1+incompatible h1:1dCVxuqs0dJseYEhi5pl7MYPH9zDa1wBi7mF09cbNkU= github.com/mholt/archiver v3.1.1+incompatible/go.mod h1:Dh2dOXnSdiLxRiPoVfIr/fI1TwETms9B8CTWfeh7ROU= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= @@ -509,8 +525,10 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= +github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= @@ -675,6 +693,7 @@ github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= @@ -1020,6 +1039,7 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/h2non/gock.v1 v1.1.2 h1:jBbHXgGBK/AoPVfJh5x4r/WxIrElvbLel8TCZkkZJoY= +gopkg.in/h2non/gock.v1 v1.1.2/go.mod h1:n7UGz/ckNChHiK05rDoiC4MYSunEC/lyaUm2WWaDva0= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= @@ -1043,6 +1063,7 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= +gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/enclave-manager/server/go.sum b/enclave-manager/server/go.sum index e96ad32d60..2f0d4cb945 100644 --- a/enclave-manager/server/go.sum +++ b/enclave-manager/server/go.sum @@ -1,6 +1,7 @@ cloud.google.com/go v0.26.0 h1:e0WKqKTd5BnrG8aKH3J3h+QvEIQtSUcf2n5UZ5ZgLtQ= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= +cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= connectrpc.com/connect v1.11.1 h1:dqRwblixqkVh+OFBOOL1yIf1jS/yP0MSJLijRj29bFg= @@ -15,6 +16,7 @@ github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/containerd/containerd v1.7.2 h1:UF2gdONnxO8I6byZXDi5sXWiWvlW3D/sci7dTQimEJo= github.com/containerd/containerd v1.7.2/go.mod h1:afcz74+K10M/+cjGHIVQrCt3RAQhUSCAjJ9iMYhhkuI= github.com/containerd/typeurl/v2 v2.1.1 h1:3Q4Pt7i8nYwy2KmQWIw2+1hTvwTE/6w9FqcttATPO/4= @@ -22,6 +24,7 @@ github.com/containerd/typeurl/v2 v2.1.1/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3H github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0= +github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -41,7 +44,9 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.10.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byAbud7miNWJ1WwEVf8= +github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -70,6 +75,7 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github/v60 v60.0.0 h1:oLG98PsLauFvvu4D/YPxq374jhSxFYdzQGNCyONLfn8= github.com/google/go-github/v60 v60.0.0/go.mod h1:ByhX2dP9XT9o/ll2yXAu2VD8l5eNVg8hD4Cr0S/LmQk= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= @@ -128,6 +134,7 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= @@ -140,6 +147,7 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= @@ -181,12 +189,14 @@ golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= +golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= +golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -201,6 +211,7 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -219,6 +230,7 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -240,7 +252,9 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= +gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/engine/server/go.mod b/engine/server/go.mod index 77720dcce2..4660cedcc6 100644 --- a/engine/server/go.mod +++ b/engine/server/go.mod @@ -1,8 +1,6 @@ module github.com/kurtosis-tech/kurtosis/engine/server -go 1.21 - -toolchain go1.22.7 +go 1.20 replace ( github.com/kurtosis-tech/kurtosis/api/golang => ../../api/golang From 6234fc2f067703d1e126807fbc298fab71d7eca4 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 17 Oct 2024 19:28:18 +0900 Subject: [PATCH 59/78] convert to duration --- .../persistent_volume/log_file_manager/log_file_manager_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go index dde02fdd78..1286933179 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go @@ -50,7 +50,7 @@ func TestRemoveLogsBeyondRetentionPeriod(t *testing.T) { _, _ = mockFs.Create(week1filepath) _, _ = mockFs.Create(week2filepath) - logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, 5, volume_consts.LogsStorageDirpath) + logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, convertWeeksToDuration(5), volume_consts.LogsStorageDirpath) logFileManager.RemoveLogsBeyondRetentionPeriod(ctx) // should remove week 49 logs _, err := mockFs.Stat(week49filepath) From 936b4ad1c275bc5fe93ab2a529e19ece3f75954f Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 17 Oct 2024 19:46:49 +0900 Subject: [PATCH 60/78] fix some tests --- ...istent_volume_logs_database_client_test.go | 21 +- .../per_file_stream_logs_strategy.go | 1 + .../per_week_stream_logs_strategy_test.go | 244 +----------------- engine/server/go.sum | 16 -- 4 files changed, 20 insertions(+), 262 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go index 8597d18dc9..3980bf0c52 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go @@ -132,7 +132,7 @@ func TestStreamUserServiceLogsPerWeek_WithFilters(t *testing.T) { underlyingFs := createFilledPerWeekFilesystem(startingWeek) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime)) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -215,7 +215,7 @@ func TestStreamUserServiceLogsPerWeek_NoLogsFromPersistentVolume(t *testing.T) { underlyingFs := createEmptyPerWeekFilesystem(startingWeek) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime)) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -320,7 +320,7 @@ func TestStreamUserServiceLogsPerWeek_ThousandsOfLogLinesSuccessfulExecution(t * require.NoError(t, err) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime)) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -407,7 +407,7 @@ func TestStreamUserServiceLogsPerWeek_EmptyLogLines(t *testing.T) { require.NoError(t, err) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime)) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -474,7 +474,7 @@ func TestStreamUserServiceLogsPerWeek_WithLogsAcrossWeeks(t *testing.T) { require.NoError(t, err) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, 4, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime)) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -543,7 +543,7 @@ func TestStreamUserServiceLogsPerWeek_WithLogLineAcrossWeeks(t *testing.T) { require.NoError(t, err) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, 4, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime)) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -594,7 +594,7 @@ func TestStreamUserServiceLogsPerWeekReturnsTimestampedLogLines(t *testing.T) { require.NoError(t, err) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime)) expectedTime, err := time.Parse(utcFormat, defaultUTCTimestampStr) require.NoError(t, err) @@ -699,7 +699,7 @@ func executeStreamCallAndGetReceivedServiceLogLines( // no log file management is done in these tests so values for logFileManager aren't important mockTime := logs_clock.NewMockLogsClockPerDay(0, 0, 0) fileLayout := file_layout.NewPerWeekFileLayout(mockTime) - logFileManager := log_file_manager.NewLogFileManager(kurtosisBackend, underlyingFs, fileLayout, mockTime, 0, volume_consts.LogsStorageDirpath) + logFileManager := log_file_manager.NewLogFileManager(kurtosisBackend, underlyingFs, fileLayout, mockTime, time.Duration(0), volume_consts.LogsStorageDirpath) logsDatabaseClient := NewPersistentVolumeLogsDatabaseClient(kurtosisBackend, underlyingFs, logFileManager, streamStrategy) userServiceLogsByUuidChan, errChan, receivedCancelCtxFunc, err := logsDatabaseClient.StreamUserServiceLogs(ctx, enclaveUuid, userServiceUuids, logLinesFilters, shouldFollowLogs, defaultShouldReturnAllLogs, defaultNumLogLines) @@ -831,3 +831,8 @@ func createEmptyPerWeekFilesystem(week int) volume_filesystem.VolumeFilesystem { return mapFs } + +func convertWeeksToDuration(retentionPeriodInWeeks int) time.Duration { + const hoursInWeek = 7 * 24 // 7 days * 24 hours + return time.Duration(retentionPeriodInWeeks*hoursInWeek) * time.Hour +} diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_file_stream_logs_strategy.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_file_stream_logs_strategy.go index b322e8c214..98830c002e 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_file_stream_logs_strategy.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_file_stream_logs_strategy.go @@ -17,6 +17,7 @@ import ( "strings" ) +// TODO: Remove after FileLayout and new StreamLogStrategyImpl are merged // This strategy pulls logs from filesytsem where there is a log file per enclave, per service type PerFileStreamLogsStrategy struct { } diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy_test.go index ed8cc5e642..121369577b 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy_test.go @@ -6,7 +6,6 @@ import ( "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts" - "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/logline" "github.com/stretchr/testify/require" "io" @@ -21,244 +20,8 @@ const ( testUserService1Uuid = "test-user-service-1" retentionPeriodInWeeksForTesting = 5 - - defaultYear = 2023 - defaultDay = 0 // sunday ) -// TODO: migrate GetLogFilePaths tests to FileLayout interface when it is fully merged -// for now, leave them duplicated so there's an extra layer of testing as the migration happens -func TestGetLogFilePaths(t *testing.T) { - filesystem := volume_filesystem.NewMockedVolumeFilesystem() - - // ../week/enclave uuid/service uuid.json - week12filepath := getWeekFilepathStr(defaultYear, 12) - week13filepath := getWeekFilepathStr(defaultYear, 13) - week14filepath := getWeekFilepathStr(defaultYear, 14) - week15filepath := getWeekFilepathStr(defaultYear, 15) - week16filepath := getWeekFilepathStr(defaultYear, 16) - week17filepath := getWeekFilepathStr(defaultYear, 17) - - _, _ = filesystem.Create(week12filepath) - _, _ = filesystem.Create(week13filepath) - _, _ = filesystem.Create(week14filepath) - _, _ = filesystem.Create(week15filepath) - _, _ = filesystem.Create(week16filepath) - _, _ = filesystem.Create(week17filepath) - - currentWeek := 17 - - expectedLogFilePaths := []string{ - week13filepath, - week14filepath, - week15filepath, - week16filepath, - week17filepath, - } - - mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) - strategy := NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) - logFilePaths, err := strategy.getLogFilePaths(filesystem, retentionPeriodInWeeksForTesting, testEnclaveUuid, testUserService1Uuid) - - require.NoError(t, err) - require.Equal(t, len(expectedLogFilePaths), len(logFilePaths)) - for i, filePath := range expectedLogFilePaths { - require.Equal(t, filePath, logFilePaths[i]) - } -} - -func TestGetLogFilePathsAcrossNewYear(t *testing.T) { - filesystem := volume_filesystem.NewMockedVolumeFilesystem() - - // ../week/enclave uuid/service uuid.json - week50filepath := getWeekFilepathStr(defaultYear-1, 50) - week51filepath := getWeekFilepathStr(defaultYear-1, 51) - week52filepath := getWeekFilepathStr(defaultYear-1, 52) - week1filepath := getWeekFilepathStr(defaultYear, 1) - week2filepath := getWeekFilepathStr(defaultYear, 2) - - _, _ = filesystem.Create(week50filepath) - _, _ = filesystem.Create(week51filepath) - _, _ = filesystem.Create(week52filepath) - _, _ = filesystem.Create(week1filepath) - _, _ = filesystem.Create(week2filepath) - - currentWeek := 2 - - expectedLogFilePaths := []string{ - week50filepath, - week51filepath, - week52filepath, - week1filepath, - week2filepath, - } - - mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) - strategy := NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) - logFilePaths, err := strategy.getLogFilePaths(filesystem, retentionPeriodInWeeksForTesting, testEnclaveUuid, testUserService1Uuid) - - require.NoError(t, err) - require.Equal(t, len(expectedLogFilePaths), len(logFilePaths)) - for i, filePath := range expectedLogFilePaths { - require.Equal(t, filePath, logFilePaths[i]) - } -} - -func TestGetLogFilePathsAcrossNewYearWith53Weeks(t *testing.T) { - filesystem := volume_filesystem.NewMockedVolumeFilesystem() - - // According to ISOWeek, 2015 has 53 weeks - week52filepath := getWeekFilepathStr(2015, 52) - week53filepath := getWeekFilepathStr(2015, 53) - week1filepath := getWeekFilepathStr(2016, 1) - week2filepath := getWeekFilepathStr(2016, 2) - week3filepath := getWeekFilepathStr(2016, 3) - - _, _ = filesystem.Create(week52filepath) - _, _ = filesystem.Create(week53filepath) - _, _ = filesystem.Create(week1filepath) - _, _ = filesystem.Create(week2filepath) - _, _ = filesystem.Create(week3filepath) - - currentWeek := 3 - - expectedLogFilePaths := []string{ - week52filepath, - week53filepath, - week1filepath, - week2filepath, - week3filepath, - } - - mockTime := logs_clock.NewMockLogsClockPerDay(2016, currentWeek, 1) - strategy := NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) - logFilePaths, err := strategy.getLogFilePaths(filesystem, retentionPeriodInWeeksForTesting, testEnclaveUuid, testUserService1Uuid) - - require.NoError(t, err) - require.Equal(t, len(expectedLogFilePaths), len(logFilePaths)) - for i, filePath := range expectedLogFilePaths { - require.Equal(t, filePath, logFilePaths[i]) - } -} - -func TestGetLogFilePathsWithDiffRetentionPeriod(t *testing.T) { - filesystem := volume_filesystem.NewMockedVolumeFilesystem() - - // ../week/enclave uuid/service uuid.json - week52filepath := getWeekFilepathStr(defaultYear-1, 52) - week1filepath := getWeekFilepathStr(defaultYear, 1) - week2filepath := getWeekFilepathStr(defaultYear, 2) - - _, _ = filesystem.Create(week52filepath) - _, _ = filesystem.Create(week1filepath) - _, _ = filesystem.Create(week2filepath) - - currentWeek := 2 - retentionPeriod := 3 - - expectedLogFilePaths := []string{ - week52filepath, - week1filepath, - week2filepath, - } - - mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) - strategy := NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) - logFilePaths, err := strategy.getLogFilePaths(filesystem, retentionPeriod, testEnclaveUuid, testUserService1Uuid) - - require.NoError(t, err) - require.Equal(t, len(expectedLogFilePaths), len(logFilePaths)) - for i, filePath := range expectedLogFilePaths { - require.Equal(t, filePath, logFilePaths[i]) - } -} - -func TestGetLogFilePathsReturnsAllAvailableWeeks(t *testing.T) { - filesystem := volume_filesystem.NewMockedVolumeFilesystem() - - // ../week/enclave uuid/service uuid.json - week52filepath := getWeekFilepathStr(defaultYear-1, 52) - week1filepath := getWeekFilepathStr(defaultYear, 1) - week2filepath := getWeekFilepathStr(defaultYear, 2) - - _, _ = filesystem.Create(week52filepath) - _, _ = filesystem.Create(week1filepath) - _, _ = filesystem.Create(week2filepath) - - // should return existing file paths even though log files going all the back to retention period don't exist - expectedLogFilePaths := []string{ - week52filepath, - week1filepath, - week2filepath, - } - - currentWeek := 2 - - mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) - strategy := NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) - logFilePaths, err := strategy.getLogFilePaths(filesystem, retentionPeriodInWeeksForTesting, testEnclaveUuid, testUserService1Uuid) - - require.NoError(t, err) - require.Less(t, len(logFilePaths), retentionPeriodInWeeksForTesting) - for i, filePath := range expectedLogFilePaths { - require.Equal(t, filePath, logFilePaths[i]) - } -} - -func TestGetLogFilePathsReturnsCorrectPathsIfWeeksMissingInBetween(t *testing.T) { - filesystem := volume_filesystem.NewMockedVolumeFilesystem() - - // ../week/enclave uuid/service uuid.json - week52filepath := getWeekFilepathStr(defaultYear, 0) - week1filepath := getWeekFilepathStr(defaultYear, 1) - week3filepath := getWeekFilepathStr(defaultYear, 3) - - _, _ = filesystem.Create(week52filepath) - _, _ = filesystem.Create(week1filepath) - _, _ = filesystem.Create(week3filepath) - - currentWeek := 3 - - mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) - strategy := NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) - logFilePaths, err := strategy.getLogFilePaths(filesystem, retentionPeriodInWeeksForTesting, testEnclaveUuid, testUserService1Uuid) - - require.NoError(t, err) - require.Len(t, logFilePaths, 1) - require.Equal(t, week3filepath, logFilePaths[0]) // should only return week 3 because week 2 is missing -} - -func TestGetLogFilePathsReturnsCorrectPathsIfCurrentWeekHasNoLogsYet(t *testing.T) { - // currently in week 3 - currentWeek := 3 - mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) - - filesystem := volume_filesystem.NewMockedVolumeFilesystem() - - // ../week/enclave uuid/service uuid.json - week1filepath := getWeekFilepathStr(defaultYear, 1) - week2filepath := getWeekFilepathStr(defaultYear, 2) - - // no logs for week current week exist yet - _, _ = filesystem.Create(week1filepath) - _, _ = filesystem.Create(week2filepath) - - // should return week 1 and 2 logs, even though no logs for current week yet - expectedLogFilePaths := []string{ - week1filepath, - week2filepath, - } - - strategy := NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) - logFilePaths, err := strategy.getLogFilePaths(filesystem, retentionPeriodInWeeksForTesting, testEnclaveUuid, testUserService1Uuid) - - require.NoError(t, err) - require.Equal(t, len(expectedLogFilePaths), len(logFilePaths)) - for i, filePath := range expectedLogFilePaths { - require.Equal(t, filePath, logFilePaths[i]) - } -} - func TestIsWithinRetentionPeriod(t *testing.T) { // this is the 36th week of the year jsonLogLine := map[string]string{ @@ -267,7 +30,7 @@ func TestIsWithinRetentionPeriod(t *testing.T) { // week 41 would put the log line outside the retention period mockTime := logs_clock.NewMockLogsClockPerDay(2023, 41, 0) - strategy := NewStreamLogsStrategyImpl(mockTime, retentionPeriodInWeeksForTesting, file_layout.NewPerWeekFileLayout(mockTime)) + strategy := NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime)) timestamp, err := parseTimestampFromJsonLogLine(jsonLogLine) require.NoError(t, err) @@ -517,3 +280,8 @@ func TestParseTimestampFromJsonLogLineWithNoTimestampFieldReturnsError(t *testin require.Error(t, err) } + +func convertWeeksToDuration(retentionPeriodInWeeks int) time.Duration { + const hoursInWeek = 7 * 24 // 7 days * 24 hours + return time.Duration(retentionPeriodInWeeks*hoursInWeek) * time.Hour +} diff --git a/engine/server/go.sum b/engine/server/go.sum index 7091283936..c027f4c074 100644 --- a/engine/server/go.sum +++ b/engine/server/go.sum @@ -25,7 +25,6 @@ cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUM cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/compute v1.20.1 h1:6aKEtlUiwEpJzM001l0yFkpXmUVXaN8W+fbkb2AZNbg= -cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= @@ -54,7 +53,6 @@ github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMz github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= @@ -67,7 +65,6 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/containerd/containerd v1.7.2 h1:UF2gdONnxO8I6byZXDi5sXWiWvlW3D/sci7dTQimEJo= github.com/containerd/containerd v1.7.2/go.mod h1:afcz74+K10M/+cjGHIVQrCt3RAQhUSCAjJ9iMYhhkuI= github.com/containerd/typeurl/v2 v2.1.1 h1:3Q4Pt7i8nYwy2KmQWIw2+1hTvwTE/6w9FqcttATPO/4= @@ -75,7 +72,6 @@ github.com/containerd/typeurl/v2 v2.1.1/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3H github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0= -github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -100,11 +96,8 @@ github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5y github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.10.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byAbud7miNWJ1WwEVf8= -github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= -github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gammazero/deque v0.1.0 h1:f9LnNmq66VDeuAlSAapemq/U7hJ2jpIWa4c09q8Dlik= github.com/gammazero/deque v0.1.0/go.mod h1:KQw7vFau1hHuM8xmI9RbgKFbAsQFWmBpqQ2KenFLk6M= github.com/gammazero/workerpool v1.1.2 h1:vuioDQbgrz4HoaCi2q1HLlOXdpbap5AET7xu5/qj87g= @@ -133,7 +126,6 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= -github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -208,7 +200,6 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= @@ -252,7 +243,6 @@ github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfn github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -302,9 +292,7 @@ github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWk github.com/oapi-codegen/runtime v1.1.0 h1:rJpoNUawn5XTvekgfkvSZr0RqEnoYpFkyvrzfWeFKWM= github.com/oapi-codegen/runtime v1.1.0/go.mod h1:BeSfBkWWWnAnGdyS+S/GnlbmHKzf8/hwkvelJZDeKA8= github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= -github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= -github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0-rc3 h1:fzg1mXZFj8YdPeNkRXMg+zb88BFV0Ys52cJydRwBkb8= @@ -324,7 +312,6 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/segmentio/backo-go v1.0.0 h1:kbOAtGJY2DqOR0jfRkYEorx/b18RgtepGtY3+Cpe6qA= @@ -357,7 +344,6 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= -github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= @@ -495,7 +481,6 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -742,7 +727,6 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= -gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From 6fb72184ca31cf80f01a8ee27c80f14289a40b53 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 17 Oct 2024 19:47:47 +0900 Subject: [PATCH 61/78] rename per week stream logs strategy --- ..._week_stream_logs_strategy.go => stream_logs_strategy_impl.go} | 0 ...am_logs_strategy_test.go => stream_logs_strategy_impl_test.go} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/{per_week_stream_logs_strategy.go => stream_logs_strategy_impl.go} (100%) rename engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/{per_week_stream_logs_strategy_test.go => stream_logs_strategy_impl_test.go} (100%) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/stream_logs_strategy_impl.go similarity index 100% rename from engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy.go rename to engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/stream_logs_strategy_impl.go diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/stream_logs_strategy_impl_test.go similarity index 100% rename from engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/per_week_stream_logs_strategy_test.go rename to engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/stream_logs_strategy_impl_test.go From 6edc1283f6b90e7583edc4fc0fd73aa1229a345c Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 17 Oct 2024 19:53:15 +0900 Subject: [PATCH 62/78] update go sums --- cli/cli/go.sum | 21 --------------------- enclave-manager/server/go.sum | 14 -------------- 2 files changed, 35 deletions(-) diff --git a/cli/cli/go.sum b/cli/cli/go.sum index 780d095316..417886b8f6 100644 --- a/cli/cli/go.sum +++ b/cli/cli/go.sum @@ -4,9 +4,7 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= cloud.google.com/go v0.110.4 h1:1JYyxKMN9hd5dR2MYTPWkGUgcoxVVhg0LKNKEo0qvmk= cloud.google.com/go/compute v1.20.1 h1:6aKEtlUiwEpJzM001l0yFkpXmUVXaN8W+fbkb2AZNbg= -cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= @@ -20,7 +18,6 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= -github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= @@ -47,7 +44,6 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= @@ -115,7 +111,6 @@ github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vc github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/compose-spec/compose-go v1.17.0 h1:cvje90CU94dQyTnJoHJYjx9yE4Iggse1XmGcO3Qi5ts= @@ -134,7 +129,6 @@ github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7Do github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0= -github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -175,7 +169,6 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.10.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byAbud7miNWJ1WwEVf8= -github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= @@ -185,10 +178,8 @@ github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiD github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= -github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= -github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= github.com/gammazero/deque v0.1.0 h1:f9LnNmq66VDeuAlSAapemq/U7hJ2jpIWa4c09q8Dlik= github.com/gammazero/deque v0.1.0/go.mod h1:KQw7vFau1hHuM8xmI9RbgKFbAsQFWmBpqQ2KenFLk6M= github.com/gammazero/workerpool v1.1.2 h1:vuioDQbgrz4HoaCi2q1HLlOXdpbap5AET7xu5/qj87g= @@ -225,10 +216,8 @@ github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+ github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= -github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= -github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-playground/validator/v10 v10.14.1 h1:9c50NUPC30zyuKprjL3vNZ0m5oG+jU0zvx4AqHGnv4k= github.com/go-playground/validator/v10 v10.14.1/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= @@ -245,7 +234,6 @@ github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6Wezm github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= @@ -311,7 +299,6 @@ github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= @@ -338,7 +325,6 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 h1:2VTzZjLZBgl62/EtslCrtky5vbi9dd7HrQPQIx6wqiw= -github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -438,7 +424,6 @@ github.com/kurtosis-tech/vscode-kurtosis/starlark-lsp v0.0.0-20230406131103-c466 github.com/kurtosis-tech/vscode-kurtosis/starlark-lsp v0.0.0-20230406131103-c466e04f1b89/go.mod h1:pU+cJk1CpUQJTVt2+LOQ+wAfe8pcsmw8svuuMVR+GYA= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= -github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= @@ -470,7 +455,6 @@ github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebG github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= -github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/mholt/archiver v3.1.1+incompatible h1:1dCVxuqs0dJseYEhi5pl7MYPH9zDa1wBi7mF09cbNkU= github.com/mholt/archiver v3.1.1+incompatible/go.mod h1:Dh2dOXnSdiLxRiPoVfIr/fI1TwETms9B8CTWfeh7ROU= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= @@ -525,10 +509,8 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= -github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= -github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= @@ -693,7 +675,6 @@ github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= -github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= @@ -1039,7 +1020,6 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/h2non/gock.v1 v1.1.2 h1:jBbHXgGBK/AoPVfJh5x4r/WxIrElvbLel8TCZkkZJoY= -gopkg.in/h2non/gock.v1 v1.1.2/go.mod h1:n7UGz/ckNChHiK05rDoiC4MYSunEC/lyaUm2WWaDva0= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= @@ -1063,7 +1043,6 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= -gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/enclave-manager/server/go.sum b/enclave-manager/server/go.sum index 2f0d4cb945..e96ad32d60 100644 --- a/enclave-manager/server/go.sum +++ b/enclave-manager/server/go.sum @@ -1,7 +1,6 @@ cloud.google.com/go v0.26.0 h1:e0WKqKTd5BnrG8aKH3J3h+QvEIQtSUcf2n5UZ5ZgLtQ= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= -cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= connectrpc.com/connect v1.11.1 h1:dqRwblixqkVh+OFBOOL1yIf1jS/yP0MSJLijRj29bFg= @@ -16,7 +15,6 @@ github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/containerd/containerd v1.7.2 h1:UF2gdONnxO8I6byZXDi5sXWiWvlW3D/sci7dTQimEJo= github.com/containerd/containerd v1.7.2/go.mod h1:afcz74+K10M/+cjGHIVQrCt3RAQhUSCAjJ9iMYhhkuI= github.com/containerd/typeurl/v2 v2.1.1 h1:3Q4Pt7i8nYwy2KmQWIw2+1hTvwTE/6w9FqcttATPO/4= @@ -24,7 +22,6 @@ github.com/containerd/typeurl/v2 v2.1.1/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3H github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0= -github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -44,9 +41,7 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.10.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byAbud7miNWJ1WwEVf8= -github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= -github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -75,7 +70,6 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github/v60 v60.0.0 h1:oLG98PsLauFvvu4D/YPxq374jhSxFYdzQGNCyONLfn8= github.com/google/go-github/v60 v60.0.0/go.mod h1:ByhX2dP9XT9o/ll2yXAu2VD8l5eNVg8hD4Cr0S/LmQk= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= @@ -134,7 +128,6 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= @@ -147,7 +140,6 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= @@ -189,14 +181,12 @@ golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= -golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -211,7 +201,6 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -230,7 +219,6 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -252,9 +240,7 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= -gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From 84a31f24af3cff4c8764f015db04c1e85aa87edd Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 17 Oct 2024 20:00:06 +0900 Subject: [PATCH 63/78] lint engine --- .../stream_logs_strategy/stream_logs_strategy_impl.go | 4 ---- .../stream_logs_strategy_impl_test.go | 11 ----------- 2 files changed, 15 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/stream_logs_strategy_impl.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/stream_logs_strategy_impl.go index f681fd394e..3117a06931 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/stream_logs_strategy_impl.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/stream_logs_strategy_impl.go @@ -21,10 +21,6 @@ import ( "github.com/sirupsen/logrus" ) -const ( - oneWeek = 7 * 24 * time.Hour -) - // StreamLogsStrategyImpl pulls logs from filesystem where there is a log file per year, per week, per enclave, per service // Weeks are denoted 01-52 // e.g. diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/stream_logs_strategy_impl_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/stream_logs_strategy_impl_test.go index 121369577b..2183d7a822 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/stream_logs_strategy_impl_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/stream_logs_strategy_impl_test.go @@ -2,23 +2,18 @@ package stream_logs_strategy import ( "bufio" - "fmt" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/logline" "github.com/stretchr/testify/require" "io" - "strconv" "strings" "testing" "time" ) const ( - testEnclaveUuid = "test-enclave" - testUserService1Uuid = "test-user-service-1" - retentionPeriodInWeeksForTesting = 5 ) @@ -42,12 +37,6 @@ func TestIsWithinRetentionPeriod(t *testing.T) { require.False(t, isWithinRetentionPeriod) } -func getWeekFilepathStr(year, week int) string { - // %02d to format week num with leading zeros so 1-9 are converted to 01-09 for %V format - formattedWeekNum := fmt.Sprintf("%02d", week) - return fmt.Sprintf(file_layout.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(year), formattedWeekNum, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) -} - func TestGetCompleteJsonLogString(t *testing.T) { logLine1 := "{\"log\":\"Starting feature 'runs idempotently'\"}" logLine2a := "{\"log\":\"Starting feature 'apic " From d0061b09447086eeb29692613c499f90c8c20bea Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 17 Oct 2024 20:13:23 +0900 Subject: [PATCH 64/78] update vector storage path --- .../logs_aggregator_functions/implementations/vector/consts.go | 2 +- .../persistent_volume/file_layout/per_hour_file_layout.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector/consts.go b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector/consts.go index 0dbab25c2b..ec1d996572 100644 --- a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector/consts.go +++ b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector/consts.go @@ -24,7 +24,7 @@ const ( // We instruct vector to store log files per-year, per-week (00-53), per-enclave, per-service // To construct the filepath, we utilize vectors template syntax that allows us to reference fields in log events // https://vector.dev/docs/reference/configuration/template-syntax/ - baseLogsFilepath = "\"" + logsStorageDirpath + "%%Y/%%V/" + baseLogsFilepath = "\"" + logsStorageDirpath + "%%Y/%%V/%%U/%%H" uuidLogsFilepath = baseLogsFilepath + "{{ enclave_uuid }}/{{ service_uuid }}.json\"" diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go index 012f4af97f..77dc3ce214 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go @@ -33,7 +33,7 @@ func NewPerHourFileLayout(time logs_clock.LogsClock) *PerHourFileLayout { func (phf *PerHourFileLayout) GetLogFileLayoutFormat() string { // Right now this format is specifically made for Vector Logs Aggregators format // This wil be used my Vector LogsAggregator to determine the path to output to - return fmt.Sprintf("%s%%Y/%%V/%%u/%%H/{{ enclave_uuid }}/{{ service_uuid }}.json", volume_consts.LogsStorageDirpath) + return fmt.Sprintf("%s%%Y/%%V/%%U/%%H/{{ enclave_uuid }}/{{ service_uuid }}.json", volume_consts.LogsStorageDirpath) } func (phf *PerHourFileLayout) GetLogFilePath(time time.Time, enclaveUuid, serviceUuid string) string { From a5f7c4633af2e4875f3f9f4a97d8d99ecb7d4e12 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Thu, 17 Oct 2024 20:15:31 +0900 Subject: [PATCH 65/78] add todo --- .../persistent_volume/file_layout/per_hour_file_layout.go | 1 + 1 file changed, 1 insertion(+) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go index 77dc3ce214..42f1eefd3e 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go @@ -33,6 +33,7 @@ func NewPerHourFileLayout(time logs_clock.LogsClock) *PerHourFileLayout { func (phf *PerHourFileLayout) GetLogFileLayoutFormat() string { // Right now this format is specifically made for Vector Logs Aggregators format // This wil be used my Vector LogsAggregator to determine the path to output to + // TODO: add a test that makes sure whats returned by the vector storage format always matches vector storage format return fmt.Sprintf("%s%%Y/%%V/%%U/%%H/{{ enclave_uuid }}/{{ service_uuid }}.json", volume_consts.LogsStorageDirpath) } From b4124e2235507670b3fc3cdececd90d1011d91df Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Fri, 18 Oct 2024 12:51:06 +0900 Subject: [PATCH 66/78] change to lowercase u --- .../implementations/vector/consts.go | 3 +-- .../persistent_volume/file_layout/per_hour_file_layout.go | 6 +++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector/consts.go b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector/consts.go index ec1d996572..8d9d8cad4e 100644 --- a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector/consts.go +++ b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector/consts.go @@ -21,10 +21,9 @@ const ( fileSinkIdSuffix = "file" fileTypeId = "\"file\"" - // We instruct vector to store log files per-year, per-week (00-53), per-enclave, per-service // To construct the filepath, we utilize vectors template syntax that allows us to reference fields in log events // https://vector.dev/docs/reference/configuration/template-syntax/ - baseLogsFilepath = "\"" + logsStorageDirpath + "%%Y/%%V/%%U/%%H" + baseLogsFilepath = "\"" + logsStorageDirpath + "%%Y/%%V/%%u/%%H/" uuidLogsFilepath = baseLogsFilepath + "{{ enclave_uuid }}/{{ service_uuid }}.json\"" diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go index 42f1eefd3e..274299a5b7 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go @@ -5,6 +5,7 @@ import ( "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" + "github.com/sirupsen/logrus" "golang.org/x/exp/slices" "math" "os" @@ -34,7 +35,9 @@ func (phf *PerHourFileLayout) GetLogFileLayoutFormat() string { // Right now this format is specifically made for Vector Logs Aggregators format // This wil be used my Vector LogsAggregator to determine the path to output to // TODO: add a test that makes sure whats returned by the vector storage format always matches vector storage format - return fmt.Sprintf("%s%%Y/%%V/%%U/%%H/{{ enclave_uuid }}/{{ service_uuid }}.json", volume_consts.LogsStorageDirpath) + // TODO: there also needs to be a test to make sure the values produced by Y, V, U, and H are identical to whats produced by golangs + // time.ISOWeek(), time.WeekDay(), time.Hour() calculations + return fmt.Sprintf("%s%%Y/%%V/%%u/%%H/{{ enclave_uuid }}/{{ service_uuid }}.json", volume_consts.LogsStorageDirpath) } func (phf *PerHourFileLayout) GetLogFilePath(time time.Time, enclaveUuid, serviceUuid string) string { @@ -71,6 +74,7 @@ func (phf *PerHourFileLayout) getLogFilePathsFromNowTillRetentionPeriod(fs volum for i := 0; i < retentionPeriodInHours; i++ { year, week, day, hour := TimeToWeekDayHour(currentTime.Add(time.Duration(-i) * time.Hour)) filePathStr := getHourlyLogFilePath(year, week, day, hour, enclaveUuid, serviceUuid) + logrus.Infof("Looking for logs for service '%v' in enclave '%v' at filepath: %v", enclaveUuid, serviceUuid, filePathStr) if _, err := fs.Stat(filePathStr); err == nil { paths = append(paths, filePathStr) firstHourWithLogs = i From 3cb70fa8a15a9e288984127354c271697032f233 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Fri, 18 Oct 2024 12:59:40 +0900 Subject: [PATCH 67/78] parametrize base logs storage path --- .../file_layout/per_hour_file_layout.go | 20 ++++++++-------- .../file_layout/per_hour_file_layout_test.go | 11 +++++---- .../file_layout/per_week_file_layout.go | 21 +++++++++-------- .../file_layout/per_week_file_layout_test.go | 23 ++++++++++--------- .../log_file_manager/log_file_manager_test.go | 8 +++---- ...istent_volume_logs_database_client_test.go | 16 ++++++------- .../stream_logs_strategy_impl_test.go | 2 +- engine/server/engine/main.go | 2 +- 8 files changed, 54 insertions(+), 49 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go index 274299a5b7..292f140da4 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go @@ -22,12 +22,14 @@ const ( ) type PerHourFileLayout struct { - time logs_clock.LogsClock + time logs_clock.LogsClock + baseLogsFilePath string } -func NewPerHourFileLayout(time logs_clock.LogsClock) *PerHourFileLayout { +func NewPerHourFileLayout(time logs_clock.LogsClock, baseLogsFilePath string) *PerHourFileLayout { return &PerHourFileLayout{ - time: time, + time: time, + baseLogsFilePath: baseLogsFilePath, } } @@ -44,7 +46,7 @@ func (phf *PerHourFileLayout) GetLogFilePath(time time.Time, enclaveUuid, servic year, week := time.ISOWeek() day := time.Weekday() hour := time.Hour() - return getHourlyLogFilePath(year, week, int(day), hour, enclaveUuid, serviceUuid) + return phf.getHourlyLogFilePath(year, week, int(day), hour, enclaveUuid, serviceUuid) } func (phf *PerHourFileLayout) GetLogFilePaths( @@ -73,7 +75,7 @@ func (phf *PerHourFileLayout) getLogFilePathsFromNowTillRetentionPeriod(fs volum firstHourWithLogs := 0 for i := 0; i < retentionPeriodInHours; i++ { year, week, day, hour := TimeToWeekDayHour(currentTime.Add(time.Duration(-i) * time.Hour)) - filePathStr := getHourlyLogFilePath(year, week, day, hour, enclaveUuid, serviceUuid) + filePathStr := phf.getHourlyLogFilePath(year, week, day, hour, enclaveUuid, serviceUuid) logrus.Infof("Looking for logs for service '%v' in enclave '%v' at filepath: %v", enclaveUuid, serviceUuid, filePathStr) if _, err := fs.Stat(filePathStr); err == nil { paths = append(paths, filePathStr) @@ -90,7 +92,7 @@ func (phf *PerHourFileLayout) getLogFilePathsFromNowTillRetentionPeriod(fs volum // scan for remaining files as far back as they exist before the retention period for i := firstHourWithLogs + 1; i < retentionPeriodInHours; i++ { year, week, day, hour := TimeToWeekDayHour(currentTime.Add(time.Duration(-i) * time.Hour)) - filePathStr := getHourlyLogFilePath(year, week, day, hour, enclaveUuid, serviceUuid) + filePathStr := phf.getHourlyLogFilePath(year, week, day, hour, enclaveUuid, serviceUuid) if _, err := fs.Stat(filePathStr); err != nil { break } @@ -111,7 +113,7 @@ func (phf *PerHourFileLayout) getLogFilePathsBeyondRetentionPeriod(fs volume_fil for i := 0; i < retentionPeriodIntervals; i++ { numHoursToGoBack := retentionPeriodInHours + i year, week, day, hour := TimeToWeekDayHour(currentTime.Add(time.Duration(-numHoursToGoBack) * time.Hour)) - filePathStr := getHourlyLogFilePath(year, week, day, hour, enclaveUuid, serviceUuid) + filePathStr := phf.getHourlyLogFilePath(year, week, day, hour, enclaveUuid, serviceUuid) if _, err := fs.Stat(filePathStr); err != nil { continue } @@ -121,12 +123,12 @@ func (phf *PerHourFileLayout) getLogFilePathsBeyondRetentionPeriod(fs volume_fil return paths } -func getHourlyLogFilePath(year, week, day, hour int, enclaveUuid, serviceUuid string) string { +func (phf *PerHourFileLayout) getHourlyLogFilePath(year, week, day, hour int, enclaveUuid, serviceUuid string) string { // these match the format in which Vector outputs week, hours, days formattedWeekNum := fmt.Sprintf("%02d", week) formattedDayNum := fmt.Sprintf("%02d", day) formattedHourNum := fmt.Sprintf("%02d", hour) - return fmt.Sprintf(perHourFilePathFmtSt, volume_consts.LogsStorageDirpath, strconv.Itoa(year), formattedWeekNum, formattedDayNum, formattedHourNum, enclaveUuid, serviceUuid, volume_consts.Filetype) + return fmt.Sprintf(perHourFilePathFmtSt, phf.baseLogsFilePath, strconv.Itoa(year), formattedWeekNum, formattedDayNum, formattedHourNum, enclaveUuid, serviceUuid, volume_consts.Filetype) } func TimeToWeekDayHour(time time.Time) (int, int, int, int) { diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go index 3943b10c56..43a5da0cc8 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go @@ -2,6 +2,7 @@ package file_layout import ( "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" "github.com/stretchr/testify/require" "testing" @@ -10,7 +11,7 @@ import ( func TestGetLogFilePath(t *testing.T) { currentTime := logs_clock.NewMockLogsClockPerHour(2024, 1, 1, 1) - fileLayout := NewPerHourFileLayout(currentTime) + fileLayout := NewPerHourFileLayout(currentTime, volume_consts.LogsStorageDirpath) expectedFilepath := "/var/log/kurtosis/2024/01/01/01/test-enclave/test-user-service-1.json" now := currentTime.Now() @@ -22,7 +23,7 @@ func TestGetLogFilePathsWithHourlyRetention(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() currentTime := logs_clock.NewMockLogsClockPerHour(defaultYear, defaultWeek, defaultDay, 5) - fileLayout := NewPerHourFileLayout(currentTime) + fileLayout := NewPerHourFileLayout(currentTime, volume_consts.LogsStorageDirpath) hourZeroFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(defaultYear, defaultWeek, defaultDay, 0).Now(), testEnclaveUuid, testUserService1Uuid) hourOneFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(defaultYear, defaultWeek, defaultDay, 1).Now(), testEnclaveUuid, testUserService1Uuid) @@ -63,7 +64,7 @@ func TestGetLogFilePathsWithHourlyRetentionAcrossDays(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() currentTime := logs_clock.NewMockLogsClockPerHour(defaultYear, defaultWeek, 2, 2) - fileLayout := NewPerHourFileLayout(currentTime) + fileLayout := NewPerHourFileLayout(currentTime, volume_consts.LogsStorageDirpath) hourZeroFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(defaultYear, defaultWeek, 1, 21).Now(), testEnclaveUuid, testUserService1Uuid) hourOneFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(defaultYear, defaultWeek, 1, 22).Now(), testEnclaveUuid, testUserService1Uuid) @@ -104,7 +105,7 @@ func TestGetLogFilePathsWithHourlyRetentionAcrossWeeks(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() currentTime := logs_clock.NewMockLogsClockPerHour(defaultYear, 18, 1, 2) - fileLayout := NewPerHourFileLayout(currentTime) + fileLayout := NewPerHourFileLayout(currentTime, volume_consts.LogsStorageDirpath) hourZeroFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(defaultYear, 17, 0, 21).Now(), testEnclaveUuid, testUserService1Uuid) hourOneFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(defaultYear, 17, 0, 22).Now(), testEnclaveUuid, testUserService1Uuid) @@ -145,7 +146,7 @@ func TestGetLogFilePathsWithHourlyRetentionAcrossYears(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() currentTime := logs_clock.NewMockLogsClockPerHour(2024, 1, 1, 2) - fileLayout := NewPerHourFileLayout(currentTime) + fileLayout := NewPerHourFileLayout(currentTime, volume_consts.LogsStorageDirpath) hourZeroFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(2023, 52, 0, 21).Now(), testEnclaveUuid, testUserService1Uuid) hourOneFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(2023, 52, 0, 22).Now(), testEnclaveUuid, testUserService1Uuid) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go index 47684d9e76..5e5126db5e 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go @@ -24,23 +24,24 @@ const ( ) type PerWeekFileLayout struct { - time logs_clock.LogsClock + time logs_clock.LogsClock + baseLogsFilePath string } -func NewPerWeekFileLayout(time logs_clock.LogsClock) *PerWeekFileLayout { - return &PerWeekFileLayout{time: time} +func NewPerWeekFileLayout(time logs_clock.LogsClock, baseLogsFilePath string) *PerWeekFileLayout { + return &PerWeekFileLayout{time: time, baseLogsFilePath: baseLogsFilePath} } func (pwf *PerWeekFileLayout) GetLogFileLayoutFormat() string { // Right now this format is specifically made for Vector Logs Aggregators format // This wil be used my Vector LogsAggregator to determine the path to output to // is there a way to get rid of the /var/log/kurtosis? - return fmt.Sprintf("%s%%Y/%%V/{{ enclave_uuid }}/{{ service_uuid }}.json", volume_consts.LogsStorageDirpath) + return fmt.Sprintf("%s%%Y/%%V/{{ enclave_uuid }}/{{ service_uuid }}.json", pwf.baseLogsFilePath) } func (pwf *PerWeekFileLayout) GetLogFilePath(time time.Time, enclaveUuid, serviceUuid string) string { year, week := time.ISOWeek() - return getWeeklyFilePath(year, week, enclaveUuid, serviceUuid) + return pwf.getWeeklyFilePath(year, week, enclaveUuid, serviceUuid) } func (pwf *PerWeekFileLayout) GetLogFilePaths( @@ -68,7 +69,7 @@ func (pwf *PerWeekFileLayout) getLogFilePathsFromNowTillRetentionPeriod(fs volum firstWeekWithLogs := 0 for i := 0; i < retentionPeriodInWeeks; i++ { year, week := currentTime.Add(time.Duration(-i) * oneWeekDuration).ISOWeek() - filePathStr := getWeeklyFilePath(year, week, enclaveUuid, serviceUuid) + filePathStr := pwf.getWeeklyFilePath(year, week, enclaveUuid, serviceUuid) if _, err := fs.Stat(filePathStr); err == nil { paths = append(paths, filePathStr) firstWeekWithLogs = i @@ -84,7 +85,7 @@ func (pwf *PerWeekFileLayout) getLogFilePathsFromNowTillRetentionPeriod(fs volum // scan for remaining files as far back as they exist before the retention period for i := firstWeekWithLogs + 1; i < retentionPeriodInWeeks; i++ { year, week := currentTime.Add(time.Duration(-i) * oneWeekDuration).ISOWeek() - filePathStr := getWeeklyFilePath(year, week, enclaveUuid, serviceUuid) + filePathStr := pwf.getWeeklyFilePath(year, week, enclaveUuid, serviceUuid) if _, err := fs.Stat(filePathStr); err != nil { break } @@ -105,7 +106,7 @@ func (pwf *PerWeekFileLayout) getLogFilePathsBeyondRetentionPeriod(fs volume_fil for i := 0; i < retentionPeriodIntervals; i++ { numWeeksToGoBack := retentionPeriodInWeeks + i year, weekToRemove := currentTime.Add(time.Duration(-numWeeksToGoBack) * oneWeekDuration).ISOWeek() - filePathStr := getWeeklyFilePath(year, weekToRemove, enclaveUuid, serviceUuid) + filePathStr := pwf.getWeeklyFilePath(year, weekToRemove, enclaveUuid, serviceUuid) if _, err := fs.Stat(filePathStr); err != nil { continue } @@ -119,7 +120,7 @@ func DurationToWeeks(d time.Duration) int { return int(math.Round(d.Hours() / float64(oneWeekInHours))) } -func getWeeklyFilePath(year, week int, enclaveUuid, serviceUuid string) string { +func (pwf *PerWeekFileLayout) getWeeklyFilePath(year, week int, enclaveUuid, serviceUuid string) string { formattedWeekNum := fmt.Sprintf("%02d", week) - return fmt.Sprintf(PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(year), formattedWeekNum, enclaveUuid, serviceUuid, volume_consts.Filetype) + return fmt.Sprintf(PerWeekFilePathFmtStr, pwf.baseLogsFilePath, strconv.Itoa(year), formattedWeekNum, enclaveUuid, serviceUuid, volume_consts.Filetype) } diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go index 86eb46e62f..312884f2f9 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout_test.go @@ -2,6 +2,7 @@ package file_layout import ( "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" "github.com/stretchr/testify/require" "testing" @@ -23,7 +24,7 @@ func TestGetLogFilePaths(t *testing.T) { currentWeek := 17 currentTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) - fileLayout := NewPerWeekFileLayout(currentTime) + fileLayout := NewPerWeekFileLayout(currentTime, volume_consts.LogsStorageDirpath) week12filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear, 12, 0).Now(), testEnclaveUuid, testUserService1Uuid) week13filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear, 13, 0).Now(), testEnclaveUuid, testUserService1Uuid) @@ -62,7 +63,7 @@ func TestGetLogFilePathsAcrossNewYear(t *testing.T) { currentWeek := 2 currentTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) - fileLayout := NewPerWeekFileLayout(currentTime) + fileLayout := NewPerWeekFileLayout(currentTime, volume_consts.LogsStorageDirpath) // ../week/enclave uuid/service uuid.json week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear-1, 50, 0).Now(), testEnclaveUuid, testUserService1Uuid) @@ -100,7 +101,7 @@ func TestGetLogFilePathsAcrossNewYearWith53Weeks(t *testing.T) { currentWeek := 3 currentTime := logs_clock.NewMockLogsClockPerDay(2016, currentWeek, 1) - fileLayout := NewPerWeekFileLayout(currentTime) + fileLayout := NewPerWeekFileLayout(currentTime, volume_consts.LogsStorageDirpath) // According to ISOWeek, 2015 has 53 weeks week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2015, 51, 3).Now(), testEnclaveUuid, testUserService1Uuid) @@ -138,7 +139,7 @@ func TestGetLogFilePathsWithDiffRetentionPeriod(t *testing.T) { currentWeek := 2 mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) - fileLayout := NewPerWeekFileLayout(mockTime) + fileLayout := NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath) // ../week/enclave uuid/service uuid.json week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear-1, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) @@ -169,7 +170,7 @@ func TestGetLogFilePathsReturnsAllAvailableWeeks(t *testing.T) { currentWeek := 2 currentTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) - fileLayout := NewPerWeekFileLayout(currentTime) + fileLayout := NewPerWeekFileLayout(currentTime, volume_consts.LogsStorageDirpath) // ../week/enclave uuid/service uuid.json week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear-1, 52, 0).Now(), testEnclaveUuid, testUserService1Uuid) @@ -201,7 +202,7 @@ func TestGetLogFilePathsReturnsCorrectPathsIfWeeksMissingInBetween(t *testing.T) currentWeek := 3 currentTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) - fileLayout := NewPerWeekFileLayout(currentTime) + fileLayout := NewPerWeekFileLayout(currentTime, volume_consts.LogsStorageDirpath) // ../week/enclave uuid/service uuid.json week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) @@ -224,7 +225,7 @@ func TestGetLogFilePathsReturnsCorrectPathsIfCurrentWeekHasNoLogsYet(t *testing. currentWeek := 3 currentTime := logs_clock.NewMockLogsClockPerDay(defaultYear, currentWeek, defaultDay) - fileLayout := NewPerWeekFileLayout(currentTime) + fileLayout := NewPerWeekFileLayout(currentTime, volume_consts.LogsStorageDirpath) // ../week/enclave uuid/service uuid.json week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) @@ -254,7 +255,7 @@ func TestGetLogFilePathsOneIntervalBeyondRetentionPeriod(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() mockTime := logs_clock.NewMockLogsClockPerDay(2023, 2, defaultDay) - fileLayout := NewPerWeekFileLayout(mockTime) + fileLayout := NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath) week49filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 49, 0).Now(), testEnclaveUuid, testUserService1Uuid) week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 50, 0).Now(), testEnclaveUuid, testUserService1Uuid) @@ -281,7 +282,7 @@ func TestGetLogFilePathsTwoIntervalBeyondRetentionPeriod(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() mockTime := logs_clock.NewMockLogsClockPerDay(2023, 2, defaultDay) - fileLayout := NewPerWeekFileLayout(mockTime) + fileLayout := NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath) week48filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 48, 0).Now(), testEnclaveUuid, testUserService1Uuid) week49filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 49, 0).Now(), testEnclaveUuid, testUserService1Uuid) @@ -319,7 +320,7 @@ func TestGetLogFilePathsWithNoPathsBeyondRetentionPeriod(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() mockTime := logs_clock.NewMockLogsClockPerDay(2023, 2, defaultDay) - fileLayout := NewPerWeekFileLayout(mockTime) + fileLayout := NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath) week50filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 50, 0).Now(), testEnclaveUuid, testUserService1Uuid) week51filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 51, 0).Now(), testEnclaveUuid, testUserService1Uuid) @@ -344,7 +345,7 @@ func TestGetLogFilePathsWithMissingPathBetweenIntervals(t *testing.T) { filesystem := volume_filesystem.NewMockedVolumeFilesystem() mockTime := logs_clock.NewMockLogsClockPerDay(2023, 2, defaultDay) - fileLayout := NewPerWeekFileLayout(mockTime) + fileLayout := NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath) week47filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 48, 0).Now(), testEnclaveUuid, testUserService1Uuid) week49filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 49, 0).Now(), testEnclaveUuid, testUserService1Uuid) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go index 1286933179..2e309ac310 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go @@ -30,7 +30,7 @@ const ( func TestRemoveLogsBeyondRetentionPeriod(t *testing.T) { ctx := context.Background() mockTime := logs_clock.NewMockLogsClockPerDay(2023, 2, defaultDay) - fileLayout := file_layout.NewPerWeekFileLayout(mockTime) + fileLayout := file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath) mockKurtosisBackend := getMockedKurtosisBackendWithEnclavesAndServices(ctx, t, mockTime) @@ -61,7 +61,7 @@ func TestRemoveLogsBeyondRetentionPeriod(t *testing.T) { func TestRemoveEnclaveLogs(t *testing.T) { mockKurtosisBackend := backend_interface.NewMockKurtosisBackend(t) mockTime := logs_clock.NewMockLogsClockPerDay(2022, 52, defaultDay) - fileLayout := file_layout.NewPerWeekFileLayout(mockTime) + fileLayout := file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath) // setup filesystem mockFs := volume_filesystem.NewMockedVolumeFilesystem() @@ -100,7 +100,7 @@ func TestRemoveEnclaveLogs(t *testing.T) { func TestRemoveAllLogs(t *testing.T) { mockKurtosisBackend := backend_interface.NewMockKurtosisBackend(t) mockTime := logs_clock.NewMockLogsClockPerDay(2022, 52, defaultDay) - fileLayout := file_layout.NewPerWeekFileLayout(mockTime) + fileLayout := file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath) // setup filesystem mockFs := volume_filesystem.NewMockedVolumeFilesystem() @@ -140,7 +140,7 @@ func TestRemoveAllLogs(t *testing.T) { func TestCreateLogFiles(t *testing.T) { mockTime := logs_clock.NewMockLogsClockPerDay(2022, 52, defaultDay) mockFs := volume_filesystem.NewMockedVolumeFilesystem() - fileLayout := file_layout.NewPerWeekFileLayout(mockTime) + fileLayout := file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath) // setup kurtosis backend ctx := context.Background() diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go index 3980bf0c52..dbd4a983e2 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go @@ -132,7 +132,7 @@ func TestStreamUserServiceLogsPerWeek_WithFilters(t *testing.T) { underlyingFs := createFilledPerWeekFilesystem(startingWeek) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime)) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -215,7 +215,7 @@ func TestStreamUserServiceLogsPerWeek_NoLogsFromPersistentVolume(t *testing.T) { underlyingFs := createEmptyPerWeekFilesystem(startingWeek) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime)) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -320,7 +320,7 @@ func TestStreamUserServiceLogsPerWeek_ThousandsOfLogLinesSuccessfulExecution(t * require.NoError(t, err) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime)) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -407,7 +407,7 @@ func TestStreamUserServiceLogsPerWeek_EmptyLogLines(t *testing.T) { require.NoError(t, err) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime)) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -474,7 +474,7 @@ func TestStreamUserServiceLogsPerWeek_WithLogsAcrossWeeks(t *testing.T) { require.NoError(t, err) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, 4, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime)) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -543,7 +543,7 @@ func TestStreamUserServiceLogsPerWeek_WithLogLineAcrossWeeks(t *testing.T) { require.NoError(t, err) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, 4, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime)) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -594,7 +594,7 @@ func TestStreamUserServiceLogsPerWeekReturnsTimestampedLogLines(t *testing.T) { require.NoError(t, err) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime)) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) expectedTime, err := time.Parse(utcFormat, defaultUTCTimestampStr) require.NoError(t, err) @@ -698,7 +698,7 @@ func executeStreamCallAndGetReceivedServiceLogLines( // no log file management is done in these tests so values for logFileManager aren't important mockTime := logs_clock.NewMockLogsClockPerDay(0, 0, 0) - fileLayout := file_layout.NewPerWeekFileLayout(mockTime) + fileLayout := file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath) logFileManager := log_file_manager.NewLogFileManager(kurtosisBackend, underlyingFs, fileLayout, mockTime, time.Duration(0), volume_consts.LogsStorageDirpath) logsDatabaseClient := NewPersistentVolumeLogsDatabaseClient(kurtosisBackend, underlyingFs, logFileManager, streamStrategy) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/stream_logs_strategy_impl_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/stream_logs_strategy_impl_test.go index 2183d7a822..26c490b2a6 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/stream_logs_strategy_impl_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/stream_logs_strategy_impl_test.go @@ -25,7 +25,7 @@ func TestIsWithinRetentionPeriod(t *testing.T) { // week 41 would put the log line outside the retention period mockTime := logs_clock.NewMockLogsClockPerDay(2023, 41, 0) - strategy := NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime)) + strategy := NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) timestamp, err := parseTimestampFromJsonLogLine(jsonLogLine) require.NoError(t, err) diff --git a/engine/server/engine/main.go b/engine/server/engine/main.go index ece30c1872..1dde7ae734 100644 --- a/engine/server/engine/main.go +++ b/engine/server/engine/main.go @@ -418,7 +418,7 @@ func getLogsDatabaseClient(kurtosisBackendType args.KurtosisBackendType, kurtosi } logrus.Infof("Setting log retention period to '%v' week(s).", logRetentionPeriodInWeeks) osFs := volume_filesystem.NewOsVolumeFilesystem() - perHourFileLayout := file_layout.NewPerHourFileLayout(realTime) + perHourFileLayout := file_layout.NewPerHourFileLayout(realTime, volume_consts.LogsStorageDirpath) logFileManager := log_file_manager.NewLogFileManager(kurtosisBackend, osFs, perHourFileLayout, realTime, logRetentionPeriod, volume_consts.LogsStorageDirpath) streamLogsStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(realTime, logRetentionPeriod, perHourFileLayout) logsDatabaseClient = persistent_volume.NewPersistentVolumeLogsDatabaseClient(kurtosisBackend, osFs, logFileManager, streamLogsStrategy) From 0c4d4ea2eeb9a611cc74dc70825cf272d2418a4a Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Fri, 18 Oct 2024 13:18:25 +0900 Subject: [PATCH 68/78] unformat day --- .../persistent_volume/file_layout/per_hour_file_layout.go | 3 +-- .../persistent_volume/file_layout/per_hour_file_layout_test.go | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go index 292f140da4..fafc063967 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go @@ -126,9 +126,8 @@ func (phf *PerHourFileLayout) getLogFilePathsBeyondRetentionPeriod(fs volume_fil func (phf *PerHourFileLayout) getHourlyLogFilePath(year, week, day, hour int, enclaveUuid, serviceUuid string) string { // these match the format in which Vector outputs week, hours, days formattedWeekNum := fmt.Sprintf("%02d", week) - formattedDayNum := fmt.Sprintf("%02d", day) formattedHourNum := fmt.Sprintf("%02d", hour) - return fmt.Sprintf(perHourFilePathFmtSt, phf.baseLogsFilePath, strconv.Itoa(year), formattedWeekNum, formattedDayNum, formattedHourNum, enclaveUuid, serviceUuid, volume_consts.Filetype) + return fmt.Sprintf(perHourFilePathFmtSt, phf.baseLogsFilePath, strconv.Itoa(year), formattedWeekNum, strconv.Itoa(day), formattedHourNum, enclaveUuid, serviceUuid, volume_consts.Filetype) } func TimeToWeekDayHour(time time.Time) (int, int, int, int) { diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go index 43a5da0cc8..f3e8c0169d 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go @@ -13,7 +13,7 @@ func TestGetLogFilePath(t *testing.T) { currentTime := logs_clock.NewMockLogsClockPerHour(2024, 1, 1, 1) fileLayout := NewPerHourFileLayout(currentTime, volume_consts.LogsStorageDirpath) - expectedFilepath := "/var/log/kurtosis/2024/01/01/01/test-enclave/test-user-service-1.json" + expectedFilepath := "/var/log/kurtosis/2024/01/1/01/test-enclave/test-user-service-1.json" now := currentTime.Now() actualFilePath := fileLayout.GetLogFilePath(now, testEnclaveUuid, testUserService1Uuid) require.Equal(t, expectedFilepath, actualFilePath) From e724d908456e4373322afd0dc10a9f7c5a4281a2 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Fri, 18 Oct 2024 16:55:40 +0900 Subject: [PATCH 69/78] convert sunday from golang time to vector time --- .../file_layout/per_hour_file_layout.go | 12 +++++++----- .../file_layout/per_hour_file_layout_test.go | 9 +++++++-- .../file_layout/per_week_file_layout.go | 8 ++++---- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go index fafc063967..ec7d352cf9 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go @@ -43,10 +43,8 @@ func (phf *PerHourFileLayout) GetLogFileLayoutFormat() string { } func (phf *PerHourFileLayout) GetLogFilePath(time time.Time, enclaveUuid, serviceUuid string) string { - year, week := time.ISOWeek() - day := time.Weekday() - hour := time.Hour() - return phf.getHourlyLogFilePath(year, week, int(day), hour, enclaveUuid, serviceUuid) + year, week, day, hour := TimeToWeekDayHour(time) + return phf.getHourlyLogFilePath(year, week, day, hour, enclaveUuid, serviceUuid) } func (phf *PerHourFileLayout) GetLogFilePaths( @@ -124,7 +122,7 @@ func (phf *PerHourFileLayout) getLogFilePathsBeyondRetentionPeriod(fs volume_fil } func (phf *PerHourFileLayout) getHourlyLogFilePath(year, week, day, hour int, enclaveUuid, serviceUuid string) string { - // these match the format in which Vector outputs week, hours, days + // match the format in which Vector outputs week, hours, days formattedWeekNum := fmt.Sprintf("%02d", week) formattedHourNum := fmt.Sprintf("%02d", hour) return fmt.Sprintf(perHourFilePathFmtSt, phf.baseLogsFilePath, strconv.Itoa(year), formattedWeekNum, strconv.Itoa(day), formattedHourNum, enclaveUuid, serviceUuid, volume_consts.Filetype) @@ -134,6 +132,10 @@ func TimeToWeekDayHour(time time.Time) (int, int, int, int) { year, week := time.ISOWeek() hour := time.Hour() day := int(time.Weekday()) + // convert sunday in golang's time(0) to sunday (0) in strftime/Vector log aggregator time(7) + if day == 0 { + day = 7 + } return year, week, day, hour } diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go index f3e8c0169d..b96775633b 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go @@ -184,11 +184,16 @@ func TestGetLogFilePathsWithHourlyRetentionAcrossYears(t *testing.T) { } -func TestGetLogFilePathsWithHourlyRetentionWithinSameDay(t *testing.T) { +func TestSundayIsConvertedFromStrftimeToGolangTime(t *testing.T) { + expectedFilepath := "/var/log/kurtosis/2024/02/7/05/test-enclave/test-user-service-1.json" + mockTime := logs_clock.NewMockLogsClockPerHour(2024, 2, 0, 5) + fileLayout := NewPerHourFileLayout(mockTime, volume_consts.LogsStorageDirpath) + + actualFilePath := fileLayout.GetLogFilePath(mockTime.Now(), testEnclaveUuid, testUserService1Uuid) + require.Equal(t, expectedFilepath, actualFilePath) } -// //func TestGetLogFilePathsWithHourlyRetentionReturnsCorrectPathsIfHoursMissingInBetween(t *testing.T) { // filesystem := volume_filesystem.NewMockedVolumeFilesystem() // diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go index 5e5126db5e..d54e8f1fd2 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go @@ -116,11 +116,11 @@ func (pwf *PerWeekFileLayout) getLogFilePathsBeyondRetentionPeriod(fs volume_fil return paths } -func DurationToWeeks(d time.Duration) int { - return int(math.Round(d.Hours() / float64(oneWeekInHours))) -} - func (pwf *PerWeekFileLayout) getWeeklyFilePath(year, week int, enclaveUuid, serviceUuid string) string { formattedWeekNum := fmt.Sprintf("%02d", week) return fmt.Sprintf(PerWeekFilePathFmtStr, pwf.baseLogsFilePath, strconv.Itoa(year), formattedWeekNum, enclaveUuid, serviceUuid, volume_consts.Filetype) } + +func DurationToWeeks(d time.Duration) int { + return int(math.Round(d.Hours() / float64(oneWeekInHours))) +} From 1d6ff1e42c25a5461eb78f4a1a627badedb42507 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Fri, 18 Oct 2024 17:30:17 +0900 Subject: [PATCH 70/78] add check to ensure formats are equivalent --- .../implementations/vector/consts.go | 2 +- .../implementations/vector/vector_config.go | 2 +- .../file_layout/per_hour_file_layout_test.go | 47 ++++++++++--------- .../log_file_manager/log_file_manager.go | 4 ++ engine/server/engine/main.go | 14 ++++-- 5 files changed, 43 insertions(+), 26 deletions(-) diff --git a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector/consts.go b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector/consts.go index 8d9d8cad4e..8e22a16d33 100644 --- a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector/consts.go +++ b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector/consts.go @@ -25,7 +25,7 @@ const ( // https://vector.dev/docs/reference/configuration/template-syntax/ baseLogsFilepath = "\"" + logsStorageDirpath + "%%Y/%%V/%%u/%%H/" - uuidLogsFilepath = baseLogsFilepath + "{{ enclave_uuid }}/{{ service_uuid }}.json\"" + VectorLogsFilepathFormat = baseLogsFilepath + "{{ enclave_uuid }}/{{ service_uuid }}.json\"" sourceConfigFileTemplateName = "srcVectorConfigFileTemplate" sinkConfigFileTemplateName = "sinkVectorConfigFileTemplate" diff --git a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector/vector_config.go b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector/vector_config.go index a6022b5b85..f16b0f3955 100644 --- a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector/vector_config.go +++ b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector/vector_config.go @@ -38,7 +38,7 @@ func newDefaultVectorConfig(listeningPortNumber uint16) *VectorConfig { Id: "uuid_" + fileSinkIdSuffix, Type: fileTypeId, Inputs: []string{fluentBitSourceId}, - Filepath: uuidLogsFilepath, + Filepath: VectorLogsFilepathFormat, }, }, } diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go index b96775633b..dc6f4a6af2 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go @@ -194,27 +194,32 @@ func TestSundayIsConvertedFromStrftimeToGolangTime(t *testing.T) { require.Equal(t, expectedFilepath, actualFilePath) } -//func TestGetLogFilePathsWithHourlyRetentionReturnsCorrectPathsIfHoursMissingInBetween(t *testing.T) { -// filesystem := volume_filesystem.NewMockedVolumeFilesystem() -// -// currentTime := logs_clock.NewMockLogsClockPerHour(defaultYear, defaultWeek, defaultDay, 1) -// fileLayout := NewPerWeekFileLayout(currentTime) -// -// // ../week/enclave uuid/service uuid.json -// week52filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear, 0, 0).Now(), testEnclaveUuid, testUserService1Uuid) -// week1filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear, 1, 0).Now(), testEnclaveUuid, testUserService1Uuid) -// week3filepath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(defaultYear, 3, 0).Now(), testEnclaveUuid, testUserService1Uuid) -// -// _, _ = filesystem.Create(week52filepath) -// _, _ = filesystem.Create(week1filepath) -// _, _ = filesystem.Create(week3filepath) -// retentionPeriod := retentionPeriodInWeeksForTesting * oneWeekDuration -// logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) -// -// require.NoError(t, err) -// require.Len(t, logFilePaths, 1) -// require.Equal(t, week3filepath, logFilePaths[0]) // should only return week 3 because week 2 is missing -//} +func TestGetLogFilePathsWithHourlyRetentionReturnsCorrectPathsIfHoursMissingInBetween(t *testing.T) { + filesystem := volume_filesystem.NewMockedVolumeFilesystem() + + currentTime := logs_clock.NewMockLogsClockPerHour(2024, 1, 1, 2) + fileLayout := NewPerHourFileLayout(currentTime, volume_consts.LogsStorageDirpath) + + hourZeroFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(2023, 52, 0, 21).Now(), testEnclaveUuid, testUserService1Uuid) + hourOneFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(2023, 52, 0, 22).Now(), testEnclaveUuid, testUserService1Uuid) + hourTwoFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(2023, 52, 0, 23).Now(), testEnclaveUuid, testUserService1Uuid) + hourThreeFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(2023, 1, 1, 3).Now(), testEnclaveUuid, testUserService1Uuid) + hourFiveFp := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerHour(2024, 1, 1, 2).Now(), testEnclaveUuid, testUserService1Uuid) + + createFilepaths(t, filesystem, []string{ + hourZeroFp, + hourOneFp, + hourTwoFp, + hourThreeFp, + hourFiveFp, + }) + + retentionPeriod := 6 * time.Hour // this would return all filepaths, but hour three is missing + logFilePaths, err := fileLayout.GetLogFilePaths(filesystem, retentionPeriod, -1, testEnclaveUuid, testUserService1Uuid) + require.NoError(t, err) + require.Len(t, logFilePaths, 1) + require.Equal(t, hourFiveFp, logFilePaths[0]) // should only return hour 5 3 because hour 4 is missing +} func createFilepaths(t *testing.T, filesystem volume_filesystem.VolumeFilesystem, filepaths []string) { for _, path := range filepaths { diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go index 3a17098fea..248e5038d5 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go @@ -208,6 +208,10 @@ func (manager *LogFileManager) RemoveEnclaveLogs(enclaveUuid string) error { return nil } +func (manager *LogFileManager) GetLogFileLayoutFormat() string { + return manager.fileLayout.GetLogFileLayoutFormat() +} + func (manager *LogFileManager) getEnclaveAndServiceInfo(ctx context.Context) (map[enclave.EnclaveUUID][]*service.ServiceRegistration, error) { enclaveToServicesMap := map[enclave.EnclaveUUID][]*service.ServiceRegistration{} diff --git a/engine/server/engine/main.go b/engine/server/engine/main.go index 1dde7ae734..58d82071ad 100644 --- a/engine/server/engine/main.go +++ b/engine/server/engine/main.go @@ -8,6 +8,7 @@ package main import ( "context" "fmt" + vector_consts "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts" "io/fs" @@ -181,7 +182,11 @@ func runMain() error { if err != nil { return stacktrace.Propagate(err, "An error occurred parsing a duration from provided log retention period string: %v", serverArgs.LogRetentionPeriod) } - logsDatabaseClient := getLogsDatabaseClient(serverArgs.KurtosisBackendType, kurtosisBackend, logRetentionPeriodDuration) + logsDatabaseClient, err := getLogsDatabaseClient(serverArgs.KurtosisBackendType, kurtosisBackend, logRetentionPeriodDuration) + if err != nil { + // already wrapped + return err + } logsDatabaseClient.StartLogFileManagement(ctx) enclaveManager, err := getEnclaveManager( @@ -406,7 +411,7 @@ func getKurtosisBackend(ctx context.Context, kurtosisBackendType args.KurtosisBa } // if cluster is docker, return logs client for centralized logging, otherwise use logs db of kurtosis backend which uses k8s logs under the hood -func getLogsDatabaseClient(kurtosisBackendType args.KurtosisBackendType, kurtosisBackend backend_interface.KurtosisBackend, logRetentionPeriod time.Duration) centralized_logs.LogsDatabaseClient { +func getLogsDatabaseClient(kurtosisBackendType args.KurtosisBackendType, kurtosisBackend backend_interface.KurtosisBackend, logRetentionPeriod time.Duration) (centralized_logs.LogsDatabaseClient, error) { var logsDatabaseClient centralized_logs.LogsDatabaseClient switch kurtosisBackendType { case args.KurtosisBackendType_Docker: @@ -420,12 +425,15 @@ func getLogsDatabaseClient(kurtosisBackendType args.KurtosisBackendType, kurtosi osFs := volume_filesystem.NewOsVolumeFilesystem() perHourFileLayout := file_layout.NewPerHourFileLayout(realTime, volume_consts.LogsStorageDirpath) logFileManager := log_file_manager.NewLogFileManager(kurtosisBackend, osFs, perHourFileLayout, realTime, logRetentionPeriod, volume_consts.LogsStorageDirpath) + if logFileManager.GetLogFileLayoutFormat() != vector_consts.VectorLogsFilepathFormat { + return nil, stacktrace.NewError("Log file format for this logs database client does not much format output by Vector logs aggregator. This is a Kurtosis bug.") + } streamLogsStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(realTime, logRetentionPeriod, perHourFileLayout) logsDatabaseClient = persistent_volume.NewPersistentVolumeLogsDatabaseClient(kurtosisBackend, osFs, logFileManager, streamLogsStrategy) case args.KurtosisBackendType_Kubernetes: logsDatabaseClient = kurtosis_backend.NewKurtosisBackendLogsDatabaseClient(kurtosisBackend) } - return logsDatabaseClient + return logsDatabaseClient, nil } func formatFilenameFunctionForLogs(filename string, functionName string) string { From 9102416841174be4846dddf4187f005f7871650b Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Fri, 18 Oct 2024 17:46:51 +0900 Subject: [PATCH 71/78] fix filepath formatting and check --- .../persistent_volume/file_layout/per_hour_file_layout.go | 5 +---- .../persistent_volume/file_layout/per_week_file_layout.go | 2 +- engine/server/engine/main.go | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go index ec7d352cf9..bae57a8398 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go @@ -36,10 +36,7 @@ func NewPerHourFileLayout(time logs_clock.LogsClock, baseLogsFilePath string) *P func (phf *PerHourFileLayout) GetLogFileLayoutFormat() string { // Right now this format is specifically made for Vector Logs Aggregators format // This wil be used my Vector LogsAggregator to determine the path to output to - // TODO: add a test that makes sure whats returned by the vector storage format always matches vector storage format - // TODO: there also needs to be a test to make sure the values produced by Y, V, U, and H are identical to whats produced by golangs - // time.ISOWeek(), time.WeekDay(), time.Hour() calculations - return fmt.Sprintf("%s%%Y/%%V/%%u/%%H/{{ enclave_uuid }}/{{ service_uuid }}.json", volume_consts.LogsStorageDirpath) + return fmt.Sprintf("\"%s%%%%Y/%%%%V/%%%%u/%%%%H/{{ enclave_uuid }}/{{ service_uuid }}.json\"", volume_consts.LogsStorageDirpath) } func (phf *PerHourFileLayout) GetLogFilePath(time time.Time, enclaveUuid, serviceUuid string) string { diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go index d54e8f1fd2..b03112ce70 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_week_file_layout.go @@ -36,7 +36,7 @@ func (pwf *PerWeekFileLayout) GetLogFileLayoutFormat() string { // Right now this format is specifically made for Vector Logs Aggregators format // This wil be used my Vector LogsAggregator to determine the path to output to // is there a way to get rid of the /var/log/kurtosis? - return fmt.Sprintf("%s%%Y/%%V/{{ enclave_uuid }}/{{ service_uuid }}.json", pwf.baseLogsFilePath) + return fmt.Sprintf("\"%s%%%%Y/%%%%V/{{ enclave_uuid }}/{{ service_uuid }}.json\"", pwf.baseLogsFilePath) } func (pwf *PerWeekFileLayout) GetLogFilePath(time time.Time, enclaveUuid, serviceUuid string) string { diff --git a/engine/server/engine/main.go b/engine/server/engine/main.go index 58d82071ad..6683d9d29a 100644 --- a/engine/server/engine/main.go +++ b/engine/server/engine/main.go @@ -426,7 +426,7 @@ func getLogsDatabaseClient(kurtosisBackendType args.KurtosisBackendType, kurtosi perHourFileLayout := file_layout.NewPerHourFileLayout(realTime, volume_consts.LogsStorageDirpath) logFileManager := log_file_manager.NewLogFileManager(kurtosisBackend, osFs, perHourFileLayout, realTime, logRetentionPeriod, volume_consts.LogsStorageDirpath) if logFileManager.GetLogFileLayoutFormat() != vector_consts.VectorLogsFilepathFormat { - return nil, stacktrace.NewError("Log file format for this logs database client does not much format output by Vector logs aggregator. This is a Kurtosis bug.") + return nil, stacktrace.NewError("Log file format for this logs database client '%v' does not much format output by Vector logs aggregator '%v'. This is a Kurtosis bug.", logFileManager.GetLogFileLayoutFormat(), vector_consts.VectorLogsFilepathFormat) } streamLogsStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(realTime, logRetentionPeriod, perHourFileLayout) logsDatabaseClient = persistent_volume.NewPersistentVolumeLogsDatabaseClient(kurtosisBackend, osFs, logFileManager, streamLogsStrategy) From b8ce98e6f4da975b3b9aa30c901aa20b17097fc1 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Mon, 21 Oct 2024 16:37:09 +0900 Subject: [PATCH 72/78] adjust log stmt --- engine/server/engine/main.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/engine/server/engine/main.go b/engine/server/engine/main.go index 6683d9d29a..2e30563804 100644 --- a/engine/server/engine/main.go +++ b/engine/server/engine/main.go @@ -12,7 +12,6 @@ import ( "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts" "io/fs" - "math" "net" "net/http" "os" @@ -417,11 +416,7 @@ func getLogsDatabaseClient(kurtosisBackendType args.KurtosisBackendType, kurtosi case args.KurtosisBackendType_Docker: realTime := logs_clock.NewRealClock() - logRetentionPeriodInWeeks := int(math.Ceil(logRetentionPeriod.Hours() / float64(numHoursInAWeek))) - if logRetentionPeriodInWeeks < 1 { - logRetentionPeriodInWeeks = 1 - } - logrus.Infof("Setting log retention period to '%v' week(s).", logRetentionPeriodInWeeks) + logrus.Infof("Setting log retention period to '%v' hours(s).", logRetentionPeriod.Hours()) osFs := volume_filesystem.NewOsVolumeFilesystem() perHourFileLayout := file_layout.NewPerHourFileLayout(realTime, volume_consts.LogsStorageDirpath) logFileManager := log_file_manager.NewLogFileManager(kurtosisBackend, osFs, perHourFileLayout, realTime, logRetentionPeriod, volume_consts.LogsStorageDirpath) From 304ade06a51bfeecb5796b7c0d0d9c1592ea4cc5 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Mon, 21 Oct 2024 16:56:22 +0900 Subject: [PATCH 73/78] pin besu img to pass tests --- .../startlark_user_passing_test/starlark_user_passing_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal_testsuites/golang/testsuite/startlark_user_passing_test/starlark_user_passing_test.go b/internal_testsuites/golang/testsuite/startlark_user_passing_test/starlark_user_passing_test.go index b41104f7e7..2611de036f 100644 --- a/internal_testsuites/golang/testsuite/startlark_user_passing_test/starlark_user_passing_test.go +++ b/internal_testsuites/golang/testsuite/startlark_user_passing_test/starlark_user_passing_test.go @@ -14,7 +14,7 @@ const ( userOverrideServiceName = "user-override" starlarkScriptWithUserIdPassed = ` -IMAGE = "hyperledger/besu:latest" +IMAGE = "hyperledger/besu:24.3" def run(plan, args): no_override = plan.add_service( name = "` + noOverrideServiceName + `", From 642e7f3a3267a03e92cf7afc7181cc418ec0f904 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Mon, 21 Oct 2024 18:31:20 +0900 Subject: [PATCH 74/78] refactor and test convert weeks to duration --- .../file_layout/per_hour_file_layout_test.go | 101 +++++++++++++++++- .../log_file_manager/log_file_manager.go | 10 +- .../log_file_manager/log_file_manager_test.go | 15 +-- .../persistent_volume_helpers.go | 8 ++ .../persistent_volume_helpers_test.go | 44 ++++++++ ...istent_volume_logs_database_client_test.go | 20 ++-- .../stream_logs_strategy_impl.go | 6 +- .../stream_logs_strategy_impl_test.go | 8 +- 8 files changed, 175 insertions(+), 37 deletions(-) create mode 100644 engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_helpers/persistent_volume_helpers.go create mode 100644 engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_helpers/persistent_volume_helpers_test.go diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go index dc6f4a6af2..7fcf1fa96a 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout_test.go @@ -221,13 +221,106 @@ func TestGetLogFilePathsWithHourlyRetentionReturnsCorrectPathsIfHoursMissingInBe require.Equal(t, hourFiveFp, logFilePaths[0]) // should only return hour 5 3 because hour 4 is missing } +func TestTimeToWeekDayHour(t *testing.T) { + tests := []struct { + name string + inputTime time.Time + expectedYear int + expectedWeek int + expectedDay int + expectedHour int + }{ + { + name: "Midweek Wednesday 14:00", + inputTime: time.Date(2023, 10, 18, 14, 0, 0, 0, time.UTC), + expectedYear: 2023, + expectedWeek: 42, + expectedDay: 3, + expectedHour: 14, + }, + { + name: "Sunday midnight", + inputTime: time.Date(2023, 10, 15, 0, 0, 0, 0, time.UTC), + expectedYear: 2023, + expectedWeek: 41, + expectedDay: 7, // Sunday should be converted to 7 + expectedHour: 0, + }, + { + name: "Monday 9:30", + inputTime: time.Date(2024, 1, 1, 9, 30, 0, 0, time.UTC), + expectedYear: 2024, + expectedWeek: 1, + expectedDay: 1, + expectedHour: 9, + }, + { + name: "Saturday afternoon", + inputTime: time.Date(2024, 10, 19, 15, 0, 0, 0, time.UTC), + expectedYear: 2024, + expectedWeek: 42, + expectedDay: 6, + expectedHour: 15, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + year, week, day, hour := TimeToWeekDayHour(tt.inputTime) + if year != tt.expectedYear || week != tt.expectedWeek || day != tt.expectedDay || hour != tt.expectedHour { + t.Errorf("TimeToWeekDayHour(%v) = (%d, %d, %d, %d); expected (%d, %d, %d, %d)", + tt.inputTime, year, week, day, hour, tt.expectedYear, tt.expectedWeek, tt.expectedDay, tt.expectedHour) + } + }) + } +} + +func TestDurationToHours(t *testing.T) { + tests := []struct { + name string + inputDuration time.Duration + expectedHours int + }{ + { + name: "Zero duration", + inputDuration: 0, + expectedHours: 0, + }, + { + name: "One hour duration", + inputDuration: time.Hour, + expectedHours: 1, + }, + { + name: "Fractional hour duration", + inputDuration: 90 * time.Minute, // 1.5 hours + expectedHours: 2, // should round up + }, + { + name: "More than one day", + inputDuration: 25 * time.Hour, + expectedHours: 25, + }, + { + name: "Negative duration", + inputDuration: -time.Hour, + expectedHours: -1, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := DurationToHours(tt.inputDuration) + if result != tt.expectedHours { + t.Errorf("DurationToHours(%v) = %d; expected %d", tt.inputDuration, result, tt.expectedHours) + } + }) + } +} + func createFilepaths(t *testing.T, filesystem volume_filesystem.VolumeFilesystem, filepaths []string) { for _, path := range filepaths { _, err := filesystem.Create(path) require.NoError(t, err) } } - -func TestDurationToHour(t *testing.T) { - -} diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go index 248e5038d5..38c71cdeb9 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go @@ -19,11 +19,13 @@ import ( ) const ( - removeLogsWaitHours = 6 * time.Hour + removeLogsWaitHours = 5 * time.Minute createLogsWaitMinutes = 1 * time.Minute emptyEnclaveUuid = "" + + retentionPeriodIntervals = 1 ) // LogFileManager is responsible for creating and removing log files from filesystem. @@ -144,21 +146,21 @@ func (manager *LogFileManager) RemoveLogsBeyondRetentionPeriod(ctx context.Conte serviceNameStr := string(serviceRegistration.GetName()) serviceShortUuidStr := uuid_generator.ShortenedUUIDString(serviceUuidStr) - oldServiceLogFilesByUuid, err := manager.fileLayout.GetLogFilePaths(manager.filesystem, manager.logRetentionPeriod, 1, string(enclaveUuid), serviceUuidStr) + oldServiceLogFilesByUuid, err := manager.fileLayout.GetLogFilePaths(manager.filesystem, manager.logRetentionPeriod, retentionPeriodIntervals, string(enclaveUuid), serviceUuidStr) if err != nil { logrus.Errorf("An error occurred getting log file paths for service '%v' in enclave '%v' logs beyond retention: %v", serviceUuidStr, enclaveUuid, err) } else { pathsToRemove = append(pathsToRemove, oldServiceLogFilesByUuid...) } - oldServiceLogFilesByName, err := manager.fileLayout.GetLogFilePaths(manager.filesystem, manager.logRetentionPeriod, 1, string(enclaveUuid), serviceNameStr) + oldServiceLogFilesByName, err := manager.fileLayout.GetLogFilePaths(manager.filesystem, manager.logRetentionPeriod, retentionPeriodIntervals, string(enclaveUuid), serviceNameStr) if err != nil { logrus.Errorf("An error occurred getting log file paths for service '%v' in enclave '%v' logs beyond retention: %v", serviceNameStr, enclaveUuid, err) } else { pathsToRemove = append(pathsToRemove, oldServiceLogFilesByName...) } - oldServiceLogFilesByShortUuid, err := manager.fileLayout.GetLogFilePaths(manager.filesystem, manager.logRetentionPeriod, 1, string(enclaveUuid), serviceShortUuidStr) + oldServiceLogFilesByShortUuid, err := manager.fileLayout.GetLogFilePaths(manager.filesystem, manager.logRetentionPeriod, retentionPeriodIntervals, string(enclaveUuid), serviceShortUuidStr) if err != nil { logrus.Errorf("An error occurred getting log file paths for service '%v' in enclave '%v' logs beyond retention: %v", serviceShortUuidStr, enclaveUuid, err) } else { diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go index 2e309ac310..355fe09874 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager_test.go @@ -10,13 +10,13 @@ import ( "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/uuid_generator" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_helpers" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" "github.com/stretchr/testify/require" "net" "os" "testing" - "time" ) const ( @@ -50,7 +50,7 @@ func TestRemoveLogsBeyondRetentionPeriod(t *testing.T) { _, _ = mockFs.Create(week1filepath) _, _ = mockFs.Create(week2filepath) - logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, convertWeeksToDuration(5), volume_consts.LogsStorageDirpath) + logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, persistent_volume_helpers.ConvertWeeksToDuration(5), volume_consts.LogsStorageDirpath) logFileManager.RemoveLogsBeyondRetentionPeriod(ctx) // should remove week 49 logs _, err := mockFs.Stat(week49filepath) @@ -76,7 +76,7 @@ func TestRemoveEnclaveLogs(t *testing.T) { _, _ = mockFs.Create(week52filepath) _, _ = mockFs.Create(week52filepathDiffService) - logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, convertWeeksToDuration(5), volume_consts.LogsStorageDirpath) + logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, persistent_volume_helpers.ConvertWeeksToDuration(5), volume_consts.LogsStorageDirpath) err := logFileManager.RemoveEnclaveLogs(testEnclaveUuid) // should remove only all log files for enclave one require.NoError(t, err) @@ -115,7 +115,7 @@ func TestRemoveAllLogs(t *testing.T) { _, _ = mockFs.Create(week52filepath) _, _ = mockFs.Create(week52filepathDiffService) - logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, convertWeeksToDuration(5), volume_consts.LogsStorageDirpath) + logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, persistent_volume_helpers.ConvertWeeksToDuration(5), volume_consts.LogsStorageDirpath) err := logFileManager.RemoveAllLogs() require.NoError(t, err) @@ -150,7 +150,7 @@ func TestCreateLogFiles(t *testing.T) { expectedServiceNameFilePath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 52, 0).Now(), testEnclaveUuid, testUserService1Name) expectedServiceShortUuidFilePath := fileLayout.GetLogFilePath(logs_clock.NewMockLogsClockPerDay(2022, 52, 0).Now(), testEnclaveUuid, uuid_generator.ShortenedUUIDString(testUserService1Uuid)) - logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, convertWeeksToDuration(5), volume_consts.LogsStorageDirpath) + logFileManager := NewLogFileManager(mockKurtosisBackend, mockFs, fileLayout, mockTime, persistent_volume_helpers.ConvertWeeksToDuration(5), volume_consts.LogsStorageDirpath) err := logFileManager.CreateLogFiles(ctx) require.NoError(t, err) @@ -192,8 +192,3 @@ func getMockedKurtosisBackendWithEnclavesAndServices(ctx context.Context, t *tes Return(servicesMap, nil) return mockKurtosisBackend } - -func convertWeeksToDuration(retentionPeriodInWeeks int) time.Duration { - const hoursInWeek = 7 * 24 // 7 days * 24 hours - return time.Duration(retentionPeriodInWeeks*hoursInWeek) * time.Hour -} diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_helpers/persistent_volume_helpers.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_helpers/persistent_volume_helpers.go new file mode 100644 index 0000000000..ca20762862 --- /dev/null +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_helpers/persistent_volume_helpers.go @@ -0,0 +1,8 @@ +package persistent_volume_helpers + +import "time" + +func ConvertWeeksToDuration(weeks int) time.Duration { + hoursInWeek := 7 * 24 + return time.Duration(weeks*hoursInWeek) * time.Hour +} diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_helpers/persistent_volume_helpers_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_helpers/persistent_volume_helpers_test.go new file mode 100644 index 0000000000..dde63db192 --- /dev/null +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_helpers/persistent_volume_helpers_test.go @@ -0,0 +1,44 @@ +package persistent_volume_helpers + +import ( + "testing" + "time" +) + +func TestConvertWeeksToDuration(t *testing.T) { + tests := []struct { + name string + weeks int + expected time.Duration + }{ + { + name: "Zero weeks", + weeks: 0, + expected: 0, + }, + { + name: "One week", + weeks: 1, + expected: 7 * 24 * time.Hour, + }, + { + name: "Two weeks", + weeks: 2, + expected: 2 * 7 * 24 * time.Hour, + }, + { + name: "Negative weeks", + weeks: -1, + expected: -7 * 24 * time.Hour, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := ConvertWeeksToDuration(tt.weeks) + if result != tt.expected { + t.Errorf("ConvertWeeksToDuration(%d) = %v; want %v", tt.weeks, result, tt.expected) + } + }) + } +} diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go index dbd4a983e2..6661060ca0 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go @@ -9,6 +9,7 @@ import ( "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_helpers" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" @@ -132,7 +133,7 @@ func TestStreamUserServiceLogsPerWeek_WithFilters(t *testing.T) { underlyingFs := createFilledPerWeekFilesystem(startingWeek) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -215,7 +216,7 @@ func TestStreamUserServiceLogsPerWeek_NoLogsFromPersistentVolume(t *testing.T) { underlyingFs := createEmptyPerWeekFilesystem(startingWeek) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -320,7 +321,7 @@ func TestStreamUserServiceLogsPerWeek_ThousandsOfLogLinesSuccessfulExecution(t * require.NoError(t, err) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -407,7 +408,7 @@ func TestStreamUserServiceLogsPerWeek_EmptyLogLines(t *testing.T) { require.NoError(t, err) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -474,7 +475,7 @@ func TestStreamUserServiceLogsPerWeek_WithLogsAcrossWeeks(t *testing.T) { require.NoError(t, err) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, 4, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -543,7 +544,7 @@ func TestStreamUserServiceLogsPerWeek_WithLogLineAcrossWeeks(t *testing.T) { require.NoError(t, err) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, 4, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -594,7 +595,7 @@ func TestStreamUserServiceLogsPerWeekReturnsTimestampedLogLines(t *testing.T) { require.NoError(t, err) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) expectedTime, err := time.Parse(utcFormat, defaultUTCTimestampStr) require.NoError(t, err) @@ -831,8 +832,3 @@ func createEmptyPerWeekFilesystem(week int) volume_filesystem.VolumeFilesystem { return mapFs } - -func convertWeeksToDuration(retentionPeriodInWeeks int) time.Duration { - const hoursInWeek = 7 * 24 // 7 days * 24 hours - return time.Duration(retentionPeriodInWeeks*hoursInWeek) * time.Hour -} diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/stream_logs_strategy_impl.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/stream_logs_strategy_impl.go index 3117a06931..70351b6318 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/stream_logs_strategy_impl.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/stream_logs_strategy_impl.go @@ -21,6 +21,10 @@ import ( "github.com/sirupsen/logrus" ) +const ( + nowToRetentionPeriod = -1 +) + // StreamLogsStrategyImpl pulls logs from filesystem where there is a log file per year, per week, per enclave, per service // Weeks are denoted 01-52 // e.g. @@ -52,7 +56,7 @@ func (strategy *StreamLogsStrategyImpl) StreamLogs( shouldReturnAllLogs bool, numLogLines uint32, ) { - paths, err := strategy.fileLayout.GetLogFilePaths(fs, strategy.logRetentionPeriod, -1, string(enclaveUuid), string(serviceUuid)) + paths, err := strategy.fileLayout.GetLogFilePaths(fs, strategy.logRetentionPeriod, nowToRetentionPeriod, string(enclaveUuid), string(serviceUuid)) if err != nil { streamErrChan <- stacktrace.Propagate(err, "An error occurred retrieving log file paths for service '%v' in enclave '%v'.", serviceUuid, enclaveUuid) return diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/stream_logs_strategy_impl_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/stream_logs_strategy_impl_test.go index 26c490b2a6..3fae808e3d 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/stream_logs_strategy_impl_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/stream_logs_strategy/stream_logs_strategy_impl_test.go @@ -4,6 +4,7 @@ import ( "bufio" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock" + "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_helpers" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/logline" "github.com/stretchr/testify/require" @@ -25,7 +26,7 @@ func TestIsWithinRetentionPeriod(t *testing.T) { // week 41 would put the log line outside the retention period mockTime := logs_clock.NewMockLogsClockPerDay(2023, 41, 0) - strategy := NewStreamLogsStrategyImpl(mockTime, convertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) + strategy := NewStreamLogsStrategyImpl(mockTime, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) timestamp, err := parseTimestampFromJsonLogLine(jsonLogLine) require.NoError(t, err) @@ -269,8 +270,3 @@ func TestParseTimestampFromJsonLogLineWithNoTimestampFieldReturnsError(t *testin require.Error(t, err) } - -func convertWeeksToDuration(retentionPeriodInWeeks int) time.Duration { - const hoursInWeek = 7 * 24 // 7 days * 24 hours - return time.Duration(retentionPeriodInWeeks*hoursInWeek) * time.Hour -} From 24ecb4a5f79c850328865260553fde29568a04e3 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Mon, 21 Oct 2024 18:33:18 +0900 Subject: [PATCH 75/78] fix newline in go work --- go.work | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.work b/go.work index 25ef877ed8..318f912450 100644 --- a/go.work +++ b/go.work @@ -20,4 +20,4 @@ use ( ./name_generator ./path-compression connect-server -) \ No newline at end of file +) From 5c32a08b24af8dab5775b37dab609977fecc4690 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Tue, 22 Oct 2024 23:54:16 +0900 Subject: [PATCH 76/78] update persistent volume db tests --- ...istent_volume_logs_database_client_test.go | 492 +++++++++++++++--- 1 file changed, 434 insertions(+), 58 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go index 6661060ca0..87f8d03010 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go @@ -53,6 +53,7 @@ const ( defaultYear = 2023 defaultDay = 0 // sunday + defaultHour = 5 startingWeek = 4 defaultShouldReturnAllLogs = true @@ -131,9 +132,10 @@ func TestStreamUserServiceLogsPerWeek_WithFilters(t *testing.T) { testUserService3Uuid: true, } - underlyingFs := createFilledPerWeekFilesystem(startingWeek) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) + perWeekFileLayout := file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath) + underlyingFs := createFilledFilesystem(perWeekFileLayout, mockTime.Now()) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), perWeekFileLayout) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -155,6 +157,56 @@ func TestStreamUserServiceLogsPerWeek_WithFilters(t *testing.T) { require.NoError(t, testEvaluationErr) } +func TestStreamUserServiceLogsPerHour_WithFilters(t *testing.T) { + expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ + testUserService1Uuid: 2, + testUserService2Uuid: 2, + testUserService3Uuid: 2, + } + + firstTextFilter := logline.NewDoesContainTextLogLineFilter(firstFilterText) + secondTextFilter := logline.NewDoesNotContainTextLogLineFilter(secondFilterText) + regexFilter := logline.NewDoesContainMatchRegexLogLineFilter(firstMatchRegexFilterStr) + + logLinesFilters := []logline.LogLineFilter{ + *firstTextFilter, + *secondTextFilter, + *regexFilter, + } + + expectedFirstLogLine := "Starting feature 'runs idempotently'" + + userServiceUuids := map[service.ServiceUUID]bool{ + testUserService1Uuid: true, + testUserService2Uuid: true, + testUserService3Uuid: true, + } + + mockTime := logs_clock.NewMockLogsClockPerHour(defaultYear, startingWeek, defaultDay, defaultHour) + perHourFileLayout := file_layout.NewPerHourFileLayout(mockTime, volume_consts.LogsStorageDirpath) + underlyingFs := createFilledFilesystem(perHourFileLayout, mockTime.Now()) + perHourStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), perHourFileLayout) + + receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( + t, + logLinesFilters, + userServiceUuids, + expectedServiceAmountLogLinesByServiceUuid, + doNotFollowLogs, + underlyingFs, + perHourStreamStrategy, + ) + + for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { + expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] + require.True(t, found) + require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) + require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) + } + + require.NoError(t, testEvaluationErr) +} + func TestStreamUserServiceLogs_NoLogsFromPersistentVolume(t *testing.T) { expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ testUserService1Uuid: 0, @@ -214,9 +266,10 @@ func TestStreamUserServiceLogsPerWeek_NoLogsFromPersistentVolume(t *testing.T) { testUserService3Uuid: true, } - underlyingFs := createEmptyPerWeekFilesystem(startingWeek) mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) + perWeekFileLayout := file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath) + underlyingFs := createEmptyFilesystem(perWeekFileLayout, mockTime.Now()) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), perWeekFileLayout) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -236,6 +289,48 @@ func TestStreamUserServiceLogsPerWeek_NoLogsFromPersistentVolume(t *testing.T) { } } +func TestStreamUserServiceLogsPerHour_NoLogsFromPersistentVolume(t *testing.T) { + expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ + testUserService1Uuid: 0, + testUserService2Uuid: 0, + testUserService3Uuid: 0, + } + + firstTextFilter := logline.NewDoesContainTextLogLineFilter(notFoundedFilterText) + + logLinesFilters := []logline.LogLineFilter{ + *firstTextFilter, + } + + userServiceUuids := map[service.ServiceUUID]bool{ + testUserService1Uuid: true, + testUserService2Uuid: true, + testUserService3Uuid: true, + } + + mockTime := logs_clock.NewMockLogsClockPerHour(defaultYear, startingWeek, defaultDay, defaultHour) + perHourFileLayout := file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath) + underlyingFs := createEmptyFilesystem(perHourFileLayout, mockTime.Now()) + perHourStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), perHourFileLayout) + + receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( + t, + logLinesFilters, + userServiceUuids, + expectedServiceAmountLogLinesByServiceUuid, + doNotFollowLogs, + underlyingFs, + perHourStreamStrategy, + ) + require.NoError(t, testEvaluationErr) + + for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { + expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] + require.True(t, found) + require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) + } +} + func TestStreamUserServiceLogs_ThousandsOfLogLinesSuccessfulExecution(t *testing.T) { expectedAmountLogLines := 10_000 @@ -312,16 +407,15 @@ func TestStreamUserServiceLogsPerWeek_ThousandsOfLogLinesSuccessfulExecution(t * } underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() - // %02d to format week num with leading zeros so 1-9 are converted to 01-09 for %V format - formattedWeekNum := fmt.Sprintf("%02d", startingWeek) - file1PathStr := fmt.Sprintf(file_layout.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, string(enclaveUuid), testUserService1Uuid, volume_consts.Filetype) + mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) + perWeekFileLayout := file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath) + file1PathStr := perWeekFileLayout.GetLogFilePath(mockTime.Now(), testEnclaveUuid, testUserService1Uuid) file1, err := underlyingFs.Create(file1PathStr) require.NoError(t, err) _, err = file1.WriteString(logLinesStr) require.NoError(t, err) - mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), perWeekFileLayout) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -342,6 +436,59 @@ func TestStreamUserServiceLogsPerWeek_ThousandsOfLogLinesSuccessfulExecution(t * } } +func TestStreamUserServiceLogsPerHour_ThousandsOfLogLinesSuccessfulExecution(t *testing.T) { + expectedAmountLogLines := 10_000 + + expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ + testUserService1Uuid: expectedAmountLogLines, + } + + var emptyFilters []logline.LogLineFilter + + expectedFirstLogLine := "Starting feature 'centralized logs'" + + var logLines []string + + for i := 0; i <= expectedAmountLogLines; i++ { + logLines = append(logLines, logLine1) + } + + logLinesStr := strings.Join(logLines, "\n") + + userServiceUuids := map[service.ServiceUUID]bool{ + testUserService1Uuid: true, + } + + underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() + mockTime := logs_clock.NewMockLogsClockPerHour(defaultYear, startingWeek, defaultDay, defaultHour) + perHourFileLayout := file_layout.NewPerHourFileLayout(mockTime, volume_consts.LogsStorageDirpath) + file1PathStr := perHourFileLayout.GetLogFilePath(mockTime.Now(), testEnclaveUuid, testUserService1Uuid) + file1, err := underlyingFs.Create(file1PathStr) + require.NoError(t, err) + _, err = file1.WriteString(logLinesStr) + require.NoError(t, err) + + perHourStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), perHourFileLayout) + + receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( + t, + emptyFilters, + userServiceUuids, + expectedServiceAmountLogLinesByServiceUuid, + doNotFollowLogs, + underlyingFs, + perHourStreamStrategy, + ) + require.NoError(t, testEvaluationErr) + + for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { + expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] + require.True(t, found) + require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) + require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) + } +} + func TestStreamUserServiceLogs_EmptyLogLines(t *testing.T) { expectedAmountLogLines := 0 @@ -400,15 +547,15 @@ func TestStreamUserServiceLogsPerWeek_EmptyLogLines(t *testing.T) { logLinesStr := "" underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() - formattedWeekNum := fmt.Sprintf("%02d", startingWeek) - file1PathStr := fmt.Sprintf(file_layout.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, string(enclaveUuid), testUserService1Uuid, volume_consts.Filetype) + mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) + perWeekFileLayout := file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath) + file1PathStr := perWeekFileLayout.GetLogFilePath(mockTime.Now(), testEnclaveUuid, testUserService1Uuid) file1, err := underlyingFs.Create(file1PathStr) require.NoError(t, err) _, err = file1.WriteString(logLinesStr) require.NoError(t, err) - mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), perWeekFileLayout) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -428,6 +575,50 @@ func TestStreamUserServiceLogsPerWeek_EmptyLogLines(t *testing.T) { } } +func TestStreamUserServiceLogsPerHour_EmptyLogLines(t *testing.T) { + expectedAmountLogLines := 0 + + expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ + testUserService1Uuid: expectedAmountLogLines, + } + + var emptyFilters []logline.LogLineFilter + + userServiceUuids := map[service.ServiceUUID]bool{ + testUserService1Uuid: true, + } + + logLinesStr := "" + + underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() + mockTime := logs_clock.NewMockLogsClockPerHour(defaultYear, startingWeek, defaultDay, defaultHour) + perHourFileLayout := file_layout.NewPerHourFileLayout(mockTime, volume_consts.LogsStorageDirpath) + file1PathStr := perHourFileLayout.GetLogFilePath(mockTime.Now(), testEnclaveUuid, testUserService1Uuid) + file1, err := underlyingFs.Create(file1PathStr) + require.NoError(t, err) + _, err = file1.WriteString(logLinesStr) + require.NoError(t, err) + + perHourStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), perHourFileLayout) + + receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( + t, + emptyFilters, + userServiceUuids, + expectedServiceAmountLogLinesByServiceUuid, + doNotFollowLogs, + underlyingFs, + perHourStreamStrategy, + ) + require.NoError(t, testEvaluationErr) + + for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { + expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] + require.True(t, found) + require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) + } +} + func TestStreamUserServiceLogsPerWeek_WithLogsAcrossWeeks(t *testing.T) { expectedAmountLogLines := 8 @@ -456,26 +647,26 @@ func TestStreamUserServiceLogsPerWeek_WithLogsAcrossWeeks(t *testing.T) { logLine4} underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() + mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, 4, defaultDay) + perWeekFileLayout := file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath) week3logLinesStr := strings.Join(week3logLines, "\n") + "\n" week4logLinesStr := strings.Join(week4logLines, "\n") - formattedWeekFour := fmt.Sprintf("%02d", 4) - week4filepath := fmt.Sprintf(file_layout.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekFour, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) + week4filepath := perWeekFileLayout.GetLogFilePath(mockTime.Now(), testEnclaveUuid, testUserService1Uuid) week4, err := underlyingFs.Create(week4filepath) require.NoError(t, err) _, err = week4.WriteString(week4logLinesStr) require.NoError(t, err) - formattedWeekThree := fmt.Sprintf("%02d", 3) - week3filepath := fmt.Sprintf(file_layout.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekThree, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) + week3Time := logs_clock.NewMockLogsClockPerDay(defaultYear, 3, defaultDay) + week3filepath := perWeekFileLayout.GetLogFilePath(week3Time.Now(), testEnclaveUuid, testUserService1Uuid) week3, err := underlyingFs.Create(week3filepath) require.NoError(t, err) _, err = week3.WriteString(week3logLinesStr) require.NoError(t, err) - mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, 4, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), perWeekFileLayout) receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( t, @@ -494,7 +685,74 @@ func TestStreamUserServiceLogsPerWeek_WithLogsAcrossWeeks(t *testing.T) { require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) } +} + +func TestStreamUserServiceLogsPerHour_WithLogsAcrossHours(t *testing.T) { + expectedAmountLogLines := 8 + + expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ + testUserService1Uuid: expectedAmountLogLines, + } + var logLinesFilters []logline.LogLineFilter + + userServiceUuids := map[service.ServiceUUID]bool{ + testUserService1Uuid: true, + } + + expectedFirstLogLine := "Starting feature 'centralized logs'" + + hour4logLines := []string{ + logLine5, + logLine6, + logLine7, + logLine8} + hour3logLines := []string{ + logLine1, + logLine2, + logLine3a, + logLine3b, + logLine4} + + underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() + hour4Time := logs_clock.NewMockLogsClockPerHour(defaultYear, startingWeek, defaultDay, 4) + perHourFileLayout := file_layout.NewPerHourFileLayout(hour4Time, volume_consts.LogsStorageDirpath) + + hour3logLinesStr := strings.Join(hour3logLines, "\n") + "\n" + hour4logLinesStr := strings.Join(hour4logLines, "\n") + + hour4filepath := perHourFileLayout.GetLogFilePath(hour4Time.Now(), testEnclaveUuid, testUserService1Uuid) + hour4, err := underlyingFs.Create(hour4filepath) + require.NoError(t, err) + _, err = hour4.WriteString(hour4logLinesStr) + require.NoError(t, err) + + hour3Time := logs_clock.NewMockLogsClockPerHour(defaultYear, startingWeek, defaultDay, 3) + hour3filepath := perHourFileLayout.GetLogFilePath(hour3Time.Now(), testEnclaveUuid, testUserService1Uuid) + hour3, err := underlyingFs.Create(hour3filepath) + require.NoError(t, err) + _, err = hour3.WriteString(hour3logLinesStr) + require.NoError(t, err) + + perHourStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(hour4Time, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), perHourFileLayout) + + receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( + t, + logLinesFilters, + userServiceUuids, + expectedServiceAmountLogLinesByServiceUuid, + doNotFollowLogs, + underlyingFs, + perHourStreamStrategy, + ) + require.NoError(t, testEvaluationErr) + + for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { + expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] + require.True(t, found) + require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) + require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) + } } func TestStreamUserServiceLogsPerWeek_WithLogLineAcrossWeeks(t *testing.T) { @@ -565,6 +823,74 @@ func TestStreamUserServiceLogsPerWeek_WithLogLineAcrossWeeks(t *testing.T) { } } +func TestStreamUserServiceLogsPerHour_WithLogLineAcrossHours(t *testing.T) { + expectedAmountLogLines := 8 + + expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ + testUserService1Uuid: expectedAmountLogLines, + } + + var logLinesFilters []logline.LogLineFilter + + userServiceUuids := map[service.ServiceUUID]bool{ + testUserService1Uuid: true, + } + + expectedFirstLogLine := "Starting feature 'centralized logs'" + + hour4logLines := []string{ + logLine3b, + logLine4, + logLine5, + logLine6, + logLine7, + logLine8} + hour3logLines := []string{ + logLine1, + logLine2, + logLine3a} + + underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() + hour4Time := logs_clock.NewMockLogsClockPerHour(defaultYear, startingWeek, defaultDay, 4) + perHourFileLayout := file_layout.NewPerHourFileLayout(hour4Time, volume_consts.LogsStorageDirpath) + + hour3logLinesStr := strings.Join(hour3logLines, "\n") + "\n" + hour4logLinesStr := strings.Join(hour4logLines, "\n") + + hour4filepath := perHourFileLayout.GetLogFilePath(hour4Time.Now(), testEnclaveUuid, testUserService1Uuid) + hour4, err := underlyingFs.Create(hour4filepath) + require.NoError(t, err) + _, err = hour4.WriteString(hour4logLinesStr) + require.NoError(t, err) + + hour3Time := logs_clock.NewMockLogsClockPerHour(defaultYear, startingWeek, defaultDay, 3) + hour3filepath := perHourFileLayout.GetLogFilePath(hour3Time.Now(), testEnclaveUuid, testUserService1Uuid) + hour3, err := underlyingFs.Create(hour3filepath) + require.NoError(t, err) + _, err = hour3.WriteString(hour3logLinesStr) + require.NoError(t, err) + + perHourStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(hour4Time, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), perHourFileLayout) + + receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( + t, + logLinesFilters, + userServiceUuids, + expectedServiceAmountLogLinesByServiceUuid, + doNotFollowLogs, + underlyingFs, + perHourStreamStrategy, + ) + require.NoError(t, testEvaluationErr) + + for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { + expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] + require.True(t, found) + require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) + require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) + } +} + func TestStreamUserServiceLogsPerWeekReturnsTimestampedLogLines(t *testing.T) { expectedAmountLogLines := 3 @@ -586,16 +912,16 @@ func TestStreamUserServiceLogsPerWeekReturnsTimestampedLogLines(t *testing.T) { timestampedLogLinesStr := strings.Join(timestampedLogLines, "\n") + "\n" underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() + mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) + perWeekFileLayout := file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath) - formattedWeekNum := fmt.Sprintf("%02d", startingWeek) - filepath := fmt.Sprintf(file_layout.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) + filepath := perWeekFileLayout.GetLogFilePath(mockTime.Now(), testEnclaveUuid, testUserService1Uuid) file, err := underlyingFs.Create(filepath) require.NoError(t, err) _, err = file.WriteString(timestampedLogLinesStr) require.NoError(t, err) - mockTime := logs_clock.NewMockLogsClockPerDay(defaultYear, startingWeek, defaultDay) - perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath)) + perWeekStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), perWeekFileLayout) expectedTime, err := time.Parse(utcFormat, defaultUTCTimestampStr) require.NoError(t, err) @@ -621,6 +947,62 @@ func TestStreamUserServiceLogsPerWeekReturnsTimestampedLogLines(t *testing.T) { } } +func TestStreamUserServiceLogsPerHourReturnsTimestampedLogLines(t *testing.T) { + expectedAmountLogLines := 3 + + expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ + testUserService1Uuid: expectedAmountLogLines, + } + + var logLinesFilters []logline.LogLineFilter + + userServiceUuids := map[service.ServiceUUID]bool{ + testUserService1Uuid: true, + } + + timedLogLine1 := fmt.Sprintf("{\"log\":\"Starting feature 'centralized logs'\", \"timestamp\":\"%v\"}", defaultUTCTimestampStr) + timedLogLine2 := fmt.Sprintf("{\"log\":\"Starting feature 'runs idempotently'\", \"timestamp\":\"%v\"}", defaultUTCTimestampStr) + timedLogLine3 := fmt.Sprintf("{\"log\":\"The enclave was created\", \"timestamp\":\"%v\"}", defaultUTCTimestampStr) + + timestampedLogLines := []string{timedLogLine1, timedLogLine2, timedLogLine3} + timestampedLogLinesStr := strings.Join(timestampedLogLines, "\n") + "\n" + + underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() + mockTime := logs_clock.NewMockLogsClockPerHour(defaultYear, startingWeek, defaultDay, defaultHour) + perHourFileLayout := file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath) + + filepath := perHourFileLayout.GetLogFilePath(mockTime.Now(), testEnclaveUuid, testUserService1Uuid) + file, err := underlyingFs.Create(filepath) + require.NoError(t, err) + _, err = file.WriteString(timestampedLogLinesStr) + require.NoError(t, err) + + perHourStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(mockTime, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), perHourFileLayout) + + expectedTime, err := time.Parse(utcFormat, defaultUTCTimestampStr) + require.NoError(t, err) + + receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( + t, + logLinesFilters, + userServiceUuids, + expectedServiceAmountLogLinesByServiceUuid, + doNotFollowLogs, + underlyingFs, + perHourStreamStrategy, + ) + require.NoError(t, testEvaluationErr) + + for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { + expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] + require.True(t, found) + require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) + for _, logLine := range serviceLogLines { + require.Equal(t, expectedTime, logLine.GetTimestamp()) + } + } +} + func TestStreamUserServiceLogsPerFileReturnsTimestampedLogLines(t *testing.T) { expectedAmountLogLines := 3 @@ -697,10 +1079,8 @@ func executeStreamCallAndGetReceivedServiceLogLines( kurtosisBackend := backend_interface.NewMockKurtosisBackend(t) - // no log file management is done in these tests so values for logFileManager aren't important - mockTime := logs_clock.NewMockLogsClockPerDay(0, 0, 0) - fileLayout := file_layout.NewPerWeekFileLayout(mockTime, volume_consts.LogsStorageDirpath) - logFileManager := log_file_manager.NewLogFileManager(kurtosisBackend, underlyingFs, fileLayout, mockTime, time.Duration(0), volume_consts.LogsStorageDirpath) + // no log file management is done in these tests so values provided to logFileManager aren't important + logFileManager := log_file_manager.NewLogFileManager(nil, nil, nil, nil, time.Duration(0), "") logsDatabaseClient := NewPersistentVolumeLogsDatabaseClient(kurtosisBackend, underlyingFs, logFileManager, streamStrategy) userServiceLogsByUuidChan, errChan, receivedCancelCtxFunc, err := logsDatabaseClient.StreamUserServiceLogs(ctx, enclaveUuid, userServiceUuids, logLinesFilters, shouldFollowLogs, defaultShouldReturnAllLogs, defaultNumLogLines) @@ -756,14 +1136,13 @@ func executeStreamCallAndGetReceivedServiceLogLines( return receivedServiceLogsByUuid, nil } -func createFilledPerFileFilesystem() volume_filesystem.VolumeFilesystem { +func createFilledFilesystem(fileLayout file_layout.LogFileLayout, time time.Time) volume_filesystem.VolumeFilesystem { logLines := []string{logLine1, logLine2, logLine3a, logLine3b, logLine4, logLine5, logLine6, logLine7, logLine8} - logLinesStr := strings.Join(logLines, "\n") - file1PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) - file2PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService2Uuid, volume_consts.Filetype) - file3PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService3Uuid, volume_consts.Filetype) + file1PathStr := fileLayout.GetLogFilePath(time, testEnclaveUuid, testUserService1Uuid) + file2PathStr := fileLayout.GetLogFilePath(time, testEnclaveUuid, testUserService2Uuid) + file3PathStr := fileLayout.GetLogFilePath(time, testEnclaveUuid, testUserService3Uuid) mapFs := volume_filesystem.NewMockedVolumeFilesystem() @@ -779,26 +1158,16 @@ func createFilledPerFileFilesystem() volume_filesystem.VolumeFilesystem { return mapFs } -func createFilledPerWeekFilesystem(week int) volume_filesystem.VolumeFilesystem { - logLines := []string{logLine1, logLine2, logLine3a, logLine3b, logLine4, logLine5, logLine6, logLine7, logLine8} - - logLinesStr := strings.Join(logLines, "\n") - // %02d to format week num with leading zeros so 1-9 are converted to 01-09 for %V format - formattedWeekNum := fmt.Sprintf("%02d", week) - file1PathStr := fmt.Sprintf(file_layout.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) - file2PathStr := fmt.Sprintf(file_layout.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService2Uuid, volume_consts.Filetype) - file3PathStr := fmt.Sprintf(file_layout.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService3Uuid, volume_consts.Filetype) +func createEmptyFilesystem(fileLayout file_layout.LogFileLayout, time time.Time) volume_filesystem.VolumeFilesystem { + file1PathStr := fileLayout.GetLogFilePath(time, testEnclaveUuid, testUserService1Uuid) + file2PathStr := fileLayout.GetLogFilePath(time, testEnclaveUuid, testUserService2Uuid) + file3PathStr := fileLayout.GetLogFilePath(time, testEnclaveUuid, testUserService3Uuid) mapFs := volume_filesystem.NewMockedVolumeFilesystem() - file1, _ := mapFs.Create(file1PathStr) - _, _ = file1.WriteString(logLinesStr) - - file2, _ := mapFs.Create(file2PathStr) - _, _ = file2.WriteString(logLinesStr) - - file3, _ := mapFs.Create(file3PathStr) - _, _ = file3.WriteString(logLinesStr) + _, _ = mapFs.Create(file1PathStr) + _, _ = mapFs.Create(file2PathStr) + _, _ = mapFs.Create(file3PathStr) return mapFs } @@ -817,18 +1186,25 @@ func createEmptyPerFileFilesystem() volume_filesystem.VolumeFilesystem { return mapFs } -func createEmptyPerWeekFilesystem(week int) volume_filesystem.VolumeFilesystem { - // %02d to format week num with leading zeros so 1-9 are converted to 01-09 for %V format - formattedWeekNum := fmt.Sprintf("%02d", week) - file1PathStr := fmt.Sprintf(file_layout.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) - file2PathStr := fmt.Sprintf(file_layout.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService2Uuid, volume_consts.Filetype) - file3PathStr := fmt.Sprintf(file_layout.PerWeekFilePathFmtStr, volume_consts.LogsStorageDirpath, strconv.Itoa(defaultYear), formattedWeekNum, testEnclaveUuid, testUserService3Uuid, volume_consts.Filetype) +func createFilledPerFileFilesystem() volume_filesystem.VolumeFilesystem { + logLines := []string{logLine1, logLine2, logLine3a, logLine3b, logLine4, logLine5, logLine6, logLine7, logLine8} + + logLinesStr := strings.Join(logLines, "\n") + + file1PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService1Uuid, volume_consts.Filetype) + file2PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService2Uuid, volume_consts.Filetype) + file3PathStr := fmt.Sprintf(volume_consts.PerFileFmtStr, volume_consts.LogsStorageDirpath, testEnclaveUuid, testUserService3Uuid, volume_consts.Filetype) mapFs := volume_filesystem.NewMockedVolumeFilesystem() - _, _ = mapFs.Create(file1PathStr) - _, _ = mapFs.Create(file2PathStr) - _, _ = mapFs.Create(file3PathStr) + file1, _ := mapFs.Create(file1PathStr) + _, _ = file1.WriteString(logLinesStr) + + file2, _ := mapFs.Create(file2PathStr) + _, _ = file2.WriteString(logLinesStr) + + file3, _ := mapFs.Create(file3PathStr) + _, _ = file3.WriteString(logLinesStr) return mapFs } From 8f83284408c4eaca18ab86ce8f43f15821cdd28f Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Wed, 23 Oct 2024 00:18:53 +0900 Subject: [PATCH 77/78] add across week day hour test --- .../file_layout/per_hour_file_layout.go | 2 - ...istent_volume_logs_database_client_test.go | 137 ++++++++++++++++++ 2 files changed, 137 insertions(+), 2 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go index bae57a8398..0c6d6cda08 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/file_layout/per_hour_file_layout.go @@ -5,7 +5,6 @@ import ( "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/logs_clock" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_consts" "github.com/kurtosis-tech/kurtosis/engine/server/engine/centralized_logs/client_implementations/persistent_volume/volume_filesystem" - "github.com/sirupsen/logrus" "golang.org/x/exp/slices" "math" "os" @@ -71,7 +70,6 @@ func (phf *PerHourFileLayout) getLogFilePathsFromNowTillRetentionPeriod(fs volum for i := 0; i < retentionPeriodInHours; i++ { year, week, day, hour := TimeToWeekDayHour(currentTime.Add(time.Duration(-i) * time.Hour)) filePathStr := phf.getHourlyLogFilePath(year, week, day, hour, enclaveUuid, serviceUuid) - logrus.Infof("Looking for logs for service '%v' in enclave '%v' at filepath: %v", enclaveUuid, serviceUuid, filePathStr) if _, err := fs.Stat(filePathStr); err == nil { paths = append(paths, filePathStr) firstHourWithLogs = i diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go index 87f8d03010..d6011e1bb0 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_logs_database_client_test.go @@ -891,6 +891,143 @@ func TestStreamUserServiceLogsPerHour_WithLogLineAcrossHours(t *testing.T) { } } +func TestStreamUserServiceLogsPerHour_WithLogLineAcrossWeekDayHour(t *testing.T) { + expectedAmountLogLines := 8 + + expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ + testUserService1Uuid: expectedAmountLogLines, + } + + var logLinesFilters []logline.LogLineFilter + + userServiceUuids := map[service.ServiceUUID]bool{ + testUserService1Uuid: true, + } + + expectedFirstLogLine := "Starting feature 'centralized logs'" + + day1Hour0logLines := []string{ + logLine3b, + logLine4, + logLine5, + logLine6, + logLine7, + logLine8} + day0Hour24logLines := []string{ + logLine1, + logLine2, + logLine3a} + + underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() + day1Hour0Time := logs_clock.NewMockLogsClockPerHour(defaultYear, 4, 1, 0) + day0Hour24Time := logs_clock.NewMockLogsClockPerHour(defaultYear, 3, 0, 23) + + perHourFileLayout := file_layout.NewPerHourFileLayout(day1Hour0Time, volume_consts.LogsStorageDirpath) + + day1Hour0logLinesStr := strings.Join(day1Hour0logLines, "\n") + "\n" + day0Hour24logLinesStr := strings.Join(day0Hour24logLines, "\n") + + day1Hour0filepath := perHourFileLayout.GetLogFilePath(day1Hour0Time.Now(), testEnclaveUuid, testUserService1Uuid) + day1Hour0, err := underlyingFs.Create(day1Hour0filepath) + require.NoError(t, err) + _, err = day1Hour0.WriteString(day1Hour0logLinesStr) + require.NoError(t, err) + + day0Hour24filepath := perHourFileLayout.GetLogFilePath(day0Hour24Time.Now(), testEnclaveUuid, testUserService1Uuid) + day0Hour24, err := underlyingFs.Create(day0Hour24filepath) + require.NoError(t, err) + _, err = day0Hour24.WriteString(day0Hour24logLinesStr) + require.NoError(t, err) + + perHourStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(day1Hour0Time, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), perHourFileLayout) + + receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( + t, + logLinesFilters, + userServiceUuids, + expectedServiceAmountLogLinesByServiceUuid, + doNotFollowLogs, + underlyingFs, + perHourStreamStrategy, + ) + require.NoError(t, testEvaluationErr) + + for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { + expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] + require.True(t, found) + require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) + require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) + } +} + +func TestStreamUserServiceLogsPerHour_WithLogLineAcrossWeeks(t *testing.T) { + expectedAmountLogLines := 8 + + expectedServiceAmountLogLinesByServiceUuid := map[service.ServiceUUID]int{ + testUserService1Uuid: expectedAmountLogLines, + } + + var logLinesFilters []logline.LogLineFilter + + userServiceUuids := map[service.ServiceUUID]bool{ + testUserService1Uuid: true, + } + + expectedFirstLogLine := "Starting feature 'centralized logs'" + + hour4logLines := []string{ + logLine3b, + logLine4, + logLine5, + logLine6, + logLine7, + logLine8} + hour3logLines := []string{ + logLine1, + logLine2, + logLine3a} + + underlyingFs := volume_filesystem.NewMockedVolumeFilesystem() + hour4Time := logs_clock.NewMockLogsClockPerHour(defaultYear, startingWeek, defaultDay, 4) + perHourFileLayout := file_layout.NewPerHourFileLayout(hour4Time, volume_consts.LogsStorageDirpath) + + hour3logLinesStr := strings.Join(hour3logLines, "\n") + "\n" + hour4logLinesStr := strings.Join(hour4logLines, "\n") + + hour4filepath := perHourFileLayout.GetLogFilePath(hour4Time.Now(), testEnclaveUuid, testUserService1Uuid) + hour4, err := underlyingFs.Create(hour4filepath) + require.NoError(t, err) + _, err = hour4.WriteString(hour4logLinesStr) + require.NoError(t, err) + + hour3Time := logs_clock.NewMockLogsClockPerHour(defaultYear, startingWeek, defaultDay, 3) + hour3filepath := perHourFileLayout.GetLogFilePath(hour3Time.Now(), testEnclaveUuid, testUserService1Uuid) + hour3, err := underlyingFs.Create(hour3filepath) + require.NoError(t, err) + _, err = hour3.WriteString(hour3logLinesStr) + require.NoError(t, err) + + perHourStreamStrategy := stream_logs_strategy.NewStreamLogsStrategyImpl(hour4Time, persistent_volume_helpers.ConvertWeeksToDuration(retentionPeriodInWeeksForTesting), perHourFileLayout) + + receivedUserServiceLogsByUuid, testEvaluationErr := executeStreamCallAndGetReceivedServiceLogLines( + t, + logLinesFilters, + userServiceUuids, + expectedServiceAmountLogLinesByServiceUuid, + doNotFollowLogs, + underlyingFs, + perHourStreamStrategy, + ) + require.NoError(t, testEvaluationErr) + + for serviceUuid, serviceLogLines := range receivedUserServiceLogsByUuid { + expectedAmountLogLines, found := expectedServiceAmountLogLinesByServiceUuid[serviceUuid] + require.True(t, found) + require.Equal(t, expectedAmountLogLines, len(serviceLogLines)) + require.Equal(t, expectedFirstLogLine, serviceLogLines[0].GetContent()) + } +} + func TestStreamUserServiceLogsPerWeekReturnsTimestampedLogLines(t *testing.T) { expectedAmountLogLines := 3 From 85012df038b1bc8d27ea7372a9ee051ab9a86103 Mon Sep 17 00:00:00 2001 From: Tedi Mitiku Date: Wed, 23 Oct 2024 00:33:54 +0900 Subject: [PATCH 78/78] simplify get all log filepaths and add cmt --- .../log_file_manager/log_file_manager.go | 17 +++++++++-------- .../persistent_volume_helpers.go | 5 ++++- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go index 38c71cdeb9..67293a3d7f 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/log_file_manager/log_file_manager.go @@ -264,17 +264,18 @@ func (manager *LogFileManager) createSymlinkLogFile(targetLogFilePath, symlinkLo return nil } +// if [enclaveUuid] is empty, gets log file paths from all enclaves func (manager *LogFileManager) getAllLogFilePaths(enclaveUuid string) ([]string, error) { var paths []string walkFunc := func(path string, info fs.FileInfo, err error) error { - if enclaveUuid != emptyEnclaveUuid { - if strings.Contains(path, enclaveUuid) && !info.IsDir() { - paths = append(paths, path) - } - } else { - if !info.IsDir() { - paths = append(paths, path) - } + if err != nil { + return err + } + if info.IsDir() { + return nil + } + if enclaveUuid == emptyEnclaveUuid || strings.Contains(path, enclaveUuid) { + paths = append(paths, path) } return nil } diff --git a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_helpers/persistent_volume_helpers.go b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_helpers/persistent_volume_helpers.go index ca20762862..c6b9d483fb 100644 --- a/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_helpers/persistent_volume_helpers.go +++ b/engine/server/engine/centralized_logs/client_implementations/persistent_volume/persistent_volume_helpers/persistent_volume_helpers.go @@ -2,7 +2,10 @@ package persistent_volume_helpers import "time" +const ( + hoursInWeek = 7 * 24 +) + func ConvertWeeksToDuration(weeks int) time.Duration { - hoursInWeek := 7 * 24 return time.Duration(weeks*hoursInWeek) * time.Hour }

    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 diff --git a/enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Searches with ctrl+f (failed) (attempt 2).png b/enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Searches with ctrl+f (failed) (attempt 2).png deleted file mode 100644 index 4e3079a2d02bf5ce3478ccfa79c3803013ae9c42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87074 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 NiJa==d|A_1{|6}rS7`tM diff --git a/enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Searches with ctrl+f (failed) (attempt 3).png b/enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Searches with ctrl+f (failed) (attempt 3).png deleted file mode 100644 index ba9283297fb6d4e59803b7403f52c4fe271de152..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87252 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 ZXAM(m+RE*uUmbq*KvDf}KFsXZ{{h^o{ZRk_ diff --git a/enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Searches with ctrl+f (failed).png b/enclave-manager/web/cypress/screenshots/catalog.cy.ts/Catalog -- Searches with ctrl+f (failed).png deleted file mode 100644 index 17dc1231e86721f86e0ce9628ea40ff32dfbe78a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87156 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 IHF@*D0JrL2t^fc4 diff --git a/enclave-manager/web/cypress/screenshots/enclaveList.cy.ts/Enclave List -- Can create and update an enclave (failed) (attempt 2).png b/enclave-manager/web/cypress/screenshots/enclaveList.cy.ts/Enclave List -- Can create and update an enclave (failed) (attempt 2).png deleted file mode 100644 index 5cc8acd191e8cde9ad7296ef235e3f907abb5a61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97816 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