Skip to content

Commit

Permalink
feat(metrics-operator): introduce insecureSkipTlsVerify parameter (#3711
Browse files Browse the repository at this point in the history
)

Signed-off-by: odubajDT <ondrej.dubaj@dynatrace.com>
  • Loading branch information
odubajDT committed Aug 27, 2024
1 parent df11440 commit c51c5e4
Show file tree
Hide file tree
Showing 20 changed files with 185 additions and 78 deletions.
5 changes: 5 additions & 0 deletions .github/scripts/.helm-tests/Openshift/result.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13587,6 +13587,11 @@ spec:
spec:
description: KeptnMetricsProviderSpec defines the desired state of KeptnMetricsProvider
properties:
insecureSkipTlsVerify:
default: false
description: InsecureSkipTlsVerify skips verification of the tls certificate
when fetching metrics
type: boolean
secretKeyRef:
description: SecretKeyRef defines an optional secret for access credentials
to the metrics provider.
Expand Down
5 changes: 5 additions & 0 deletions .github/scripts/.helm-tests/default/result.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13587,6 +13587,11 @@ spec:
spec:
description: KeptnMetricsProviderSpec defines the desired state of KeptnMetricsProvider
properties:
insecureSkipTlsVerify:
default: false
description: InsecureSkipTlsVerify skips verification of the tls certificate
when fetching metrics
type: boolean
secretKeyRef:
description: SecretKeyRef defines an optional secret for access credentials
to the metrics provider.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13723,6 +13723,11 @@ spec:
spec:
description: KeptnMetricsProviderSpec defines the desired state of KeptnMetricsProvider
properties:
insecureSkipTlsVerify:
default: false
description: InsecureSkipTlsVerify skips verification of the tls certificate
when fetching metrics
type: boolean
secretKeyRef:
description: SecretKeyRef defines an optional secret for access credentials
to the metrics provider.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2562,6 +2562,11 @@ spec:
spec:
description: KeptnMetricsProviderSpec defines the desired state of KeptnMetricsProvider
properties:
insecureSkipTlsVerify:
default: false
description: InsecureSkipTlsVerify skips verification of the tls certificate
when fetching metrics
type: boolean
secretKeyRef:
description: SecretKeyRef defines an optional secret for access credentials
to the metrics provider.
Expand Down
5 changes: 5 additions & 0 deletions .github/scripts/.helm-tests/metrics-only/result.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2562,6 +2562,11 @@ spec:
spec:
description: KeptnMetricsProviderSpec defines the desired state of KeptnMetricsProvider
properties:
insecureSkipTlsVerify:
default: false
description: InsecureSkipTlsVerify skips verification of the tls certificate
when fetching metrics
type: boolean
secretKeyRef:
description: SecretKeyRef defines an optional secret for access credentials
to the metrics provider.
Expand Down
5 changes: 5 additions & 0 deletions .github/scripts/.helm-tests/metrics-with-certs/result.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2577,6 +2577,11 @@ spec:
spec:
description: KeptnMetricsProviderSpec defines the desired state of KeptnMetricsProvider
properties:
insecureSkipTlsVerify:
default: false
description: InsecureSkipTlsVerify skips verification of the tls certificate
when fetching metrics
type: boolean
secretKeyRef:
description: SecretKeyRef defines an optional secret for access credentials
to the metrics provider.
Expand Down
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 when fetching metrics |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 when fetching metrics
// +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 @@ -50,6 +50,11 @@ spec:
spec:
description: KeptnMetricsProviderSpec defines the desired state of KeptnMetricsProvider
properties:
insecureSkipTlsVerify:
default: false
description: InsecureSkipTlsVerify skips verification of the tls certificate
when fetching metrics
type: boolean
secretKeyRef:
description: SecretKeyRef defines an optional secret for access credentials
to the metrics provider.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@ spec:
spec:
description: KeptnMetricsProviderSpec defines the desired state of KeptnMetricsProvider
properties:
insecureSkipTlsVerify:
default: false
description: InsecureSkipTlsVerify skips verification of the tls certificate
when fetching metrics
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.

8 changes: 4 additions & 4 deletions metrics-operator/controllers/analysis/objectives_evaluator.go
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
7 changes: 6 additions & 1 deletion metrics-operator/controllers/analysis/provider_selector.go
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
Loading

0 comments on commit c51c5e4

Please sign in to comment.