mirror of
https://github.com/prometheus-operator/prometheus-operator.git
synced 2025-04-21 11:48:53 +00:00
types: use custom type for embedded persistent volume claims
This allows nested PersistentVolumeClaim fields to be validated and maintain metadata information such as labels and annotations. Signed-off-by: Paul Gier <pgier@redhat.com>
This commit is contained in:
parent
0c6d184c19
commit
01f49eb0a4
11 changed files with 105 additions and 47 deletions
pkg
alertmanager
apis/monitoring/v1
operator
prometheus
thanos
test/e2e
|
@ -137,8 +137,7 @@ func makeStatefulSet(am *monitoringv1.Alertmanager, old *appsv1.StatefulSet, con
|
|||
},
|
||||
})
|
||||
} else {
|
||||
pvcTemplate := storageSpec.VolumeClaimTemplate
|
||||
pvcTemplate.CreationTimestamp = metav1.Time{}
|
||||
pvcTemplate := operator.MakeVolumeClaimTemplate(storageSpec.VolumeClaimTemplate)
|
||||
if pvcTemplate.Name == "" {
|
||||
pvcTemplate.Name = volumeName(am.Name)
|
||||
}
|
||||
|
@ -149,7 +148,7 @@ func makeStatefulSet(am *monitoringv1.Alertmanager, old *appsv1.StatefulSet, con
|
|||
}
|
||||
pvcTemplate.Spec.Resources = storageSpec.VolumeClaimTemplate.Spec.Resources
|
||||
pvcTemplate.Spec.Selector = storageSpec.VolumeClaimTemplate.Spec.Selector
|
||||
statefulset.Spec.VolumeClaimTemplates = append(statefulset.Spec.VolumeClaimTemplates, pvcTemplate)
|
||||
statefulset.Spec.VolumeClaimTemplates = append(statefulset.Spec.VolumeClaimTemplates, *pvcTemplate)
|
||||
}
|
||||
|
||||
if old != nil {
|
||||
|
|
|
@ -114,7 +114,7 @@ func TestPodLabelsAnnotations(t *testing.T) {
|
|||
sset, err := makeStatefulSet(&monitoringv1.Alertmanager{
|
||||
ObjectMeta: metav1.ObjectMeta{},
|
||||
Spec: monitoringv1.AlertmanagerSpec{
|
||||
PodMetadata: &monitoringv1.PodMeta{
|
||||
PodMetadata: &monitoringv1.EmbeddedObjectMetadata{
|
||||
Annotations: annotations,
|
||||
Labels: labels,
|
||||
},
|
||||
|
@ -139,8 +139,8 @@ func TestStatefulSetPVC(t *testing.T) {
|
|||
|
||||
storageClass := "storageclass"
|
||||
|
||||
pvc := v1.PersistentVolumeClaim{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
pvc := monitoringv1.EmbeddedPersistentVolumeClaim{
|
||||
EmbeddedObjectMetadata: monitoringv1.EmbeddedObjectMetadata{
|
||||
Annotations: annotations,
|
||||
},
|
||||
Spec: v1.PersistentVolumeClaimSpec{
|
||||
|
|
|
@ -58,7 +58,7 @@ type ThanosRulerList struct {
|
|||
// +k8s:openapi-gen=true
|
||||
type ThanosRulerSpec struct {
|
||||
// PodMetadata contains Labels and Annotations gets propagated to the thanos ruler pods.
|
||||
PodMetadata *PodMeta `json:"podMetadata,omitempty"`
|
||||
PodMetadata *EmbeddedObjectMetadata `json:"podMetadata,omitempty"`
|
||||
// Thanos container image URL.
|
||||
Image string `json:"image,omitempty"`
|
||||
// An optional list of references to secrets in the same namespace
|
||||
|
|
|
@ -45,25 +45,6 @@ const (
|
|||
PrometheusRuleKindKey = "prometheusrule"
|
||||
)
|
||||
|
||||
// PodMeta is a subset of k8s.io/apimachinery/pkg/apis/meta/v1/ObjectMeta which only
|
||||
// includes fields applicable to the generated stateful set pod template of the
|
||||
// custom resource types.
|
||||
type PodMeta struct {
|
||||
// Map of string keys and values that can be used to organize and categorize
|
||||
// (scope and select) objects. May match selectors of replication controllers
|
||||
// and services.
|
||||
// More info: http://kubernetes.io/docs/user-guide/labels
|
||||
// +optional
|
||||
Labels map[string]string `json:"labels,omitempty" protobuf:"bytes,11,rep,name=labels"`
|
||||
|
||||
// Annotations is an unstructured key value map stored with a resource that may be
|
||||
// set by external tools to store and retrieve arbitrary metadata. They are not
|
||||
// queryable and should be preserved when modifying objects.
|
||||
// More info: http://kubernetes.io/docs/user-guide/annotations
|
||||
// +optional
|
||||
Annotations map[string]string `json:"annotations,omitempty" protobuf:"bytes,12,rep,name=annotations"`
|
||||
}
|
||||
|
||||
// Prometheus defines a Prometheus deployment.
|
||||
// +genclient
|
||||
// +k8s:openapi-gen=true
|
||||
|
@ -99,7 +80,7 @@ type PrometheusList struct {
|
|||
// +k8s:openapi-gen=true
|
||||
type PrometheusSpec struct {
|
||||
// PodMetadata configures Labels and Annotations which are propagated to the prometheus pods.
|
||||
PodMetadata *PodMeta `json:"podMetadata,omitempty"`
|
||||
PodMetadata *EmbeddedObjectMetadata `json:"podMetadata,omitempty"`
|
||||
// ServiceMonitors to be selected for target discovery. *Deprecated:* if
|
||||
// neither this nor podMonitorSelector are specified, configuration is
|
||||
// unmanaged.
|
||||
|
@ -386,7 +367,54 @@ type StorageSpec struct {
|
|||
// info: https://kubernetes.io/docs/concepts/storage/volumes/#emptydir
|
||||
EmptyDir *v1.EmptyDirVolumeSource `json:"emptyDir,omitempty"`
|
||||
// A PVC spec to be used by the Prometheus StatefulSets.
|
||||
VolumeClaimTemplate v1.PersistentVolumeClaim `json:"volumeClaimTemplate,omitempty"`
|
||||
VolumeClaimTemplate EmbeddedPersistentVolumeClaim `json:"volumeClaimTemplate,omitempty"`
|
||||
}
|
||||
|
||||
// EmbeddedPersistentVolumeClaim is an embedded version of k8s.io/api/core/v1.PersistentVolumeClaim.
|
||||
// It contains TypeMeta and a reduced ObjectMeta.
|
||||
type EmbeddedPersistentVolumeClaim struct {
|
||||
metav1.TypeMeta `json:",inline"`
|
||||
|
||||
// EmbeddedMetadata contains metadata relevant to an EmbeddedResource.
|
||||
EmbeddedObjectMetadata `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
|
||||
|
||||
// Spec defines the desired characteristics of a volume requested by a pod author.
|
||||
// More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims
|
||||
// +optional
|
||||
Spec v1.PersistentVolumeClaimSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"`
|
||||
|
||||
// Status represents the current information/status of a persistent volume claim.
|
||||
// Read-only.
|
||||
// More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims
|
||||
// +optional
|
||||
Status v1.PersistentVolumeClaimStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`
|
||||
}
|
||||
|
||||
// EmbeddedObjectMetadata contains a subset of the fields included in k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta
|
||||
// Only fields which are relevant to embedded resources are included.
|
||||
type EmbeddedObjectMetadata struct {
|
||||
// Name must be unique within a namespace. Is required when creating resources, although
|
||||
// some resources may allow a client to request the generation of an appropriate name
|
||||
// automatically. Name is primarily intended for creation idempotence and configuration
|
||||
// definition.
|
||||
// Cannot be updated.
|
||||
// More info: http://kubernetes.io/docs/user-guide/identifiers#names
|
||||
// +optional
|
||||
Name string `json:"name,omitempty" protobuf:"bytes,1,opt,name=name"`
|
||||
|
||||
// Map of string keys and values that can be used to organize and categorize
|
||||
// (scope and select) objects. May match selectors of replication controllers
|
||||
// and services.
|
||||
// More info: http://kubernetes.io/docs/user-guide/labels
|
||||
// +optional
|
||||
Labels map[string]string `json:"labels,omitempty" protobuf:"bytes,11,rep,name=labels"`
|
||||
|
||||
// Annotations is an unstructured key value map stored with a resource that may be
|
||||
// set by external tools to store and retrieve arbitrary metadata. They are not
|
||||
// queryable and should be preserved when modifying objects.
|
||||
// More info: http://kubernetes.io/docs/user-guide/annotations
|
||||
// +optional
|
||||
Annotations map[string]string `json:"annotations,omitempty" protobuf:"bytes,12,rep,name=annotations"`
|
||||
}
|
||||
|
||||
// QuerySpec defines the query command line flags when starting Prometheus.
|
||||
|
@ -916,7 +944,7 @@ type Alertmanager struct {
|
|||
// +k8s:openapi-gen=true
|
||||
type AlertmanagerSpec struct {
|
||||
// PodMetadata configures Labels and Annotations which are propagated to the alertmanager pods.
|
||||
PodMetadata *PodMeta `json:"podMetadata,omitempty"`
|
||||
PodMetadata *EmbeddedObjectMetadata `json:"podMetadata,omitempty"`
|
||||
// Image if specified has precedence over baseImage, tag and sha
|
||||
// combinations. Specifying the version is still necessary to ensure the
|
||||
// Prometheus Operator knows what version of Alertmanager is being
|
||||
|
|
39
pkg/operator/types.go
Normal file
39
pkg/operator/types.go
Normal file
|
@ -0,0 +1,39 @@
|
|||
// Copyright 2020 The prometheus-operator Authors
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package operator
|
||||
|
||||
import (
|
||||
monitoringv1 "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1"
|
||||
v1 "k8s.io/api/core/v1"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
)
|
||||
|
||||
func MakeVolumeClaimTemplate(e monitoringv1.EmbeddedPersistentVolumeClaim) *v1.PersistentVolumeClaim {
|
||||
pvc := v1.PersistentVolumeClaim{
|
||||
TypeMeta: metav1.TypeMeta{
|
||||
APIVersion: e.APIVersion,
|
||||
Kind: e.Kind,
|
||||
},
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: e.Name,
|
||||
Labels: e.Labels,
|
||||
Annotations: e.Annotations,
|
||||
CreationTimestamp: metav1.Time{},
|
||||
},
|
||||
Spec: e.Spec,
|
||||
Status: e.Status,
|
||||
}
|
||||
return &pvc
|
||||
}
|
|
@ -187,8 +187,7 @@ func makeStatefulSet(
|
|||
},
|
||||
})
|
||||
} else {
|
||||
pvcTemplate := storageSpec.VolumeClaimTemplate
|
||||
pvcTemplate.CreationTimestamp = metav1.Time{}
|
||||
pvcTemplate := operator.MakeVolumeClaimTemplate(storageSpec.VolumeClaimTemplate)
|
||||
if pvcTemplate.Name == "" {
|
||||
pvcTemplate.Name = volumeName(p.Name)
|
||||
}
|
||||
|
@ -199,7 +198,7 @@ func makeStatefulSet(
|
|||
}
|
||||
pvcTemplate.Spec.Resources = storageSpec.VolumeClaimTemplate.Spec.Resources
|
||||
pvcTemplate.Spec.Selector = storageSpec.VolumeClaimTemplate.Spec.Selector
|
||||
statefulset.Spec.VolumeClaimTemplates = append(statefulset.Spec.VolumeClaimTemplates, pvcTemplate)
|
||||
statefulset.Spec.VolumeClaimTemplates = append(statefulset.Spec.VolumeClaimTemplates, *pvcTemplate)
|
||||
}
|
||||
|
||||
for _, volume := range p.Spec.Volumes {
|
||||
|
|
|
@ -87,7 +87,7 @@ func TestPodLabelsAnnotations(t *testing.T) {
|
|||
sset, err := makeStatefulSet(monitoringv1.Prometheus{
|
||||
ObjectMeta: metav1.ObjectMeta{},
|
||||
Spec: monitoringv1.PrometheusSpec{
|
||||
PodMetadata: &monitoringv1.PodMeta{
|
||||
PodMetadata: &monitoringv1.EmbeddedObjectMetadata{
|
||||
Annotations: annotations,
|
||||
Labels: labels,
|
||||
},
|
||||
|
@ -112,8 +112,8 @@ func TestStatefulSetPVC(t *testing.T) {
|
|||
|
||||
storageClass := "storageclass"
|
||||
|
||||
pvc := v1.PersistentVolumeClaim{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
pvc := monitoringv1.EmbeddedPersistentVolumeClaim{
|
||||
EmbeddedObjectMetadata: monitoringv1.EmbeddedObjectMetadata{
|
||||
Annotations: annotations,
|
||||
},
|
||||
Spec: v1.PersistentVolumeClaimSpec{
|
||||
|
|
|
@ -128,8 +128,7 @@ func makeStatefulSet(tr *monitoringv1.ThanosRuler, config Config, ruleConfigMapN
|
|||
},
|
||||
})
|
||||
} else {
|
||||
pvcTemplate := storageSpec.VolumeClaimTemplate
|
||||
pvcTemplate.CreationTimestamp = metav1.Time{}
|
||||
pvcTemplate := operator.MakeVolumeClaimTemplate(storageSpec.VolumeClaimTemplate)
|
||||
if pvcTemplate.Name == "" {
|
||||
pvcTemplate.Name = volumeName(tr.Name)
|
||||
}
|
||||
|
@ -140,7 +139,7 @@ func makeStatefulSet(tr *monitoringv1.ThanosRuler, config Config, ruleConfigMapN
|
|||
}
|
||||
pvcTemplate.Spec.Resources = storageSpec.VolumeClaimTemplate.Spec.Resources
|
||||
pvcTemplate.Spec.Selector = storageSpec.VolumeClaimTemplate.Spec.Selector
|
||||
statefulset.Spec.VolumeClaimTemplates = append(statefulset.Spec.VolumeClaimTemplates, pvcTemplate)
|
||||
statefulset.Spec.VolumeClaimTemplates = append(statefulset.Spec.VolumeClaimTemplates, *pvcTemplate)
|
||||
}
|
||||
|
||||
for _, volume := range tr.Spec.Volumes {
|
||||
|
|
|
@ -90,7 +90,7 @@ func TestPodLabelsAnnotations(t *testing.T) {
|
|||
ObjectMeta: metav1.ObjectMeta{},
|
||||
Spec: monitoringv1.ThanosRulerSpec{
|
||||
QueryEndpoints: emptyQueryEndpoints,
|
||||
PodMetadata: &monitoringv1.PodMeta{
|
||||
PodMetadata: &monitoringv1.EmbeddedObjectMetadata{
|
||||
Annotations: annotations,
|
||||
Labels: labels,
|
||||
},
|
||||
|
|
|
@ -134,10 +134,7 @@ func testAMStorageUpdate(t *testing.T) {
|
|||
}
|
||||
|
||||
am.Spec.Storage = &monitoringv1.StorageSpec{
|
||||
VolumeClaimTemplate: v1.PersistentVolumeClaim{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
CreationTimestamp: metav1.Now(),
|
||||
},
|
||||
VolumeClaimTemplate: monitoringv1.EmbeddedPersistentVolumeClaim{
|
||||
Spec: v1.PersistentVolumeClaimSpec{
|
||||
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
|
||||
Resources: v1.ResourceRequirements{
|
||||
|
|
|
@ -227,10 +227,7 @@ func testPromStorageUpdate(t *testing.T) {
|
|||
}
|
||||
|
||||
p.Spec.Storage = &monitoringv1.StorageSpec{
|
||||
VolumeClaimTemplate: v1.PersistentVolumeClaim{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
CreationTimestamp: metav1.Now(),
|
||||
},
|
||||
VolumeClaimTemplate: monitoringv1.EmbeddedPersistentVolumeClaim{
|
||||
Spec: v1.PersistentVolumeClaimSpec{
|
||||
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
|
||||
Resources: v1.ResourceRequirements{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue