internal/resource/persistentvolumeclaim.go (92 lines of code) (raw):

package resource import ( "context" "errors" "fmt" . "git.jetbrains.team/tch/teamcity-operator/api/v1beta1" "git.jetbrains.team/tch/teamcity-operator/internal/metadata" v12 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" ) type PersistentVolumeClaimBuilder struct { *TeamCityResourceBuilder } func (builder *TeamCityResourceBuilder) PersistentVolumeClaim() *PersistentVolumeClaimBuilder { return &PersistentVolumeClaimBuilder{builder} } func (builder PersistentVolumeClaimBuilder) BuildObjectList() ([]client.Object, error) { var objectList []client.Object objectList = append(objectList, &v12.PersistentVolumeClaim{ ObjectMeta: metav1.ObjectMeta{Name: builder.Instance.Spec.DataDirVolumeClaim.Name, Namespace: builder.Instance.Namespace}, }) for _, pvc := range builder.Instance.Spec.PersistentVolumeClaims { objectList = append(objectList, &v12.PersistentVolumeClaim{ ObjectMeta: metav1.ObjectMeta{Name: pvc.Name, Namespace: builder.Instance.Namespace}, }) } return objectList, nil } func (builder PersistentVolumeClaimBuilder) Update(object client.Object) error { var idx int var pvcList []CustomPersistentVolumeClaim pvcList = append(pvcList, builder.Instance.Spec.DataDirVolumeClaim) pvcList = append(pvcList, builder.Instance.Spec.PersistentVolumeClaims...) if idx = builder.getPVCIndex(object, pvcList); idx == -1 { return fmt.Errorf("failed to update object: %w", errors.New("the specified PVC does not exist: "+object.GetName())) } desired := pvcList[idx] persistentVolumeClaim := object.(*v12.PersistentVolumeClaim) persistentVolumeClaim.Annotations = desired.Annotations persistentVolumeClaim.Labels = metadata.GetLabels(builder.Instance.Name, builder.Instance.Labels) persistentVolumeClaim.Spec.AccessModes = desired.Spec.AccessModes persistentVolumeClaim.Spec.Selector = desired.Spec.Selector persistentVolumeClaim.Spec.Resources = desired.Spec.Resources if len(persistentVolumeClaim.Spec.VolumeName) < 0 { persistentVolumeClaim.Spec.VolumeName = desired.Spec.VolumeName } if persistentVolumeClaim.Spec.StorageClassName == nil { persistentVolumeClaim.Spec.StorageClassName = desired.Spec.StorageClassName } if persistentVolumeClaim.Spec.VolumeMode == nil { persistentVolumeClaim.Spec.VolumeMode = desired.Spec.VolumeMode } if err := controllerutil.SetControllerReference(builder.Instance, persistentVolumeClaim, builder.Scheme); err != nil { return fmt.Errorf("failed setting controller reference: %w", err) } return nil } func (builder PersistentVolumeClaimBuilder) GetObsoleteObjects(ctx context.Context) ([]client.Object, error) { currentPVCList := &v12.PersistentVolumeClaimList{} var obsoleteObjects []client.Object var pvcList []CustomPersistentVolumeClaim listOptions := []client.ListOption{ client.InNamespace(builder.Instance.Namespace), client.MatchingLabels(metadata.GetLabels(builder.Instance.Name, builder.Instance.Labels)), } if err := builder.Client.List(ctx, currentPVCList, listOptions...); err != nil { return nil, err } pvcList = append(pvcList, builder.Instance.Spec.DataDirVolumeClaim) pvcList = append(pvcList, builder.Instance.Spec.PersistentVolumeClaims...) for _, pvc := range currentPVCList.Items { var idx int s := pvc if idx = builder.getPVCIndex(&pvc, pvcList); idx == -1 { obsoleteObjects = append(obsoleteObjects, &s) } } return obsoleteObjects, nil } func (builder PersistentVolumeClaimBuilder) UpdateMayRequireStsRecreate() bool { return false } func (builder PersistentVolumeClaimBuilder) getPVCIndex(object client.Object, pvcList []CustomPersistentVolumeClaim) int { for idx, pvc := range pvcList { if pvc.Name == object.GetName() { return idx } } return -1 }