pkg/kuberneteshelper/serviceaccount.go (43 lines of code) (raw):
package kuberneteshelper
import (
"context"
"fmt"
"time"
corev1 "k8s.io/api/core/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"sigs.k8s.io/controller-runtime/pkg/client"
"github.com/Azure/azure-workload-identity/pkg/webhook"
)
// Create ServiceAccount in the cluster
// If the ServiceAccount already exists, error is returned
func CreateOrUpdateServiceAccount(ctx context.Context, kubeClient client.Client, namespace, name, clientID, tenantID string, tokenExpiration time.Duration) error {
sa := &corev1.ServiceAccount{
ObjectMeta: metav1.ObjectMeta{
Name: name,
Namespace: namespace,
Annotations: map[string]string{
webhook.ClientIDAnnotation: clientID,
webhook.TenantIDAnnotation: tenantID,
},
},
}
if tokenExpiration != time.Duration(webhook.DefaultServiceAccountTokenExpiration)*time.Second {
// Round to the nearest second before converting to a string
sa.ObjectMeta.Annotations[webhook.ServiceAccountTokenExpiryAnnotation] = fmt.Sprintf("%.0f", tokenExpiration.Round(time.Second).Seconds())
}
err := kubeClient.Create(ctx, sa)
if apierrors.IsAlreadyExists(err) {
err = kubeClient.Update(ctx, sa)
}
return err
}
// Delete ServiceAccount in the cluster
func DeleteServiceAccount(ctx context.Context, kubeClient client.Client, namespace, name string) error {
sa := &corev1.ServiceAccount{}
if err := kubeClient.Get(ctx, client.ObjectKey{Name: name, Namespace: namespace}, sa); err != nil {
return err
}
return kubeClient.Delete(ctx, sa)
}
// Get ServiceAccount in the cluster
func GetServiceAccount(ctx context.Context, kubeClient client.Client, namespace, name string) (*corev1.ServiceAccount, error) {
sa := &corev1.ServiceAccount{}
err := kubeClient.Get(ctx, client.ObjectKey{Name: name, Namespace: namespace}, sa)
return sa, err
}