Skip to content

Commit

Permalink
Fixed tests
Browse files Browse the repository at this point in the history
  • Loading branch information
satr committed Sep 30, 2024
1 parent e7273d9 commit ac2bbc7
Show file tree
Hide file tree
Showing 9 changed files with 68 additions and 179 deletions.
43 changes: 14 additions & 29 deletions api/applications/applications_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import (
applicationModels "github.com/equinor/radix-api/api/applications/models"
environmentModels "github.com/equinor/radix-api/api/environments/models"
jobModels "github.com/equinor/radix-api/api/jobs/models"
"github.com/equinor/radix-api/api/metrics"
metricsMock "github.com/equinor/radix-api/api/metrics/mock"
controllertest "github.com/equinor/radix-api/api/test"
"github.com/equinor/radix-api/api/utils"
"github.com/equinor/radix-api/models"
Expand All @@ -35,6 +35,7 @@ import (
builders "github.com/equinor/radix-operator/pkg/apis/utils"
radixfake "github.com/equinor/radix-operator/pkg/client/clientset/versioned/fake"
"github.com/golang/mock/gomock"
"github.com/google/uuid"
kedafake "github.com/kedacore/keda/v2/pkg/generated/clientset/versioned/fake"
prometheusfake "github.com/prometheus-operator/prometheus-operator/pkg/client/versioned/fake"
"github.com/stretchr/testify/assert"
Expand Down Expand Up @@ -92,13 +93,13 @@ func setupTestWithFactory(t *testing.T, handlerFactory ApplicationHandlerFactory
return &commonTestUtils, &controllerTestUtils, kubeclient, radixclient, kedaClient, prometheusclient, secretproviderclient, certClient
}

func createPrometheusHandlerMock(t *testing.T, radixclient *radixfake.Clientset, mockHandler *func(handler *metrics.MockPrometheusHandler)) *metrics.MockPrometheusHandler {
func createPrometheusHandlerMock(t *testing.T, radixclient *radixfake.Clientset, mockHandler *func(handler *metricsMock.MockPrometheusHandler)) *metricsMock.MockPrometheusHandler {
ctrl := gomock.NewController(t)
mockPrometheusHandler := metrics.NewMockPrometheusHandler(ctrl)
mockPrometheusHandler := metricsMock.NewMockPrometheusHandler(ctrl)
if mockHandler != nil {
(*mockHandler)(mockPrometheusHandler)
} else {
mockPrometheusHandler.EXPECT().GetUsedResources(gomock.Any(), radixclient, gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes().Return(&applicationModels.UsedResources{}, nil)
mockPrometheusHandler.EXPECT().GetUsedResources(gomock.Any(), radixclient, gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes().Return(&applicationModels.UsedResources{}, nil)
}
return mockPrometheusHandler
}
Expand Down Expand Up @@ -1944,7 +1945,6 @@ func Test_GetUsedResources(t *testing.T) {
component string
duration string
since string
ignoreZero bool
}

type scenario struct {
Expand All @@ -1964,22 +1964,13 @@ func Test_GetUsedResources(t *testing.T) {
},
{
name: "Get used resources with arguments",
queryString: "?environment=prod&component=component1&duration=10d&since=2w&ignorezero=true",
queryString: "?environment=prod&component=component1&duration=10d&since=2w",
expectedUsedResources: getTestUsedResources(),
expectedArgs: expectedArgs{
environment: envName1,
component: componentName1,
duration: "10d",
since: "2w",
ignoreZero: true,
},
},
{
name: "Invalid boolean query parameter falls back to false",
expectedUsedResources: getTestUsedResources(),
queryString: "?ignorezero=abc",
expectedArgs: expectedArgs{
ignoreZero: false,
},
},
{
Expand All @@ -1996,9 +1987,9 @@ func Test_GetUsedResources(t *testing.T) {
_, err := commonTestUtils.ApplyRegistration(builders.ARadixRegistration().WithName(appName1))
require.NoError(t, err)

mockHandlerModifier := func(handler *metrics.MockPrometheusHandler) {
mockHandlerModifier := func(handler *metricsMock.MockPrometheusHandler) {
args := ts.expectedArgs
handler.EXPECT().GetUsedResources(gomock.Any(), radixClient, appName1, args.environment, args.component, args.duration, args.since, args.ignoreZero).
handler.EXPECT().GetUsedResources(gomock.Any(), radixClient, appName1, args.environment, args.component, args.duration, args.since).
Times(1).
Return(ts.expectedUsedResources, ts.expectedUsedResourcesError)
}
Expand Down Expand Up @@ -2032,20 +2023,14 @@ func getTestUsedResources() *applicationModels.UsedResources {
From: radixutils.FormatTimestamp(time.Now().Add(time.Minute * -10)),
To: radixutils.FormatTimestamp(time.Now()),
CPU: &applicationModels.UsedResource{
Min: "1m",
Max: "10m",
Average: "5m",
Min: pointers.Ptr(1.1),
Max: pointers.Ptr(10.12),
Avg: pointers.Ptr(5.56),
Min: pointers.Ptr(1.1),
Max: pointers.Ptr(10.12),
Avg: pointers.Ptr(5.56),
},
Memory: &applicationModels.UsedResource{
Min: "100M",
Max: "1000M",
Average: "500M",
Min: pointers.Ptr(100.1),
Max: pointers.Ptr(1000.12),
Avg: pointers.Ptr(500.56),
Min: pointers.Ptr(100.1),
Max: pointers.Ptr(1000.12),
Avg: pointers.Ptr(500.56),
},
Warnings: []string{"warning1", "warning2"},
}
Expand Down
Empty file.
13 changes: 13 additions & 0 deletions api/metrics/internal/prometheus_defaults.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package internal

// QueryName Prometheus query name
type QueryName string

const (
CpuMax QueryName = "CpuMax"
CpuMin QueryName = "CpuMin"
CpuAvg QueryName = "CpuAvg"
MemoryMax QueryName = "MemoryMax"
MemoryMin QueryName = "MemoryMin"
MemoryAvg QueryName = "MemoryAvg"
)
6 changes: 3 additions & 3 deletions api/metrics/mock/prometheus_client_mock.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 4 additions & 3 deletions api/metrics/prometheus_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"errors"
"time"

"github.com/equinor/radix-api/api/metrics/internal"
prometheusApi "github.com/prometheus/client_golang/api"
prometheusV1 "github.com/prometheus/client_golang/api/prometheus/v1"
"github.com/prometheus/common/model"
Expand All @@ -15,7 +16,7 @@ import (
// PrometheusClient Interface for Prometheus client
type PrometheusClient interface {
// GetMetrics Get metrics for the application
GetMetrics(ctx context.Context, appName, envName, componentName, duration, since string) (map[QueryName]prometheusModel.Value, []string, error)
GetMetrics(ctx context.Context, appName, envName, componentName, duration, since string) (map[internal.QueryName]prometheusModel.Value, []string, error)
}

// NewPrometheusClient Constructor for Prometheus client
Expand All @@ -35,8 +36,8 @@ type client struct {
}

// GetMetrics Get metrics for the application
func (c *client) GetMetrics(ctx context.Context, appName, envName, componentName, duration, since string) (map[QueryName]prometheusModel.Value, []string, error) {
results := make(map[QueryName]model.Value)
func (c *client) GetMetrics(ctx context.Context, appName, envName, componentName, duration, since string) (map[internal.QueryName]prometheusModel.Value, []string, error) {
results := make(map[internal.QueryName]model.Value)
now := time.Now()
var warnings []string
for metricName, query := range getPrometheusQueries(appName, envName, componentName, duration, since) {
Expand Down
52 changes: 0 additions & 52 deletions api/metrics/prometheus_client_mock.go

This file was deleted.

52 changes: 22 additions & 30 deletions api/metrics/prometheus_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"time"

applicationModels "github.com/equinor/radix-api/api/applications/models"
"github.com/equinor/radix-api/api/metrics/internal"
radixutils "github.com/equinor/radix-common/utils"
"github.com/equinor/radix-common/utils/pointers"
"github.com/equinor/radix-operator/pkg/apis/utils"
Expand All @@ -17,19 +18,10 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

// QueryName Prometheus query name
type QueryName string

const (
cpuMax QueryName = "cpuMax"
cpuMin QueryName = "cpuMin"
cpuAvg QueryName = "cpuAvg"
memoryMax QueryName = "memoryMax"
memoryMin QueryName = "memoryMin"
memoryAvg QueryName = "memoryAvg"
durationExpression = `^[0-9]{1,5}[mhdw]$`
defaultDuration = "30d"
defaultOffset = ""
durationExpression = `^[0-9]{1,5}[mhdw]$`
defaultDuration = "30d"
defaultOffset = ""
)

// PrometheusHandler Interface for Prometheus handler
Expand Down Expand Up @@ -76,15 +68,15 @@ func (pc *handler) GetUsedResources(ctx context.Context, radixClient radixclient
return resources, nil
}

func getUsedResourcesByMetrics(ctx context.Context, results map[QueryName]prometheusModel.Value, queryDuration time.Duration, querySince time.Duration) *applicationModels.UsedResources {
func getUsedResourcesByMetrics(ctx context.Context, results map[internal.QueryName]prometheusModel.Value, queryDuration time.Duration, querySince time.Duration) *applicationModels.UsedResources {
usedCpuResource := applicationModels.UsedResource{}
usedCpuResource.Min = getCpuMetricValue(ctx, results, cpuMin)
usedCpuResource.Max = getCpuMetricValue(ctx, results, cpuMax)
usedCpuResource.Avg = getCpuMetricValue(ctx, results, cpuAvg)
usedCpuResource.Min = getCpuMetricValue(ctx, results, internal.CpuMin)
usedCpuResource.Max = getCpuMetricValue(ctx, results, internal.CpuMax)
usedCpuResource.Avg = getCpuMetricValue(ctx, results, internal.CpuAvg)
usedMemoryResource := applicationModels.UsedResource{}
usedMemoryResource.Min = getMemoryMetricValue(ctx, results, memoryMin)
usedMemoryResource.Max = getMemoryMetricValue(ctx, results, memoryMax)
usedMemoryResource.Avg = getMemoryMetricValue(ctx, results, memoryAvg)
usedMemoryResource.Min = getMemoryMetricValue(ctx, results, internal.MemoryMin)
usedMemoryResource.Max = getMemoryMetricValue(ctx, results, internal.MemoryMax)
usedMemoryResource.Avg = getMemoryMetricValue(ctx, results, internal.MemoryAvg)
now := time.Now()
return &applicationModels.UsedResources{
From: radixutils.FormatTimestamp(now.Add(-queryDuration)),
Expand All @@ -105,21 +97,21 @@ func parseQueryDuration(duration string, defaultValue string) (time.Duration, st
return time.Duration(parsedDuration), duration, err
}

func getCpuMetricValue(ctx context.Context, queryResults map[QueryName]prometheusModel.Value, queryName QueryName) *float64 {
func getCpuMetricValue(ctx context.Context, queryResults map[internal.QueryName]prometheusModel.Value, queryName internal.QueryName) *float64 {
if value, ok := getMetricsValue(ctx, queryResults, queryName); ok {
return pointers.Ptr(value)
}
return nil
}

func getMemoryMetricValue(ctx context.Context, queryResults map[QueryName]prometheusModel.Value, queryName QueryName) *float64 {
func getMemoryMetricValue(ctx context.Context, queryResults map[internal.QueryName]prometheusModel.Value, queryName internal.QueryName) *float64 {
if value, ok := getMetricsValue(ctx, queryResults, queryName); ok {
return pointers.Ptr(value)
}
return nil
}

func getMetricsValue(ctx context.Context, queryResults map[QueryName]prometheusModel.Value, queryName QueryName) (float64, bool) {
func getMetricsValue(ctx context.Context, queryResults map[internal.QueryName]prometheusModel.Value, queryName internal.QueryName) (float64, bool) {
queryResult, ok := queryResults[queryName]
if !ok {
return 0.0, false
Expand All @@ -136,21 +128,21 @@ func getMetricsValue(ctx context.Context, queryResults map[QueryName]prometheusM
return sum, true
}

func getPrometheusQueries(appName, envName, componentName, duration, since string) map[QueryName]string {
func getPrometheusQueries(appName, envName, componentName, duration, since string) map[internal.QueryName]string {
environmentFilter := radixutils.TernaryString(envName == "",
fmt.Sprintf(`,namespace=~"%s-.*"`, appName),
fmt.Sprintf(`,namespace="%s"`, utils.GetEnvironmentNamespace(appName, envName)))
componentFilter := radixutils.TernaryString(envName == "", "", fmt.Sprintf(`,container="%s"`, componentName))
offsetFilter := radixutils.TernaryString(since == "", "", fmt.Sprintf(` offset %s `, since))
cpuUsageQuery := fmt.Sprintf(`sum by (namespace, container) (rate(container_cpu_usage_seconds_total{container!="", namespace!="%s-app" %s %s} [1h])) [%s:] %s`, appName, environmentFilter, componentFilter, duration, offsetFilter)
memoryUsageQuery := fmt.Sprintf(`sum by (namespace, container) (container_memory_usage_bytes{container!="", namespace!="%s-app" %s %s} > 0) [%s:] %s`, appName, environmentFilter, componentFilter, duration, offsetFilter)
queries := map[QueryName]string{
cpuMax: fmt.Sprintf("max_over_time(%s)", cpuUsageQuery),
cpuMin: fmt.Sprintf("min_over_time(%s)", cpuUsageQuery),
cpuAvg: fmt.Sprintf("avg_over_time(%s)", cpuUsageQuery),
memoryMax: fmt.Sprintf("max_over_time(%s)", memoryUsageQuery),
memoryMin: fmt.Sprintf("min_over_time(%s)", memoryUsageQuery),
memoryAvg: fmt.Sprintf("avg_over_time(%s)", memoryUsageQuery),
queries := map[internal.QueryName]string{
internal.CpuMax: fmt.Sprintf("max_over_time(%s)", cpuUsageQuery),
internal.CpuMin: fmt.Sprintf("min_over_time(%s)", cpuUsageQuery),
internal.CpuAvg: fmt.Sprintf("avg_over_time(%s)", cpuUsageQuery),
internal.MemoryMax: fmt.Sprintf("max_over_time(%s)", memoryUsageQuery),
internal.MemoryMin: fmt.Sprintf("min_over_time(%s)", memoryUsageQuery),
internal.MemoryAvg: fmt.Sprintf("avg_over_time(%s)", memoryUsageQuery),
}
return queries
}
52 changes: 0 additions & 52 deletions api/metrics/prometheus_handler_mock.go

This file was deleted.

Loading

0 comments on commit ac2bbc7

Please sign in to comment.