@@ -10,6 +10,11 @@ import (
1010 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1111)
1212
13+ const (
14+ managedByKubernetesLabelKey = "app.kubernetes.io/managed-by"
15+ managedByKubernetesLabelValue = "eksctl"
16+ )
17+
1318// NewServiceAccount creates a corev1.ServiceAccount object using the provided meta.
1419func NewServiceAccount (meta metav1.ObjectMeta ) * corev1.ServiceAccount {
1520 return & corev1.ServiceAccount {
@@ -21,18 +26,25 @@ func NewServiceAccount(meta metav1.ObjectMeta) *corev1.ServiceAccount {
2126 }
2227}
2328
24- // CheckServiceAccountExists check if a serviceaccount with a given name already exists, and
25- // returns boolean or an error
26- func CheckServiceAccountExists (clientSet Interface , meta metav1.ObjectMeta ) (bool , error ) {
29+ // CheckServiceAccountExists check if a serviceaccount with a given name already exists,
30+ // and if it is managed by eksctl
31+ func CheckServiceAccountExists (clientSet Interface , meta metav1.ObjectMeta ) (bool , bool , error ) {
2732 name := meta .Namespace + "/" + meta .Name
28- _ , err := clientSet .CoreV1 ().ServiceAccounts (meta .Namespace ).Get (context .TODO (), meta .Name , metav1.GetOptions {})
29- if err == nil {
30- return true , nil
33+ sa , err := clientSet .CoreV1 ().ServiceAccounts (meta .Namespace ).Get (context .TODO (), meta .Name , metav1.GetOptions {})
34+ if err != nil {
35+ if ! apierrors .IsNotFound (err ) {
36+ return false , false , errors .Wrapf (err , "checking whether serviceaccount %q exists" , name )
37+ }
38+ return false , false , nil
3139 }
32- if ! apierrors .IsNotFound (err ) {
33- return false , errors .Wrapf (err , "checking whether serviceaccount %q exists" , name )
40+
41+ if sa .Labels != nil {
42+ if value , ok := sa .Labels [managedByKubernetesLabelKey ]; ok && (value == managedByKubernetesLabelValue ) {
43+ return true , true , nil
44+ }
3445 }
35- return false , nil
46+
47+ return true , false , nil
3648}
3749
3850// MaybeCreateServiceAccountOrUpdateMetadata will only create serviceaccount with the given name if
@@ -41,11 +53,14 @@ func CheckServiceAccountExists(clientSet Interface, meta metav1.ObjectMeta) (boo
4153// meta will be retained
4254func MaybeCreateServiceAccountOrUpdateMetadata (clientSet Interface , meta metav1.ObjectMeta ) error {
4355 name := meta .Namespace + "/" + meta .Name
44-
56+ if meta .Labels == nil {
57+ meta .Labels = make (map [string ]string )
58+ }
59+ meta .Labels [managedByKubernetesLabelKey ] = managedByKubernetesLabelValue
4560 if err := MaybeCreateNamespace (clientSet , meta .Namespace ); err != nil {
4661 return err
4762 }
48- exists , err := CheckServiceAccountExists (clientSet , meta )
63+ exists , _ , err := CheckServiceAccountExists (clientSet , meta )
4964 if err != nil {
5065 return err
5166 }
@@ -100,14 +115,18 @@ func MaybeCreateServiceAccountOrUpdateMetadata(clientSet Interface, meta metav1.
100115// MaybeDeleteServiceAccount will only delete the serviceaccount if it exists
101116func MaybeDeleteServiceAccount (clientSet Interface , meta metav1.ObjectMeta ) error {
102117 name := meta .Namespace + "/" + meta .Name
103- exists , err := CheckServiceAccountExists (clientSet , meta )
118+ exists , isManagedByEksctl , err := CheckServiceAccountExists (clientSet , meta )
104119 if err != nil {
105120 return err
106121 }
107122 if ! exists {
108123 logger .Info ("serviceaccount %q was already deleted" , name )
109124 return nil
110125 }
126+ if ! isManagedByEksctl {
127+ logger .Info ("serviceaccount %q was not created by eksctl; will not be deleted" , name )
128+ return nil
129+ }
111130 err = clientSet .CoreV1 ().ServiceAccounts (meta .Namespace ).Delete (context .TODO (), meta .Name , metav1.DeleteOptions {})
112131 if err != nil {
113132 return err
0 commit comments