Skip to content

Commit

Permalink
PC-13028 Support direct in AzurePrometheus
Browse files Browse the repository at this point in the history
  • Loading branch information
dawidwisn committed Jun 7, 2024
1 parent a766875 commit 5cfb63b
Show file tree
Hide file tree
Showing 3 changed files with 112 additions and 0 deletions.
12 changes: 12 additions & 0 deletions manifest/v1alpha/direct/direct.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ type Spec struct {
AzureMonitor *AzureMonitorConfig `json:"azureMonitor,omitempty"`
Honeycomb *HoneycombConfig `json:"honeycomb,omitempty"`
LogicMonitor *LogicMonitorConfig `json:"logicMonitor,omitempty"`
AzurePrometheus *AzurePrometheusConfig `json:"azurePrometheus,omitempty"`
HistoricalDataRetrieval *v1alpha.HistoricalDataRetrieval `json:"historicalDataRetrieval,omitempty"`
QueryDelay *v1alpha.QueryDelay `json:"queryDelay,omitempty"`
// Interval, Timeout and Jitter are readonly and cannot be set via API
Expand Down Expand Up @@ -93,6 +94,7 @@ var validDirectTypes = map[v1alpha.DataSourceType]struct{}{
v1alpha.AzureMonitor: {},
v1alpha.Honeycomb: {},
v1alpha.LogicMonitor: {},
v1alpha.AzurePrometheus: {},
}

func IsValidDirectType(directType v1alpha.DataSourceType) bool {
Expand Down Expand Up @@ -140,6 +142,8 @@ func (spec Spec) GetType() (v1alpha.DataSourceType, error) {
return v1alpha.Honeycomb, nil
case spec.LogicMonitor != nil:
return v1alpha.LogicMonitor, nil
case spec.AzurePrometheus != nil:
return v1alpha.AzurePrometheus, nil
}
return 0, errors.New("BUG: unknown direct type")
}
Expand Down Expand Up @@ -268,3 +272,11 @@ type LogicMonitorConfig struct {
AccessID string `json:"accessId"`
AccessKey string `json:"accessKey"`
}

// AzurePrometheusConfig represents content of Azure Monitor managed service for Prometheus typical for Direct Object.
type AzurePrometheusConfig struct {
URL string `json:"url"`
TenantID string `json:"tenantId"`
ClientID string `json:"clientId"`
ClientSecret string `json:"clientSecret"`
}
23 changes: 23 additions & 0 deletions manifest/v1alpha/direct/validation.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,9 @@ var specValidation = validation.New[Spec](
validation.ForPointer(func(s Spec) *LogicMonitorConfig { return s.LogicMonitor }).
WithName("logicMonitor").
Include(logicMonitorValidation),
validation.ForPointer(func(s Spec) *AzurePrometheusConfig { return s.AzurePrometheus }).
WithName("azurePrometheus").
Include(azurePrometheusValidation),
)

var (
Expand Down Expand Up @@ -214,6 +217,21 @@ var (
Required().
Rules(validation.StringNotEmpty()),
)
azurePrometheusValidation = validation.New[AzurePrometheusConfig](
urlPropertyRules(func(s AzurePrometheusConfig) string { return s.URL }),
validation.For(func(a AzurePrometheusConfig) string { return a.TenantID }).
WithName("tenantId").
Required().
Rules(validation.StringUUID()),
validation.For(func(l AzurePrometheusConfig) string { return l.ClientID }).
WithName("clientId").
Required().
Rules(validation.StringNotEmpty()),
validation.For(func(l AzurePrometheusConfig) string { return l.ClientSecret }).
WithName("clientSecret").
Required().
Rules(validation.StringNotEmpty()),
)
)

const (
Expand Down Expand Up @@ -329,6 +347,11 @@ var exactlyOneDataSourceTypeValidationRule = validation.NewSingleRule(func(spec
return err
}
}
if spec.AzurePrometheus != nil {
if err := typesMatch(v1alpha.AzurePrometheus); err != nil {
return err
}
}
if onlyType == 0 {
return errors.New("must have exactly one data source type, none were provided")
}
Expand Down
77 changes: 77 additions & 0 deletions manifest/v1alpha/direct/validation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -943,6 +943,75 @@ func TestValidateSpec_LogicMonitor(t *testing.T) {
})
}

