Alerting: Use Unstructured type for settings of K8s model Integration + code owners (#91430)
* remove nonnamespaced paths * use common.Unstructed for Intergration.Settings * update codeowners to include alerting * fix json name of secure fields to start with lower case
This commit is contained in:
@@ -8,6 +8,7 @@ import (
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/types"
|
||||
|
||||
common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1"
|
||||
model "github.com/grafana/grafana/pkg/apis/alerting_notifications/v0alpha1"
|
||||
"github.com/grafana/grafana/pkg/services/apiserver/endpoints/request"
|
||||
"github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions"
|
||||
@@ -43,11 +44,16 @@ func convertToK8sResource(orgID int64, receiver definitions.GettableApiReceiver,
|
||||
return nil, fmt.Errorf("all integrations must have the same provenance")
|
||||
}
|
||||
provenance = integration.Provenance
|
||||
unstruct := common.Unstructured{}
|
||||
err := json.Unmarshal(integration.Settings, &unstruct)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("integration '%s' of receiver '%s' has settings that cannot be parsed as JSON: %w", integration.Type, receiver.Name, err)
|
||||
}
|
||||
spec.Integrations = append(spec.Integrations, model.Integration{
|
||||
Uid: &integration.UID,
|
||||
Type: integration.Type,
|
||||
DisableResolveMessage: &integration.DisableResolveMessage,
|
||||
Settings: json.RawMessage(integration.Settings),
|
||||
Settings: unstruct,
|
||||
SecureFields: integration.SecureFields,
|
||||
})
|
||||
}
|
||||
@@ -79,12 +85,16 @@ func convertToDomainModel(receiver *model.Receiver) (definitions.GettableApiRece
|
||||
}
|
||||
|
||||
for _, integration := range receiver.Spec.Integrations {
|
||||
data, err := integration.Settings.MarshalJSON()
|
||||
if err != nil {
|
||||
return definitions.GettableApiReceiver{}, fmt.Errorf("integration '%s' of receiver '%s' is invalid: failed to convert unstructured data to bytes: %w", integration.Type, receiver.Name, err)
|
||||
}
|
||||
grafanaIntegration := definitions.GettableGrafanaReceiver{
|
||||
Name: receiver.Spec.Title,
|
||||
Type: integration.Type,
|
||||
Settings: definitions.RawMessage(integration.Settings),
|
||||
Settings: definitions.RawMessage(data),
|
||||
SecureFields: integration.SecureFields,
|
||||
//Provenance: "", //TODO: Convert provenance?
|
||||
Provenance: definitions.Provenance(models.ProvenanceNone),
|
||||
}
|
||||
if integration.Uid != nil {
|
||||
grafanaIntegration.UID = *integration.Uid
|
||||
|
||||
@@ -13,6 +13,7 @@ import (
|
||||
"k8s.io/apiserver/pkg/registry/rest"
|
||||
genericapiserver "k8s.io/apiserver/pkg/server"
|
||||
"k8s.io/kube-openapi/pkg/common"
|
||||
"k8s.io/kube-openapi/pkg/spec3"
|
||||
|
||||
notificationsModels "github.com/grafana/grafana/pkg/apis/alerting_notifications/v0alpha1"
|
||||
grafanarest "github.com/grafana/grafana/pkg/apiserver/rest"
|
||||
@@ -55,11 +56,11 @@ func RegisterAPIService(
|
||||
return builder
|
||||
}
|
||||
|
||||
func (t NotificationsAPIBuilder) GetGroupVersion() schema.GroupVersion {
|
||||
func (t *NotificationsAPIBuilder) GetGroupVersion() schema.GroupVersion {
|
||||
return t.gv
|
||||
}
|
||||
|
||||
func (t NotificationsAPIBuilder) InstallSchema(scheme *runtime.Scheme) error {
|
||||
func (t *NotificationsAPIBuilder) InstallSchema(scheme *runtime.Scheme) error {
|
||||
err := notificationsModels.AddToScheme(scheme)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -67,7 +68,7 @@ func (t NotificationsAPIBuilder) InstallSchema(scheme *runtime.Scheme) error {
|
||||
return scheme.SetVersionPriority(notificationsModels.SchemeGroupVersion)
|
||||
}
|
||||
|
||||
func (t NotificationsAPIBuilder) GetAPIGroupInfo(
|
||||
func (t *NotificationsAPIBuilder) GetAPIGroupInfo(
|
||||
scheme *runtime.Scheme,
|
||||
codecs serializer.CodecFactory,
|
||||
optsGetter generic.RESTOptionsGetter,
|
||||
@@ -92,15 +93,35 @@ func (t NotificationsAPIBuilder) GetAPIGroupInfo(
|
||||
return &apiGroupInfo, nil
|
||||
}
|
||||
|
||||
func (t NotificationsAPIBuilder) GetOpenAPIDefinitions() common.GetOpenAPIDefinitions {
|
||||
func (t *NotificationsAPIBuilder) GetOpenAPIDefinitions() common.GetOpenAPIDefinitions {
|
||||
return notificationsModels.GetOpenAPIDefinitions
|
||||
}
|
||||
|
||||
func (t NotificationsAPIBuilder) GetAPIRoutes() *builder.APIRoutes {
|
||||
func (t *NotificationsAPIBuilder) GetAPIRoutes() *builder.APIRoutes {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t NotificationsAPIBuilder) GetAuthorizer() authorizer.Authorizer {
|
||||
// PostProcessOpenAPI is a hook to alter OpenAPI3 specification of the API server.
|
||||
func (t *NotificationsAPIBuilder) PostProcessOpenAPI(oas *spec3.OpenAPI) (*spec3.OpenAPI, error) {
|
||||
// The plugin description
|
||||
oas.Info.Description = "Grafana Alerting Notification resources"
|
||||
|
||||
// The root api URL
|
||||
root := "/apis/" + t.GetGroupVersion().String() + "/"
|
||||
|
||||
// Hide the ability to list or watch across all tenants
|
||||
delete(oas.Paths.Paths, root+notificationsModels.ReceiverResourceInfo.GroupResource().Resource)
|
||||
delete(oas.Paths.Paths, root+notificationsModels.TimeIntervalResourceInfo.GroupResource().Resource)
|
||||
|
||||
// The root API discovery list
|
||||
sub := oas.Paths.Paths[root]
|
||||
if sub != nil && sub.Get != nil {
|
||||
sub.Get.Tags = []string{"API Discovery"} // sorts first in the list
|
||||
}
|
||||
return oas, nil
|
||||
}
|
||||
|
||||
func (t *NotificationsAPIBuilder) GetAuthorizer() authorizer.Authorizer {
|
||||
return authorizer.AuthorizerFunc(
|
||||
func(ctx context.Context, a authorizer.Attributes) (authorizer.Decision, string, error) {
|
||||
switch a.GetResource() {
|
||||
|
||||
@@ -10,6 +10,7 @@ import (
|
||||
model "github.com/grafana/grafana/pkg/apis/alerting_notifications/v0alpha1"
|
||||
"github.com/grafana/grafana/pkg/services/apiserver/endpoints/request"
|
||||
"github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions"
|
||||
"github.com/grafana/grafana/pkg/services/ngalert/models"
|
||||
)
|
||||
|
||||
func convertToK8sResources(orgID int64, intervals []definitions.MuteTimeInterval, namespacer request.NamespaceMapper, selector fields.Selector) (*model.TimeIntervalList, error) {
|
||||
@@ -77,6 +78,7 @@ func convertToDomainModel(interval *model.TimeInterval) (definitions.MuteTimeInt
|
||||
}
|
||||
result.Version = interval.ResourceVersion
|
||||
result.UID = interval.ObjectMeta.Name
|
||||
result.Provenance = definitions.Provenance(models.ProvenanceNone)
|
||||
err = result.Validate()
|
||||
if err != nil {
|
||||
return definitions.MuteTimeInterval{}, err
|
||||
|
||||
Reference in New Issue
Block a user