func()

in pkg/webhook/injection.go [102:152]


func (si *SidecarInjector) injectSidecarContainer(containerName string, pod *corev1.Pod, injectAsNativeSidecar bool) error {
	var containerSpec corev1.Container
	var index int
	config, err := si.prepareConfig(sidecarPrefixMap[containerName], *pod)
	if err != nil {
		return err
	}
	config.PodHostNetworkSetting = pod.Spec.HostNetwork

	// Extract user provided metadata prefetch sidecar image.
	if userProvidedSidecarImage, err := ExtractImageAndDeleteContainer(&pod.Spec, containerName); err == nil {
		if userProvidedSidecarImage != "" {
			config.ContainerImage = userProvidedSidecarImage
		}
	} else {
		return err
	}

	// Retrieve container spec and index to inject sidecar for either init containers or regular based on native sidecar support.
	if injectAsNativeSidecar {
		containerSpec = si.getNativeContainerSpec(containerName, pod, config)
		index = getInjectIndexAfterContainer(pod.Spec.InitContainers, containerIndexOrderMap[containerName])
	} else {
		containerSpec = si.getContainerSpec(containerName, pod, config)
		index = getInjectIndexAfterContainer(pod.Spec.Containers, containerIndexOrderMap[containerName])
	}

	// Skip metadata prefetch sidecar injection if no volumes are requesting metadata prefetch.
	if containerName == MetadataPrefetchSidecarName && len(containerSpec.VolumeMounts) == 0 {
		klog.Info("no volumes are requesting metadata prefetch, skipping metadata prefetch sidecar injection")

		return nil
	}

	// This should not happen as we always inject the sidecar after injecting our primary gcsfuse sidecar.
	if containerName == MetadataPrefetchSidecarName && index == 0 {
		klog.Warningf("%s not found when attempting to inject container. skipping injection", containerIndexOrderMap[containerName])

		return fmt.Errorf("%s", (containerIndexOrderMap[containerName] + "not found when attempting to inject metadata prefetch. skipping injection"))
	}

	if injectAsNativeSidecar {
		pod.Spec.InitContainers = insert(pod.Spec.InitContainers, containerSpec, index)
	} else {
		pod.Spec.Containers = insert(pod.Spec.Containers, containerSpec, index)
	}
	// Log pod mutation after fuse sidecar injection.
	LogPodMutation(pod, config)

	return nil
}