func TestValidateSpec_AzurePrometheus(t *testing.T) {
t.Run("passes", func(t *testing.T) {
direct := validDirect(v1alpha.AzurePrometheus)
err := validate(direct)
testutils.AssertNoError(t, direct, err)
})
t.Run("invalid tenantId", func(t *testing.T) {
direct := validDirect(v1alpha.AzurePrometheus)
direct.Spec.AzurePrometheus.TenantID = "invalid"
err := validate(direct)
testutils.AssertContainsErrors(t, direct, err, 1, testutils.ExpectedError{
Prop: "spec.azurePrometheus.tenantId",
Code: validation.ErrorCodeStringUUID,
})
})
t.Run("required fields", func(t *testing.T) {
direct := validDirect(v1alpha.AzurePrometheus)
direct.Spec.AzurePrometheus.URL = ""
direct.Spec.AzurePrometheus.TenantID = ""
direct.Spec.AzurePrometheus.ClientID = ""
direct.Spec.AzurePrometheus.ClientSecret = ""
err := validate(direct)
testutils.AssertContainsErrors(t, direct, err, 4,
testutils.ExpectedError{
Prop: "spec.azurePrometheus.url",
Code: validation.ErrorCodeRequired,
},
testutils.ExpectedError{
Prop: "spec.azurePrometheus.tenantId",
Code: validation.ErrorCodeRequired,
},
testutils.ExpectedError{
Prop: "spec.azurePrometheus.clientId",
Code: validation.ErrorCodeRequired,
},
testutils.ExpectedError{
Prop: "spec.azurePrometheus.clientSecret",
Code: validation.ErrorCodeRequired,
},
)
})
t.Run("invalid fields", func(t *testing.T) {
direct := validDirect(v1alpha.AzurePrometheus)
direct.Spec.AzurePrometheus.URL = "invalid"
direct.Spec.AzurePrometheus.TenantID = strings.Repeat("l", 256)
err := validate(direct)
testutils.AssertContainsErrors(t, direct, err, 2,
testutils.ExpectedError{
Prop: "spec.azurePrometheus.url",
Code: validation.ErrorCodeURL,
},
testutils.ExpectedError{
Prop: "spec.azurePrometheus.tenantId",
Code: validation.ErrorCodeStringUUID,
},
)
})

t.Run("url must be https", func(t *testing.T) {
direct := validDirect(v1alpha.AzurePrometheus)
direct.Spec.AzurePrometheus.URL = "http://nobl9.com"
err := validate(direct)
testutils.AssertContainsErrors(t, direct, err, 1, testutils.ExpectedError{
Prop: "spec.azurePrometheus.url",
Code: errorCodeHTTPSSchemeRequired,
})
})
}

func validDirect(typ v1alpha.DataSourceType) Direct {
spec := validDirectSpec(typ)
spec.Description = fmt.Sprintf("Example %s direct", typ)
Expand Down Expand Up @@ -1070,6 +1139,14 @@ func validDirectSpec(typ v1alpha.DataSourceType) Spec {
AccessKey: "secret",
},
},
v1alpha.AzurePrometheus: {
AzurePrometheus: &AzurePrometheusConfig{
URL: "https://prometheus-service.monitoring:8080",
TenantID: "abf988bf-86f1-41af-91ab-2d7cd011db46",
ClientID: "secret",
ClientSecret: "secret",
},
},
}

return specs[typ]
Expand Down

0 comments on commit 5cfb63b

Please sign in to comment.