in pkg/virtualnode/membership_designator.go [36:67]
func (d *membershipDesignator) Designate(ctx context.Context, pod *corev1.Pod) (*appmesh.VirtualNode, error) {
// see https://github.com/kubernetes/kubernetes/issues/88282 and https://github.com/kubernetes/kubernetes/issues/76680
req := webhook.ContextGetAdmissionRequest(ctx)
vnList := appmesh.VirtualNodeList{}
if err := d.k8sClient.List(ctx, &vnList, client.InNamespace(req.Namespace)); err != nil {
return nil, errors.Wrap(err, "failed to list VirtualNodes in cluster")
}
var vnCandidates []*appmesh.VirtualNode
for _, vnObj := range vnList.Items {
selector, err := metav1.LabelSelectorAsSelector(vnObj.Spec.PodSelector)
if err != nil {
return nil, err
}
if selector.Matches(labels.Set(pod.Labels)) {
vnCandidates = append(vnCandidates, vnObj.DeepCopy())
}
}
if len(vnCandidates) == 0 {
return nil, nil
}
if len(vnCandidates) > 1 {
var vnCandidatesNames []string
for _, vn := range vnCandidates {
vnCandidatesNames = append(vnCandidatesNames, k8s.NamespacedName(vn).String())
}
return nil, errors.Errorf("found multiple matching VirtualNodes for pod %s: %s",
k8s.NamespacedName(pod).String(), strings.Join(vnCandidatesNames, ","))
}
return vnCandidates[0], nil
}