91 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Go
		
	
	
	
/*
 | 
						|
Copyright 2014 The Kubernetes Authors.
 | 
						|
 | 
						|
Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
you may not use this file except in compliance with the License.
 | 
						|
You may obtain a copy of the License at
 | 
						|
 | 
						|
    http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 | 
						|
Unless required by applicable law or agreed to in writing, software
 | 
						|
distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
See the License for the specific language governing permissions and
 | 
						|
limitations under the License.
 | 
						|
*/
 | 
						|
 | 
						|
// This code is directly lifted from the Kubernetes codebase in order to avoid relying on the k8s.io/kubernetes package.
 | 
						|
// For reference:
 | 
						|
// https://github.com/kubernetes/kubernetes/blob/release-1.23/pkg/controller/controller_utils.go#L466-L495
 | 
						|
// https://github.com/kubernetes/kubernetes/blob/release-1.23/pkg/controller/controller_utils.go#L539-L562
 | 
						|
 | 
						|
package lifted
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
 | 
						|
	corev1 "k8s.io/api/core/v1"
 | 
						|
	"k8s.io/apimachinery/pkg/api/meta"
 | 
						|
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
						|
	"k8s.io/apimachinery/pkg/labels"
 | 
						|
	"k8s.io/apimachinery/pkg/runtime"
 | 
						|
)
 | 
						|
 | 
						|
func getPodsLabelSet(template *corev1.PodTemplateSpec) labels.Set {
 | 
						|
	desiredLabels := make(labels.Set)
 | 
						|
	for k, v := range template.Labels {
 | 
						|
		desiredLabels[k] = v
 | 
						|
	}
 | 
						|
	return desiredLabels
 | 
						|
}
 | 
						|
 | 
						|
func getPodsFinalizers(template *corev1.PodTemplateSpec) []string {
 | 
						|
	desiredFinalizers := make([]string, len(template.Finalizers))
 | 
						|
	copy(desiredFinalizers, template.Finalizers)
 | 
						|
	return desiredFinalizers
 | 
						|
}
 | 
						|
 | 
						|
func getPodsAnnotationSet(template *corev1.PodTemplateSpec) labels.Set {
 | 
						|
	desiredAnnotations := make(labels.Set)
 | 
						|
	for k, v := range template.Annotations {
 | 
						|
		desiredAnnotations[k] = v
 | 
						|
	}
 | 
						|
	return desiredAnnotations
 | 
						|
}
 | 
						|
 | 
						|
func getPodsPrefix(controllerName string) string {
 | 
						|
	// use the dash (if the name isn't too long) to make the pod name a bit prettier
 | 
						|
	prefix := fmt.Sprintf("%s-", controllerName)
 | 
						|
	if len(ValidatePodName(prefix, true)) != 0 {
 | 
						|
		prefix = controllerName
 | 
						|
	}
 | 
						|
	return prefix
 | 
						|
}
 | 
						|
 | 
						|
// GetPodFromTemplate generates pod object from a template.
 | 
						|
func GetPodFromTemplate(template *corev1.PodTemplateSpec, parentObject runtime.Object, controllerRef *metav1.OwnerReference) (*corev1.Pod, error) {
 | 
						|
	desiredLabels := getPodsLabelSet(template)
 | 
						|
	desiredFinalizers := getPodsFinalizers(template)
 | 
						|
	desiredAnnotations := getPodsAnnotationSet(template)
 | 
						|
	accessor, err := meta.Accessor(parentObject)
 | 
						|
	if err != nil {
 | 
						|
		return nil, fmt.Errorf("parentObject does not have ObjectMeta, %v", err)
 | 
						|
	}
 | 
						|
	prefix := getPodsPrefix(accessor.GetName())
 | 
						|
 | 
						|
	pod := &corev1.Pod{
 | 
						|
		ObjectMeta: metav1.ObjectMeta{
 | 
						|
			Labels:       desiredLabels,
 | 
						|
			Annotations:  desiredAnnotations,
 | 
						|
			GenerateName: prefix,
 | 
						|
			Finalizers:   desiredFinalizers,
 | 
						|
			Namespace:    accessor.GetNamespace(),
 | 
						|
		},
 | 
						|
	}
 | 
						|
	if controllerRef != nil {
 | 
						|
		pod.OwnerReferences = append(pod.OwnerReferences, *controllerRef)
 | 
						|
	}
 | 
						|
	pod.Spec = *template.Spec.DeepCopy()
 | 
						|
	return pod, nil
 | 
						|
}
 |