in controller/webhook.go [136:202]
func (whsvr *WebhookServer) mutate(ctx context.Context, admissionReview *v1beta1.AdmissionReview) (*v1beta1.AdmissionResponse, error) {
admissionRequest := admissionReview.Request
var pod corev1.Pod
if err := json.Unmarshal(admissionRequest.Object.Raw, &pod); err != nil {
return &v1beta1.AdmissionResponse{Result: &metav1.Status{Message: err.Error()}}, fmt.Errorf("Error unmarshaling AdmissionRequest into Pod: %v", err)
}
nsLabels, err := whsvr.describeNamespace(ctx, admissionRequest.Namespace)
if err != nil {
return &v1beta1.AdmissionResponse{Result: &metav1.Status{Message: err.Error()}}, fmt.Errorf("Error describing namespace: %v", err)
}
if !whsvr.shouldMutate(nsLabels, &pod.ObjectMeta) {
return &v1beta1.AdmissionResponse{Allowed: true, UID: admissionRequest.UID}, nil
}
var patchOperations []PatchOperation
host, name, region := whsvr.getUpstreamEndpointParameters(nsLabels, &pod.ObjectMeta)
sidecarArgs := []string{"--name", name, "--region", region, "--host", host, "--port", ":8005"}
roleArn := whsvr.getRoleArn(nsLabels, &pod.ObjectMeta)
if roleArn != "" {
sidecarArgs = append(sidecarArgs, "--role-arn", roleArn)
}
image := whsvr.getProxyImage()
sidecarContainer := []corev1.Container{{
Name: "sidecar-aws-sigv4-proxy",
Image: image,
ImagePullPolicy: corev1.PullIfNotPresent,
Ports: []corev1.ContainerPort{{
ContainerPort: 8005,
}},
Args: sidecarArgs,
}}
patchOperations = append(patchOperations, addContainers(pod.Spec.Containers, sidecarContainer, "/spec/containers")...)
annotations := map[string]string{signingProxyWebhookAnnotationStatusKey: "injected"}
patchOperations = append(patchOperations, updateAnnotations(pod.Annotations, annotations)...)
patchBytes, err := json.Marshal(patchOperations)
if err != nil {
return &v1beta1.AdmissionResponse{Result: &metav1.Status{Message: err.Error()}}, fmt.Errorf("Error unmarshaling AdmissionRequest into Pod: %v", err)
}
log.Printf("Admission Response: %v", string(patchBytes))
return &v1beta1.AdmissionResponse{
Allowed: true,
UID: admissionRequest.UID,
Patch: patchBytes,
PatchType: func() *v1beta1.PatchType {
pt := v1beta1.PatchTypeJSONPatch
return &pt
}(),
}, nil
}