mirror of
https://github.com/optim-enterprises-bv/vault.git
synced 2025-11-01 19:17:58 +00:00
Show Current Month When Future Month Start Date is Provided (#28042)
* Show current month data * Added changelog * Edited changelog
This commit is contained in:
3
changelog/28042.txt
Normal file
3
changelog/28042.txt
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
```release-note:bug
|
||||||
|
activity: The sys/internal/counters/activity endpoint will return current month data when the end_date parameter is set to a future date.
|
||||||
|
```
|
||||||
@@ -1782,12 +1782,20 @@ func (a *ActivityLog) handleQuery(ctx context.Context, startTime, endTime time.T
|
|||||||
startTime = timeutil.StartOfMonth(startTime)
|
startTime = timeutil.StartOfMonth(startTime)
|
||||||
endTime = timeutil.EndOfMonth(endTime)
|
endTime = timeutil.EndOfMonth(endTime)
|
||||||
|
|
||||||
|
// At the max, we only want to return data up until the end of the current month.
|
||||||
|
// Adjust the end time be the current month if a future date has been provided.
|
||||||
|
endOfCurrentMonth := timeutil.EndOfMonth(a.clock.Now().UTC())
|
||||||
|
adjustedEndTime := endTime
|
||||||
|
if endTime.After(endOfCurrentMonth) {
|
||||||
|
adjustedEndTime = endOfCurrentMonth
|
||||||
|
}
|
||||||
|
|
||||||
// If the endTime of the query is the current month, request data from the queryStore
|
// If the endTime of the query is the current month, request data from the queryStore
|
||||||
// with the endTime equal to the end of the last month, and add in the current month
|
// with the endTime equal to the end of the last month, and add in the current month
|
||||||
// data.
|
// data.
|
||||||
precomputedQueryEndTime := endTime
|
precomputedQueryEndTime := adjustedEndTime
|
||||||
if timeutil.IsCurrentMonth(endTime, a.clock.Now().UTC()) {
|
if timeutil.IsCurrentMonth(adjustedEndTime, a.clock.Now().UTC()) {
|
||||||
precomputedQueryEndTime = timeutil.EndOfMonth(timeutil.MonthsPreviousTo(1, timeutil.StartOfMonth(endTime)))
|
precomputedQueryEndTime = timeutil.EndOfMonth(timeutil.MonthsPreviousTo(1, timeutil.StartOfMonth(adjustedEndTime)))
|
||||||
computePartial = true
|
computePartial = true
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1830,7 +1838,7 @@ func (a *ActivityLog) handleQuery(ctx context.Context, startTime, endTime time.T
|
|||||||
|
|
||||||
// Estimate the current month totals. These record contains is complete with all the
|
// Estimate the current month totals. These record contains is complete with all the
|
||||||
// current month data, grouped by namespace and mounts
|
// current month data, grouped by namespace and mounts
|
||||||
currentMonth, err := a.computeCurrentMonthForBillingPeriod(ctx, partialByMonth, startTime, endTime)
|
currentMonth, err := a.computeCurrentMonthForBillingPeriod(ctx, partialByMonth, startTime, adjustedEndTime)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -1880,7 +1888,7 @@ func (a *ActivityLog) handleQuery(ctx context.Context, startTime, endTime time.T
|
|||||||
a.sortActivityLogMonthsResponse(months)
|
a.sortActivityLogMonthsResponse(months)
|
||||||
|
|
||||||
// Modify the final month output to make response more consumable based on API request
|
// Modify the final month output to make response more consumable based on API request
|
||||||
months = a.modifyResponseMonths(months, startTime, endTime)
|
months = a.modifyResponseMonths(months, startTime, adjustedEndTime)
|
||||||
responseData["months"] = months
|
responseData["months"] = months
|
||||||
|
|
||||||
return responseData, nil
|
return responseData, nil
|
||||||
|
|||||||
@@ -230,6 +230,45 @@ func Test_ActivityLog_EmptyDataMonths(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test_ActivityLog_FutureEndDate queries a start time from the past
|
||||||
|
// and an end date in the future. The test
|
||||||
|
// verifies that the current month is returned in the response.
|
||||||
|
func Test_ActivityLog_FutureEndDate(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
cluster := minimal.NewTestSoloCluster(t, nil)
|
||||||
|
client := cluster.Cores[0].Client
|
||||||
|
_, err := client.Logical().Write("sys/internal/counters/config", map[string]interface{}{
|
||||||
|
"enabled": "enable",
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
_, err = clientcountutil.NewActivityLogData(client).
|
||||||
|
NewPreviousMonthData(1).
|
||||||
|
NewClientsSeen(10).
|
||||||
|
NewCurrentMonthData().
|
||||||
|
NewClientsSeen(10).
|
||||||
|
Write(context.Background(), generation.WriteOptions_WRITE_PRECOMPUTED_QUERIES, generation.WriteOptions_WRITE_ENTITIES)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
now := time.Now().UTC()
|
||||||
|
// query from the beginning of 3 months ago to beginning of next month
|
||||||
|
resp, err := client.Logical().ReadWithData("sys/internal/counters/activity", map[string][]string{
|
||||||
|
"end_time": {timeutil.StartOfNextMonth(now).Format(time.RFC3339)},
|
||||||
|
"start_time": {timeutil.StartOfMonth(timeutil.MonthsPreviousTo(3, now)).Format(time.RFC3339)},
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
monthsResponse := getMonthsData(t, resp)
|
||||||
|
|
||||||
|
require.Len(t, monthsResponse, 4)
|
||||||
|
|
||||||
|
// Get the last month of data in the slice
|
||||||
|
expectedCurrentMonthData := monthsResponse[3]
|
||||||
|
expectedTime, err := time.Parse(time.RFC3339, expectedCurrentMonthData.Timestamp)
|
||||||
|
require.NoError(t, err)
|
||||||
|
if !timeutil.IsCurrentMonth(expectedTime, now) {
|
||||||
|
t.Fatalf("final month data is not current month")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func getMonthsData(t *testing.T, resp *api.Secret) []vault.ResponseMonth {
|
func getMonthsData(t *testing.T, resp *api.Secret) []vault.ResponseMonth {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
monthsRaw, ok := resp.Data["months"]
|
monthsRaw, ok := resp.Data["months"]
|
||||||
|
|||||||
Reference in New Issue
Block a user