Skip to content

Commit 176995d

Browse files
committed
Improve RWX volumes with VM service VMs performace during validation in webhook.
1 parent 61f0a34 commit 176995d

File tree

2 files changed

+34
-9
lines changed

2 files changed

+34
-9
lines changed

pkg/syncer/admissionhandler/cnscsi_admissionhandler.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ const (
3737
MutationWebhookPath = "/mutate"
3838
DefaultWebhookPort = 9883
3939
DefaultWebhookMetricsBindAddress = "0"
40-
devopsUserLabelKey = "cns.vmware.com/user-created"
40+
vmNameLabelKey = "cns.vmware.com/vm-name"
41+
pvcNameLabelKey = "cns.vmware.com/pvc-name"
4142
)
4243

4344
var (
@@ -268,11 +269,10 @@ func (h *CSISupervisorMutationWebhook) mutateNewCnsFileAccessConfig(ctx context.
268269
if newCnsFileAccessConfig.Labels == nil {
269270
newCnsFileAccessConfig.Labels = make(map[string]string)
270271
}
271-
if _, ok := newCnsFileAccessConfig.Labels[devopsUserLabelKey]; ok {
272-
log.Debugf("Devops label already present on instance %s", newCnsFileAccessConfig.Name)
273-
return admission.Allowed("")
274-
}
275-
newCnsFileAccessConfig.Labels[devopsUserLabelKey] = "true"
272+
273+
newCnsFileAccessConfig.Labels[vmNameLabelKey] = newCnsFileAccessConfig.Spec.VMName
274+
newCnsFileAccessConfig.Labels[pvcNameLabelKey] = newCnsFileAccessConfig.Spec.PvcName
275+
276276
newRawCnsFileAccessConfig, err := json.Marshal(newCnsFileAccessConfig)
277277
if err != nil {
278278
return admission.Errored(http.StatusInternalServerError, err)

pkg/syncer/admissionhandler/validate_cnsfileaccessconfig.go

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
admissionv1 "k8s.io/api/admission/v1"
1010
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11+
"k8s.io/apimachinery/pkg/labels"
1112
"sigs.k8s.io/controller-runtime/pkg/client"
1213
cnsoperatorv1alpha1 "sigs.k8s.io/vsphere-csi-driver/v3/pkg/apis/cnsoperator"
1314

@@ -42,6 +43,25 @@ func validateCreateCnsFileAccessConfig(ctx context.Context, clientConfig *rest.C
4243
}
4344
}
4445

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+
4565
vm := cnsFileAccessConfig.Spec.VMName
4666
pvc := cnsFileAccessConfig.Spec.PvcName
4767
namespace := cnsFileAccessConfig.Namespace
@@ -87,9 +107,14 @@ func cnsFileAccessConfigAlreadyExists(ctx context.Context, clientConfig *rest.Co
87107
return "", err
88108
}
89109

110+
// List only those CnsFileAccessConfig CRs which are not created by PVCSI.
111+
labelSelector := labels.SelectorFromSet(labels.Set{vmNameLabelKey: vm, pvcNameLabelKey: pvc})
90112
// Get the list of all CnsFileAccessConfig CRs in the given namespace.
91113
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+
})
93118
if err != nil {
94119
log.Errorf("failed to list CnsFileAccessConfigList CRs from %s namesapace. Error: %+v",
95120
namespace, err)
@@ -125,10 +150,10 @@ func validateDeleteCnsFileAccessConfig(ctx context.Context, clientConfig *rest.C
125150
},
126151
}
127152
}
128-
// If CR has devops user label, allow this request as
153+
// If CR has VM name label, allow this request as
129154
// it means that it is created by devops user or K8s admin
130155
// and not by VKS (CSI service account).
131-
if _, ok := cnsFileAccessConfig.Labels[devopsUserLabelKey]; ok {
156+
if _, ok := cnsFileAccessConfig.Labels[vmNameLabelKey]; ok {
132157
log.Infof("CnsFileAccessConfig %s has devops user label. Allow this reqeust.",
133158
cnsFileAccessConfig.Name)
134159
return &admissionv1.AdmissionResponse{

0 commit comments

Comments
 (0)