Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

feat(metrics-operator): introduce insecureSkipTlsVerify parameter #3711

Merged
merged 8 commits into from
Aug 27, 2024
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/docs/reference/api-reference/metrics/v1/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -376,6 +376,7 @@ _Appears in:_
| `type` _string_ | Type represents the provider type. This can be one of cortex, datadog, dql, dynatrace, prometheus or thanos. || x | Optional: {} <br />Pattern: `cortex|datadog|dql|dynatrace|prometheus|thanos` <br /> |
| `targetServer` _string_ | TargetServer defines URL (including port and protocol) at which the metrics provider is reachable. || x | |
| `secretKeyRef` _[SecretKeySelector](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#secretkeyselector-v1-core)_ | SecretKeyRef defines an optional secret for access credentials to the metrics provider. || ✓ | Optional: {} <br /> |
| `insecureSkipTlsVerify` _boolean_ | InsecureSkipTlsVerify skips verification of the tls certificate |false| ✓ | |


#### ObjectReference
Expand Down
4 changes: 4 additions & 0 deletions metrics-operator/api/v1/keptnmetricsprovider_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@ type KeptnMetricsProviderSpec struct {
// SecretKeyRef defines an optional secret for access credentials to the metrics provider.
// +optional
SecretKeyRef corev1.SecretKeySelector `json:"secretKeyRef,omitempty"`
// InsecureSkipTlsVerify skips verification of the tls certificate
odubajDT marked this conversation as resolved.
Show resolved Hide resolved
// +kubebuilder:default:=false
// +optional
InsecureSkipTlsVerify bool `json:"insecureSkipTlsVerify,omitempty"`
}

// +kubebuilder:object:root=true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ spec:
spec:
description: KeptnMetricsProviderSpec defines the desired state of KeptnMetricsProvider
properties:
insecureSkipTlsVerify:
default: false
description: InsecureSkipTlsVerify skips verification of the tls certificate
type: boolean
secretKeyRef:
description: SecretKeyRef defines an optional secret for access credentials
to the metrics provider.
Expand Down
19 changes: 10 additions & 9 deletions metrics-operator/controllers/analysis/fake/evaluator_mock.go

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

Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (

//go:generate moq -pkg fake -skip-ensure -out ./fake/evaluator_mock.go . IObjectivesEvaluator
type IObjectivesEvaluator interface {
Evaluate(ctx context.Context, providerType string, obj chan metricstypes.ProviderRequest)
Evaluate(ctx context.Context, metricsProvider *metricsapi.KeptnMetricsProvider, obj chan metricstypes.ProviderRequest)
}

type ObjectivesEvaluator struct {
Expand All @@ -23,8 +23,8 @@ type ObjectivesEvaluator struct {
cancel context.CancelFunc
}

func (oe ObjectivesEvaluator) Evaluate(ctx context.Context, providerType string, obj chan metricstypes.ProviderRequest) {
provider, err := oe.ProviderFactory(providerType, oe.log, oe.Client)
func (oe ObjectivesEvaluator) Evaluate(ctx context.Context, metricsProvider *metricsapi.KeptnMetricsProvider, obj chan metricstypes.ProviderRequest) {
provider, err := oe.ProviderFactory(metricsProvider, oe.log, oe.Client)
if err != nil {
oe.log.Error(err, "Failed to get the correct Provider")
oe.cancel()
Expand All @@ -44,7 +44,7 @@ func (oe ObjectivesEvaluator) Evaluate(ctx context.Context, providerType string,
Value: value,
ErrMsg: strErr,
}
oe.log.Info("provider", "id:", providerType, "finished job:", o.Objective.AnalysisValueTemplateRef.Name, "result:", result)
oe.log.Info("provider", "id:", metricsProvider.Spec.Type, "finished job:", o.Objective.AnalysisValueTemplateRef.Name, "result:", result)
oe.results <- result
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,13 @@ func TestEvaluate(t *testing.T) {
// Define test cases
testCases := []struct {
name string
providerType string
mockProvider providers.KeptnSLIProvider
providerRequest metricstypes.ProviderRequest
expectedResult metricsapi.ProviderResult
expectedError string
}{
{
name: "SuccessfulEvaluation",
providerType: "mockProvider",
name: "SuccessfulEvaluation",
mockProvider: &fake2.KeptnSLIProviderMock{
FetchAnalysisValueFunc: func(ctx context.Context, query string, spec metricsapi.Analysis, provider *metricsapi.KeptnMetricsProvider) (string, error) {
return "10", nil
Expand Down Expand Up @@ -56,8 +54,7 @@ func TestEvaluate(t *testing.T) {
expectedError: "",
},
{
name: "FailedEvaluation",
providerType: "mockProvider",
name: "FailedEvaluation",
mockProvider: &fake2.KeptnSLIProviderMock{
FetchAnalysisValueFunc: func(ctx context.Context, query string, spec metricsapi.Analysis, provider *metricsapi.KeptnMetricsProvider) (string, error) {
return "", fmt.Errorf("something bad")
Expand Down Expand Up @@ -88,7 +85,7 @@ func TestEvaluate(t *testing.T) {

for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
mockProviderFactory := func(providerType string, log logr.Logger, client client.Client) (providers.KeptnSLIProvider, error) {
mockProviderFactory := func(metricsProvider *metricsapi.KeptnMetricsProvider, log logr.Logger, client client.Client) (providers.KeptnSLIProvider, error) {
// Define your mock provider implementation
return tc.mockProvider, nil
}
Expand All @@ -115,7 +112,7 @@ func TestEvaluate(t *testing.T) {
objChan <- tc.providerRequest
close(objChan)
}()
objectivesEvaluator.Evaluate(ctx, tc.providerType, objChan)
objectivesEvaluator.Evaluate(ctx, tc.providerRequest.Provider, objChan)
close(objectivesEvaluator.results)
result := <-objectivesEvaluator.results

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,12 @@ func (ps ProvidersPool) StartProviders(ctx context.Context, numJobs int) {
for _, provider := range providers.SupportedProviders {
channel := make(chan metricstypes.ProviderRequest, numJobs)
ps.providers[provider] = channel
go ps.Evaluate(ctx, provider, channel)
metricsProvider := &metricsapi.KeptnMetricsProvider{
Spec: metricsapi.KeptnMetricsProviderSpec{
Type: provider,
},
}
go ps.Evaluate(ctx, metricsProvider, channel)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,7 @@ func TestProvidersPool_StartProviders(t *testing.T) {
resChan := make(chan metricsapi.ProviderResult)
// Create a mock IObjectivesEvaluator, Client, and Logger for testing
mockEvaluator := &fake.IObjectivesEvaluatorMock{
EvaluateFunc: func(ctx context.Context, providerType string, obj chan metricstypes.ProviderRequest) {
EvaluateFunc: func(ctx context.Context, metricsProvider *metricsapi.KeptnMetricsProvider, obj chan metricstypes.ProviderRequest) {
},
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package dynatrace

import (
"context"
"crypto/tls"
"encoding/json"
"fmt"
"net/http"
Expand All @@ -27,8 +28,9 @@ type keptnDynatraceDQLProvider struct {
log logr.Logger
k8sClient client.Client

dtClient dtclient.DTAPIClient
clock clock.Clock
dtClient dtclient.DTAPIClient
clock clock.Clock
insecureSkipTlsVerify bool
}

type DynatraceDQLHandler struct {
Expand Down Expand Up @@ -118,6 +120,12 @@ func WithLogger(logger logr.Logger) KeptnDynatraceDQLProviderOption {
}
}

func WithInsecureSkipTlsVerify(skipCert bool) KeptnDynatraceDQLProviderOption {
return func(provider *keptnDynatraceDQLProvider) {
provider.insecureSkipTlsVerify = skipCert
}
}

// NewKeptnDynatraceDQLProvider creates and returns a new KeptnDynatraceDQLProvider
func NewKeptnDynatraceDQLProvider(k8sClient client.Client, opts ...KeptnDynatraceDQLProviderOption) *keptnDynatraceDQLProvider {
provider := &keptnDynatraceDQLProvider{
Expand Down Expand Up @@ -265,7 +273,15 @@ func (d *keptnDynatraceDQLProvider) ensureDTClientIsSetUp(ctx context.Context, p
if err != nil {
return err
}
d.dtClient = dtclient.NewAPIClient(*config, dtclient.WithLogger(d.log))
d.dtClient = dtclient.NewAPIClient(*config, dtclient.WithLogger(d.log), dtclient.WithHTTPClient(
http.Client{
Transport: &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: d.insecureSkipTlsVerify,
},
},
},
))
}
return nil
}
Expand Down
34 changes: 24 additions & 10 deletions metrics-operator/controllers/common/providers/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package providers

import (
"context"
"crypto/tls"
"fmt"
"net/http"
"strings"
Expand All @@ -23,32 +24,45 @@ type KeptnSLIProvider interface {
FetchAnalysisValue(ctx context.Context, query string, spec metricsapi.Analysis, provider *metricsapi.KeptnMetricsProvider) (string, error)
}

type ProviderFactory func(providerType string, log logr.Logger, k8sClient client.Client) (KeptnSLIProvider, error)
type ProviderFactory func(provider *metricsapi.KeptnMetricsProvider, log logr.Logger, k8sClient client.Client) (KeptnSLIProvider, error)

// NewProvider is a factory method that chooses the right implementation of KeptnSLIProvider
func NewProvider(providerType string, log logr.Logger, k8sClient client.Client) (KeptnSLIProvider, error) {
func NewProvider(provider *metricsapi.KeptnMetricsProvider, log logr.Logger, k8sClient client.Client) (KeptnSLIProvider, error) {

switch strings.ToLower(providerType) {
switch strings.ToLower(provider.Spec.Type) {
case PrometheusProviderType, ThanosProviderType, CortexProviderType:
return prometheus.NewPrometheusProvider(log, k8sClient), nil
case DynatraceProviderType:
return &dynatrace.KeptnDynatraceProvider{
HttpClient: http.Client{},
Log: log,
K8sClient: k8sClient,
HttpClient: http.Client{
Transport: &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: provider.Spec.InsecureSkipTlsVerify,
},
},
},
Log: log,
K8sClient: k8sClient,
}, nil
case DynatraceDQLProviderType:
return dynatrace.NewKeptnDynatraceDQLProvider(
k8sClient,
dynatrace.WithLogger(log),
dynatrace.WithInsecureSkipTlsVerify(provider.Spec.InsecureSkipTlsVerify),
), nil
case DataDogProviderType:
return &datadog.KeptnDataDogProvider{
Log: log,
HttpClient: http.Client{},
K8sClient: k8sClient,
Log: log,
HttpClient: http.Client{
Transport: &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: provider.Spec.InsecureSkipTlsVerify,
},
},
},
K8sClient: k8sClient,
}, nil
default:
return nil, fmt.Errorf("provider %s not supported", providerType)
return nil, fmt.Errorf("provider %s not supported", provider.Spec.Type)
}
}
Loading
Loading