Merge pull request #89186 from andrewsykim/e2e-framework-deployment-util

e2e/framework: remove direct imports to pkg/controller/deployment/util
This commit is contained in:
Kubernetes Prow Robot 2020-03-19 06:06:10 -07:00 committed by GitHub
commit 71839b58e3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 80 additions and 11 deletions

View File

@ -10,9 +10,9 @@ go_library(
],
importpath = "k8s.io/kubernetes/test/e2e/framework/deployment",
deps = [
"//pkg/controller/deployment/util:go_default_library",
"//staging/src/k8s.io/api/apps/v1:go_default_library",
"//staging/src/k8s.io/api/core/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library",
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",

View File

@ -19,13 +19,14 @@ package deployment
import (
"context"
"fmt"
"sort"
appsv1 "k8s.io/api/apps/v1"
v1 "k8s.io/api/core/v1"
apiequality "k8s.io/apimachinery/pkg/api/equality"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/uuid"
clientset "k8s.io/client-go/kubernetes"
deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util"
"k8s.io/kubernetes/test/e2e/framework"
testutils "k8s.io/kubernetes/test/utils"
imageutils "k8s.io/kubernetes/test/utils/image"
@ -86,22 +87,90 @@ func CreateDeployment(client clientset.Interface, replicas int32, podLabels map[
// GetPodsForDeployment gets pods for the given deployment
func GetPodsForDeployment(client clientset.Interface, deployment *appsv1.Deployment) (*v1.PodList, error) {
replicaSet, err := deploymentutil.GetNewReplicaSet(deployment, client.AppsV1())
replicaSetSelector, err := metav1.LabelSelectorAsSelector(deployment.Spec.Selector)
if err != nil {
return nil, fmt.Errorf("Failed to get new replica set for deployment %q: %v", deployment.Name, err)
return nil, err
}
replicaSetListOptions := metav1.ListOptions{LabelSelector: replicaSetSelector.String()}
allReplicaSets, err := client.AppsV1().ReplicaSets(deployment.Namespace).List(context.TODO(), replicaSetListOptions)
if err != nil {
return nil, err
}
ownedReplicaSets := make([]*appsv1.ReplicaSet, 0, len(allReplicaSets.Items))
for _, rs := range allReplicaSets.Items {
if !metav1.IsControlledBy(&rs, deployment) {
continue
}
ownedReplicaSets = append(ownedReplicaSets, &rs)
}
// We ignore pod-template-hash because:
// 1. The hash result would be different upon podTemplateSpec API changes
// (e.g. the addition of a new field will cause the hash code to change)
// 2. The deployment template won't have hash labels
podTemplatesEqualsIgnoringHash := func(template1, template2 *v1.PodTemplateSpec) bool {
t1Copy := template1.DeepCopy()
t2Copy := template2.DeepCopy()
// Remove hash labels from template.Labels before comparing
delete(t1Copy.Labels, appsv1.DefaultDeploymentUniqueLabelKey)
delete(t2Copy.Labels, appsv1.DefaultDeploymentUniqueLabelKey)
return apiequality.Semantic.DeepEqual(t1Copy, t2Copy)
}
var replicaSet *appsv1.ReplicaSet
// In rare cases, such as after cluster upgrades, Deployment may end up with
// having more than one new ReplicaSets that have the same template as its template,
// see https://github.com/kubernetes/kubernetes/issues/40415
// We deterministically choose the oldest new ReplicaSet.
sort.Sort(replicaSetsByCreationTimestamp(ownedReplicaSets))
for _, rs := range ownedReplicaSets {
if !podTemplatesEqualsIgnoringHash(&rs.Spec.Template, &deployment.Spec.Template) {
continue
}
replicaSet = rs
break
}
if replicaSet == nil {
return nil, fmt.Errorf("expected a new replica set for deployment %q, found none", deployment.Name)
}
podListFunc := func(namespace string, options metav1.ListOptions) (*v1.PodList, error) {
return client.CoreV1().Pods(namespace).List(context.TODO(), options)
}
rsList := []*appsv1.ReplicaSet{replicaSet}
podList, err := deploymentutil.ListPods(deployment, rsList, podListFunc)
podSelector, err := metav1.LabelSelectorAsSelector(deployment.Spec.Selector)
if err != nil {
return nil, fmt.Errorf("Failed to list Pods of Deployment %q: %v", deployment.Name, err)
return nil, err
}
return podList, nil
podListOptions := metav1.ListOptions{LabelSelector: podSelector.String()}
allPods, err := client.CoreV1().Pods(deployment.Namespace).List(context.TODO(), podListOptions)
if err != nil {
return nil, err
}
replicaSetUID := replicaSet.UID
ownedPods := &v1.PodList{Items: make([]v1.Pod, 0, len(allPods.Items))}
for _, pod := range allPods.Items {
controllerRef := metav1.GetControllerOf(&pod)
if controllerRef != nil && controllerRef.UID == replicaSetUID {
ownedPods.Items = append(ownedPods.Items, pod)
}
}
return ownedPods, nil
}
// replicaSetsByCreationTimestamp sorts a list of ReplicaSet by creation timestamp, using their names as a tie breaker.
type replicaSetsByCreationTimestamp []*appsv1.ReplicaSet
func (o replicaSetsByCreationTimestamp) Len() int { return len(o) }
func (o replicaSetsByCreationTimestamp) Swap(i, j int) { o[i], o[j] = o[j], o[i] }
func (o replicaSetsByCreationTimestamp) Less(i, j int) bool {
if o[i].CreationTimestamp.Equal(&o[j].CreationTimestamp) {
return o[i].Name < o[j].Name
}
return o[i].CreationTimestamp.Before(&o[j].CreationTimestamp)
}
// testDeployment creates a deployment definition based on the namespace. The deployment references the PVC's