|
8 | 8 |
|
9 | 9 | admissionv1 "k8s.io/api/admission/v1"
|
10 | 10 | metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
| 11 | + "k8s.io/apimachinery/pkg/labels" |
11 | 12 | "sigs.k8s.io/controller-runtime/pkg/client"
|
12 | 13 | cnsoperatorv1alpha1 "sigs.k8s.io/vsphere-csi-driver/v3/pkg/apis/cnsoperator"
|
13 | 14 |
|
@@ -42,6 +43,25 @@ func validateCreateCnsFileAccessConfig(ctx context.Context, clientConfig *rest.C
|
42 | 43 | }
|
43 | 44 | }
|
44 | 45 |
|
| 46 | + // This validation is not required for PVCSI service account. |
| 47 | + isPvCSIServiceAccount, err := validatePvCSIServiceAccount(req.UserInfo.Username) |
| 48 | + if err != nil { |
| 49 | + // return AdmissionResponse result |
| 50 | + return &admissionv1.AdmissionResponse{ |
| 51 | + Allowed: false, |
| 52 | + Result: &metav1.Status{ |
| 53 | + Message: fmt.Sprintf("failed to validate user information: %v", err), |
| 54 | + }, |
| 55 | + } |
| 56 | + } |
| 57 | + |
| 58 | + // If user is PVCSI service account, allow this request. |
| 59 | + if isPvCSIServiceAccount { |
| 60 | + return &admissionv1.AdmissionResponse{ |
| 61 | + Allowed: true, |
| 62 | + } |
| 63 | + } |
| 64 | + |
45 | 65 | vm := cnsFileAccessConfig.Spec.VMName
|
46 | 66 | pvc := cnsFileAccessConfig.Spec.PvcName
|
47 | 67 | namespace := cnsFileAccessConfig.Namespace
|
@@ -87,9 +107,14 @@ func cnsFileAccessConfigAlreadyExists(ctx context.Context, clientConfig *rest.Co
|
87 | 107 | return "", err
|
88 | 108 | }
|
89 | 109 |
|
| 110 | + // List only those CnsFileAccessConfig CRs which are not created by PVCSI. |
| 111 | + labelSelector := labels.SelectorFromSet(labels.Set{vmNameLabelKey: vm, pvcNameLabelKey: pvc}) |
90 | 112 | // Get the list of all CnsFileAccessConfig CRs in the given namespace.
|
91 | 113 | cnsFileAccessConfigList := &cnsfileaccessconfigv1alpha1.CnsFileAccessConfigList{}
|
92 |
| - err = cnsOperatorClient.List(ctx, cnsFileAccessConfigList, &client.ListOptions{Namespace: namespace}) |
| 114 | + err = cnsOperatorClient.List(ctx, cnsFileAccessConfigList, &client.ListOptions{ |
| 115 | + Namespace: namespace, |
| 116 | + LabelSelector: labelSelector, |
| 117 | + }) |
93 | 118 | if err != nil {
|
94 | 119 | log.Errorf("failed to list CnsFileAccessConfigList CRs from %s namesapace. Error: %+v",
|
95 | 120 | namespace, err)
|
@@ -125,10 +150,10 @@ func validateDeleteCnsFileAccessConfig(ctx context.Context, clientConfig *rest.C
|
125 | 150 | },
|
126 | 151 | }
|
127 | 152 | }
|
128 |
| - // If CR has devops user label, allow this request as |
| 153 | + // If CR has VM name label, allow this request as |
129 | 154 | // it means that it is created by devops user or K8s admin
|
130 | 155 | // and not by VKS (CSI service account).
|
131 |
| - if _, ok := cnsFileAccessConfig.Labels[devopsUserLabelKey]; ok { |
| 156 | + if _, ok := cnsFileAccessConfig.Labels[vmNameLabelKey]; ok { |
132 | 157 | log.Infof("CnsFileAccessConfig %s has devops user label. Allow this reqeust.",
|
133 | 158 | cnsFileAccessConfig.Name)
|
134 | 159 | return &admissionv1.AdmissionResponse{
|
|
0 commit comments