Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
67 changes: 50 additions & 17 deletions api/operator/v1beta1/vmprobe_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,14 +66,20 @@ func (cr *VMProbeSpec) UnmarshalJSON(src []byte) error {
// +k8s:openapi-gen=true
type VMProbeTargets struct {
// StaticConfig defines static targets which are considers for probing.
StaticConfig *VMProbeTargetStaticConfig `json:"staticConfig,omitempty"`
// Ingress defines the set of dynamically discovered ingress objects which hosts are considered for probing.
Ingress *ProbeTargetIngress `json:"ingress,omitempty"`
// Deprecated: use static instead
StaticConfig *VMProbeTargetStatic `json:"staticConfig,omitempty"`
// Static defines static targets which are considers for probing.
Static *VMProbeTargetStatic `json:"static,omitempty"`
// Kubernetes defines kubernetes targets, which are considered for probing.
Kubernetes []*VMProbeTargetKubernetes `json:"kubernetes,omitempty"`
// Ingress defines the set of dynamically discovered Ingress objects which hosts are considered for probing.
// Deprecated: use kubernetes instead
Ingress *VMProbeTargetKubernetes `json:"ingress,omitempty"`
}

// VMProbeTargetStaticConfig defines the set of static targets considered for probing.
// VMProbeTargetStatic defines the set of static targets considered for probing.
// +k8s:openapi-gen=true
type VMProbeTargetStaticConfig struct {
type VMProbeTargetStatic struct {
// Targets is a list of URLs to probe using the configured prober.
Targets []string `json:"targets"`
// Labels assigned to all metrics scraped from the targets.
Expand All @@ -82,17 +88,33 @@ type VMProbeTargetStaticConfig struct {
RelabelConfigs []*RelabelConfig `json:"relabelingConfigs,omitempty"`
}

// ProbeTargetIngress defines the set of Ingress objects considered for probing.
// VMProbeTargetKubernetes defines the set of k8s objects considered for probing.
// +k8s:openapi-gen=true
type ProbeTargetIngress struct {
// Select Ingress objects by labels.
type VMProbeTargetKubernetes struct {
// Role defines k8s role name
// +kubebuilder:validation:Enum=service;ingress;pod;node
Role string `json:"role,omitempty"`
// Select k8s objects by labels.
Selector metav1.LabelSelector `json:"selector,omitempty"`
// Select Ingress objects by namespace.
// Select k8s objects by namespace.
NamespaceSelector NamespaceSelector `json:"namespaceSelector,omitempty"`
// RelabelConfigs to apply to samples during service discovery.
RelabelConfigs []*RelabelConfig `json:"relabelingConfigs,omitempty"`
}

func (t *VMProbeTargetKubernetes) validate(prefix string) error {
if t == nil {
return nil
}
if _, err := metav1.LabelSelectorAsSelector(&t.Selector); err != nil {
return fmt.Errorf("invalid %s.selector: %w", prefix, err)
}
if err := checkRelabelConfigs(t.RelabelConfigs); err != nil {
return fmt.Errorf("invalid %s.relabelingConfigs: %w", prefix, err)
}
return nil
}

// VMProberSpec contains specification parameters for the Prober used for probing.
// +k8s:openapi-gen=true
type VMProberSpec struct {
Expand Down Expand Up @@ -154,17 +176,28 @@ func (cr *VMProbe) Validate() error {
if err := checkRelabelConfigs(cr.Spec.MetricRelabelConfigs); err != nil {
return fmt.Errorf("invalid metricRelabelConfigs: %w", err)
}
switch {
case cr.Spec.Targets.Ingress != nil:
if _, err := metav1.LabelSelectorAsSelector(&cr.Spec.Targets.Ingress.Selector); err != nil {
return fmt.Errorf("invalid spec.targets.ingress.selector syntax: %w", err)
for i, t := range cr.Spec.Targets.Kubernetes {
if len(t.Role) == 0 {
return fmt.Errorf("spec.targets.kubernetes[%d].role is required", i)
}
if err := checkRelabelConfigs(cr.Spec.Targets.Ingress.RelabelConfigs); err != nil {
return fmt.Errorf("invalid ingress.relabelingConfigs: %w", err)
if err := t.validate(fmt.Sprintf("spec.targets.kubernetes[%d]", i)); err != nil {
return err
}
case cr.Spec.Targets.StaticConfig != nil:
}
if err := cr.Spec.Targets.Ingress.validate("spec.targets.ingress"); err != nil {
return err
}
if cr.Spec.Targets.StaticConfig != nil && cr.Spec.Targets.Static != nil {
return fmt.Errorf("both spec.targets.staticConfig and spec.targets.static are set, which is not allowed. Use spec.targets.static")
}
if cr.Spec.Targets.StaticConfig != nil {
if err := checkRelabelConfigs(cr.Spec.Targets.StaticConfig.RelabelConfigs); err != nil {
return fmt.Errorf("invalid staticConfig.relabelingConfigs: %w", err)
return fmt.Errorf("invalid spec.targets.staticConfig.relabelingConfigs: %w", err)
}
}
if cr.Spec.Targets.Static != nil {
if err := checkRelabelConfigs(cr.Spec.Targets.Static.RelabelConfigs); err != nil {
return fmt.Errorf("invalid spec.targets.static.relabelingConfigs: %w", err)
}
}
return nil
Expand Down
84 changes: 50 additions & 34 deletions api/operator/v1beta1/zz_generated.deepcopy.go

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

Loading