Skip to content

Commit af8ab35

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

File tree

2 files changed

+48
-15
lines changed

2 files changed

+48
-15
lines changed

pkg/syncer/admissionhandler/cnscsi_admissionhandler.go

Lines changed: 9 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,13 @@ 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+
// Add VM name and PVC name label.
274+
// If someone created this CR with these labels already present, CSI will overrite on them
275+
// with the correct values.
276+
newCnsFileAccessConfig.Labels[vmNameLabelKey] = newCnsFileAccessConfig.Spec.VMName
277+
newCnsFileAccessConfig.Labels[pvcNameLabelKey] = newCnsFileAccessConfig.Spec.PvcName
278+
276279
newRawCnsFileAccessConfig, err := json.Marshal(newCnsFileAccessConfig)
277280
if err != nil {
278281
return admission.Errored(http.StatusInternalServerError, err)

pkg/syncer/admissionhandler/validate_cnsfileaccessconfig.go

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ import (
77
"regexp"
88

99
admissionv1 "k8s.io/api/admission/v1"
10+
1011
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
12+
"k8s.io/apimachinery/pkg/labels"
1113
"sigs.k8s.io/controller-runtime/pkg/client"
1214
cnsoperatorv1alpha1 "sigs.k8s.io/vsphere-csi-driver/v3/pkg/apis/cnsoperator"
1315

@@ -42,6 +44,25 @@ func validateCreateCnsFileAccessConfig(ctx context.Context, clientConfig *rest.C
4244
}
4345
}
4446

47+
// This validation is not required for PVCSI service account.
48+
isPvCSIServiceAccount, err := validatePvCSIServiceAccount(req.UserInfo.Username)
49+
if err != nil {
50+
// return AdmissionResponse result
51+
return &admissionv1.AdmissionResponse{
52+
Allowed: false,
53+
Result: &metav1.Status{
54+
Message: fmt.Sprintf("failed to validate user information: %v", err),
55+
},
56+
}
57+
}
58+
59+
// If user is PVCSI service account, allow this request.
60+
if isPvCSIServiceAccount {
61+
return &admissionv1.AdmissionResponse{
62+
Allowed: true,
63+
}
64+
}
65+
4566
vm := cnsFileAccessConfig.Spec.VMName
4667
pvc := cnsFileAccessConfig.Spec.PvcName
4768
namespace := cnsFileAccessConfig.Namespace
@@ -87,22 +108,31 @@ func cnsFileAccessConfigAlreadyExists(ctx context.Context, clientConfig *rest.Co
87108
return "", err
88109
}
89110

111+
// List only that CnsFileAccessConfig CRs which has the same VM name and PVC name labels.
112+
labelSelector := labels.SelectorFromSet(labels.Set{vmNameLabelKey: vm, pvcNameLabelKey: pvc})
90113
// Get the list of all CnsFileAccessConfig CRs in the given namespace.
91114
cnsFileAccessConfigList := &cnsfileaccessconfigv1alpha1.CnsFileAccessConfigList{}
92-
err = cnsOperatorClient.List(ctx, cnsFileAccessConfigList, &client.ListOptions{Namespace: namespace})
115+
err = cnsOperatorClient.List(ctx, cnsFileAccessConfigList, &client.ListOptions{
116+
Namespace: namespace,
117+
LabelSelector: labelSelector,
118+
})
93119
if err != nil {
94120
log.Errorf("failed to list CnsFileAccessConfigList CRs from %s namesapace. Error: %+v",
95121
namespace, err)
96122
return "", err
97123
}
98124

99-
for _, cnsFileAccessConfig := range cnsFileAccessConfigList.Items {
100-
if cnsFileAccessConfig.Spec.VMName == vm {
101-
if cnsFileAccessConfig.Spec.PvcName == pvc {
102-
return cnsFileAccessConfig.Name, nil
103-
}
104-
}
125+
if len(cnsFileAccessConfigList.Items) == 1 {
126+
// There should be only 1 CFC CR with the same VM and PVC
127+
return cnsFileAccessConfigList.Items[0].Name, nil
128+
}
129+
130+
if len(cnsFileAccessConfigList.Items) > 1 {
131+
// We should never reach here but it's good to have this check.
132+
return "", fmt.Errorf("invalid case, %d CnsFileAccessConfig instances detected "+
133+
"with the VM %s and PVC %s", len(cnsFileAccessConfigList.Items), vm, pvc)
105134
}
135+
106136
return "", nil
107137
}
108138

@@ -125,10 +155,10 @@ func validateDeleteCnsFileAccessConfig(ctx context.Context, clientConfig *rest.C
125155
},
126156
}
127157
}
128-
// If CR has devops user label, allow this request as
158+
// If CR has VM name label, allow this request as
129159
// it means that it is created by devops user or K8s admin
130160
// and not by VKS (CSI service account).
131-
if _, ok := cnsFileAccessConfig.Labels[devopsUserLabelKey]; ok {
161+
if _, ok := cnsFileAccessConfig.Labels[vmNameLabelKey]; ok {
132162
log.Infof("CnsFileAccessConfig %s has devops user label. Allow this reqeust.",
133163
cnsFileAccessConfig.Name)
134164
return &admissionv1.AdmissionResponse{

0 commit comments

Comments
 (0)