1
0
Fork 0
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:
Paul Gier 2020-04-02 15:21:48 -05:00
parent 0c6d184c19
commit 01f49eb0a4
11 changed files with 105 additions and 47 deletions

View file

@ -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 {

View file

@ -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{

View file

@ -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

View file

@ -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
View 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
}

View file

@ -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 {

View file

@ -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{

View file

@ -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 {

View file

@ -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,
},

View file

@ -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{

View file

@ -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{