internal/resource/serviceaccount.go (62 lines of code) (raw):
package resource
import (
"context"
"fmt"
"git.jetbrains.team/tch/teamcity-operator/internal/metadata"
v1 "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 ServiceAccountBuilder struct {
*TeamCityResourceBuilder
}
func (builder *TeamCityResourceBuilder) ServiceAccount() *ServiceAccountBuilder {
return &ServiceAccountBuilder{builder}
}
func (builder ServiceAccountBuilder) BuildObjectList() ([]client.Object, error) {
objectList := []client.Object{}
if builder.Instance.ServiceAccountProvided() {
objectList = append(objectList, builder.getEmptyServiceAccount())
}
return objectList, nil
}
func (builder ServiceAccountBuilder) Update(object client.Object) error {
serviceAccount := object.(*v1.ServiceAccount)
expected := &builder.Instance.Spec.ServiceAccount
serviceAccount.Annotations = expected.Annotations
serviceAccount.Labels = metadata.GetLabels(builder.Instance.Name, builder.Instance.Labels)
if err := controllerutil.SetControllerReference(builder.Instance, serviceAccount, builder.Scheme); err != nil {
return fmt.Errorf("failed setting controller reference: %w", err)
}
return nil
}
func (builder ServiceAccountBuilder) GetObsoleteObjects(ctx context.Context) ([]client.Object, error) {
currentServiceAccountList := &v1.ServiceAccountList{}
obsoleteObjects := []client.Object{}
listOptions := []client.ListOption{
client.InNamespace(builder.Instance.Namespace),
client.MatchingLabels(metadata.GetLabels(builder.Instance.Name, builder.Instance.Labels)),
}
if err := builder.Client.List(ctx, currentServiceAccountList, listOptions...); err != nil {
return nil, err
}
for _, serviceAccount := range currentServiceAccountList.Items {
sa := serviceAccount
if !builder.Instance.ServiceAccountProvided() || sa.Name != builder.Instance.Spec.ServiceAccount.Name {
obsoleteObjects = append(obsoleteObjects, &sa)
}
}
return obsoleteObjects, nil
}
func (builder ServiceAccountBuilder) UpdateMayRequireStsRecreate() bool {
return false
}
func (builder ServiceAccountBuilder) getEmptyServiceAccount() *v1.ServiceAccount {
return &v1.ServiceAccount{
ObjectMeta: metav1.ObjectMeta{
Name: builder.Instance.Spec.ServiceAccount.Name,
Namespace: builder.Instance.Namespace,
},
}
}