mirror of https://github.com/k3s-io/k3s
Migrate garbage collection integration tests
parent
3c9b68698d
commit
c2126f6820
|
@ -20,7 +20,6 @@ package integration
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -36,7 +35,6 @@ import (
|
||||||
"k8s.io/kubernetes/pkg/client/restclient"
|
"k8s.io/kubernetes/pkg/client/restclient"
|
||||||
"k8s.io/kubernetes/pkg/client/typed/dynamic"
|
"k8s.io/kubernetes/pkg/client/typed/dynamic"
|
||||||
"k8s.io/kubernetes/pkg/controller/garbagecollector"
|
"k8s.io/kubernetes/pkg/controller/garbagecollector"
|
||||||
"k8s.io/kubernetes/pkg/master"
|
|
||||||
"k8s.io/kubernetes/pkg/registry/generic/registry"
|
"k8s.io/kubernetes/pkg/registry/generic/registry"
|
||||||
"k8s.io/kubernetes/pkg/types"
|
"k8s.io/kubernetes/pkg/types"
|
||||||
"k8s.io/kubernetes/pkg/util/wait"
|
"k8s.io/kubernetes/pkg/util/wait"
|
||||||
|
@ -59,7 +57,7 @@ const oneValidOwnerPodName = "test.pod.3"
|
||||||
const toBeDeletedRCName = "test.rc.1"
|
const toBeDeletedRCName = "test.rc.1"
|
||||||
const remainingRCName = "test.rc.2"
|
const remainingRCName = "test.rc.2"
|
||||||
|
|
||||||
func newPod(podName string, ownerReferences []v1.OwnerReference) *v1.Pod {
|
func newPod(podName, podNamespace string, ownerReferences []v1.OwnerReference) *v1.Pod {
|
||||||
for i := 0; i < len(ownerReferences); i++ {
|
for i := 0; i < len(ownerReferences); i++ {
|
||||||
if len(ownerReferences[i].Kind) == 0 {
|
if len(ownerReferences[i].Kind) == 0 {
|
||||||
ownerReferences[i].Kind = "ReplicationController"
|
ownerReferences[i].Kind = "ReplicationController"
|
||||||
|
@ -73,7 +71,7 @@ func newPod(podName string, ownerReferences []v1.OwnerReference) *v1.Pod {
|
||||||
},
|
},
|
||||||
ObjectMeta: v1.ObjectMeta{
|
ObjectMeta: v1.ObjectMeta{
|
||||||
Name: podName,
|
Name: podName,
|
||||||
Namespace: framework.TestNS,
|
Namespace: podNamespace,
|
||||||
OwnerReferences: ownerReferences,
|
OwnerReferences: ownerReferences,
|
||||||
},
|
},
|
||||||
Spec: v1.PodSpec{
|
Spec: v1.PodSpec{
|
||||||
|
@ -87,14 +85,14 @@ func newPod(podName string, ownerReferences []v1.OwnerReference) *v1.Pod {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func newOwnerRC(name string) *v1.ReplicationController {
|
func newOwnerRC(name, namespace string) *v1.ReplicationController {
|
||||||
return &v1.ReplicationController{
|
return &v1.ReplicationController{
|
||||||
TypeMeta: unversioned.TypeMeta{
|
TypeMeta: unversioned.TypeMeta{
|
||||||
Kind: "ReplicationController",
|
Kind: "ReplicationController",
|
||||||
APIVersion: "v1",
|
APIVersion: "v1",
|
||||||
},
|
},
|
||||||
ObjectMeta: v1.ObjectMeta{
|
ObjectMeta: v1.ObjectMeta{
|
||||||
Namespace: framework.TestNS,
|
Namespace: namespace,
|
||||||
Name: name,
|
Name: name,
|
||||||
},
|
},
|
||||||
Spec: v1.ReplicationControllerSpec{
|
Spec: v1.ReplicationControllerSpec{
|
||||||
|
@ -116,22 +114,10 @@ func newOwnerRC(name string) *v1.ReplicationController {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func setup(t *testing.T) (*garbagecollector.GarbageCollector, clientset.Interface) {
|
func setup(t *testing.T) (*httptest.Server, *garbagecollector.GarbageCollector, clientset.Interface) {
|
||||||
// TODO: Limit the test to a single non-default namespace and clean this up at the end.
|
|
||||||
framework.DeleteAllEtcdKeys()
|
|
||||||
|
|
||||||
var m *master.Master
|
|
||||||
s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
|
|
||||||
m.Handler.ServeHTTP(w, req)
|
|
||||||
}))
|
|
||||||
// TODO: close the http server
|
|
||||||
|
|
||||||
masterConfig := framework.NewIntegrationTestMasterConfig()
|
masterConfig := framework.NewIntegrationTestMasterConfig()
|
||||||
masterConfig.EnableCoreControllers = false
|
masterConfig.EnableCoreControllers = false
|
||||||
m, err := master.New(masterConfig)
|
_, s := framework.RunAMaster(masterConfig)
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("Error in bringing up the master: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
clientSet, err := clientset.NewForConfig(&restclient.Config{Host: s.URL})
|
clientSet, err := clientset.NewForConfig(&restclient.Config{Host: s.URL})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -146,23 +132,28 @@ func setup(t *testing.T) (*garbagecollector.GarbageCollector, clientset.Interfac
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Failed to create garbage collector")
|
t.Fatalf("Failed to create garbage collector")
|
||||||
}
|
}
|
||||||
return gc, clientSet
|
return s, gc, clientSet
|
||||||
}
|
}
|
||||||
|
|
||||||
// This test simulates the cascading deletion.
|
// This test simulates the cascading deletion.
|
||||||
func TestCascadingDeletion(t *testing.T) {
|
func TestCascadingDeletion(t *testing.T) {
|
||||||
gc, clientSet := setup(t)
|
s, gc, clientSet := setup(t)
|
||||||
|
defer s.Close()
|
||||||
|
|
||||||
|
ns := framework.CreateTestingNamespace("gc-cascading-deletion", s, t)
|
||||||
|
defer framework.DeleteTestingNamespace(ns, s, t)
|
||||||
|
|
||||||
oldEnableGarbageCollector := registry.EnableGarbageCollector
|
oldEnableGarbageCollector := registry.EnableGarbageCollector
|
||||||
registry.EnableGarbageCollector = true
|
registry.EnableGarbageCollector = true
|
||||||
defer func() { registry.EnableGarbageCollector = oldEnableGarbageCollector }()
|
defer func() { registry.EnableGarbageCollector = oldEnableGarbageCollector }()
|
||||||
rcClient := clientSet.Core().ReplicationControllers(framework.TestNS)
|
rcClient := clientSet.Core().ReplicationControllers(ns.Name)
|
||||||
podClient := clientSet.Core().Pods(framework.TestNS)
|
podClient := clientSet.Core().Pods(ns.Name)
|
||||||
|
|
||||||
toBeDeletedRC, err := rcClient.Create(newOwnerRC(toBeDeletedRCName))
|
toBeDeletedRC, err := rcClient.Create(newOwnerRC(toBeDeletedRCName, ns.Name))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Failed to create replication controller: %v", err)
|
t.Fatalf("Failed to create replication controller: %v", err)
|
||||||
}
|
}
|
||||||
remainingRC, err := rcClient.Create(newOwnerRC(remainingRCName))
|
remainingRC, err := rcClient.Create(newOwnerRC(remainingRCName, ns.Name))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Failed to create replication controller: %v", err)
|
t.Fatalf("Failed to create replication controller: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -176,14 +167,14 @@ func TestCascadingDeletion(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// this pod should be cascadingly deleted.
|
// this pod should be cascadingly deleted.
|
||||||
pod := newPod(garbageCollectedPodName, []v1.OwnerReference{{UID: toBeDeletedRC.ObjectMeta.UID, Name: toBeDeletedRCName}})
|
pod := newPod(garbageCollectedPodName, ns.Name, []v1.OwnerReference{{UID: toBeDeletedRC.ObjectMeta.UID, Name: toBeDeletedRCName}})
|
||||||
_, err = podClient.Create(pod)
|
_, err = podClient.Create(pod)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Failed to create Pod: %v", err)
|
t.Fatalf("Failed to create Pod: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// this pod shouldn't be cascadingly deleted, because it has a valid reference.
|
// this pod shouldn't be cascadingly deleted, because it has a valid reference.
|
||||||
pod = newPod(oneValidOwnerPodName, []v1.OwnerReference{
|
pod = newPod(oneValidOwnerPodName, ns.Name, []v1.OwnerReference{
|
||||||
{UID: toBeDeletedRC.ObjectMeta.UID, Name: toBeDeletedRCName},
|
{UID: toBeDeletedRC.ObjectMeta.UID, Name: toBeDeletedRCName},
|
||||||
{UID: remainingRC.ObjectMeta.UID, Name: remainingRCName},
|
{UID: remainingRC.ObjectMeta.UID, Name: remainingRCName},
|
||||||
})
|
})
|
||||||
|
@ -193,7 +184,7 @@ func TestCascadingDeletion(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// this pod shouldn't be cascadingly deleted, because it doesn't have an owner.
|
// this pod shouldn't be cascadingly deleted, because it doesn't have an owner.
|
||||||
pod = newPod(independentPodName, []v1.OwnerReference{})
|
pod = newPod(independentPodName, ns.Name, []v1.OwnerReference{})
|
||||||
_, err = podClient.Create(pod)
|
_, err = podClient.Create(pod)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Failed to create Pod: %v", err)
|
t.Fatalf("Failed to create Pod: %v", err)
|
||||||
|
@ -253,13 +244,18 @@ func TestCascadingDeletion(t *testing.T) {
|
||||||
// This test simulates the case where an object is created with an owner that
|
// This test simulates the case where an object is created with an owner that
|
||||||
// doesn't exist. It verifies the GC will delete such an object.
|
// doesn't exist. It verifies the GC will delete such an object.
|
||||||
func TestCreateWithNonExistentOwner(t *testing.T) {
|
func TestCreateWithNonExistentOwner(t *testing.T) {
|
||||||
gc, clientSet := setup(t)
|
s, gc, clientSet := setup(t)
|
||||||
|
defer s.Close()
|
||||||
|
|
||||||
|
ns := framework.CreateTestingNamespace("gc-non-existing-owner", s, t)
|
||||||
|
defer framework.DeleteTestingNamespace(ns, s, t)
|
||||||
|
|
||||||
oldEnableGarbageCollector := registry.EnableGarbageCollector
|
oldEnableGarbageCollector := registry.EnableGarbageCollector
|
||||||
registry.EnableGarbageCollector = true
|
registry.EnableGarbageCollector = true
|
||||||
defer func() { registry.EnableGarbageCollector = oldEnableGarbageCollector }()
|
defer func() { registry.EnableGarbageCollector = oldEnableGarbageCollector }()
|
||||||
podClient := clientSet.Core().Pods(framework.TestNS)
|
podClient := clientSet.Core().Pods(ns.Name)
|
||||||
|
|
||||||
pod := newPod(garbageCollectedPodName, []v1.OwnerReference{{UID: "doesn't matter", Name: toBeDeletedRCName}})
|
pod := newPod(garbageCollectedPodName, ns.Name, []v1.OwnerReference{{UID: "doesn't matter", Name: toBeDeletedRCName}})
|
||||||
_, err := podClient.Create(pod)
|
_, err := podClient.Create(pod)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Failed to create Pod: %v", err)
|
t.Fatalf("Failed to create Pod: %v", err)
|
||||||
|
@ -288,13 +284,13 @@ func TestCreateWithNonExistentOwner(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func setupRCsPods(t *testing.T, gc *garbagecollector.GarbageCollector, clientSet clientset.Interface, nameSuffix string, initialFinalizers []string, options *api.DeleteOptions, wg *sync.WaitGroup, rcUIDs chan types.UID) {
|
func setupRCsPods(t *testing.T, gc *garbagecollector.GarbageCollector, clientSet clientset.Interface, nameSuffix, namespace string, initialFinalizers []string, options *api.DeleteOptions, wg *sync.WaitGroup, rcUIDs chan types.UID) {
|
||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
rcClient := clientSet.Core().ReplicationControllers(framework.TestNS)
|
rcClient := clientSet.Core().ReplicationControllers(namespace)
|
||||||
podClient := clientSet.Core().Pods(framework.TestNS)
|
podClient := clientSet.Core().Pods(namespace)
|
||||||
// create rc.
|
// create rc.
|
||||||
rcName := "test.rc." + nameSuffix
|
rcName := "test.rc." + nameSuffix
|
||||||
rc := newOwnerRC(rcName)
|
rc := newOwnerRC(rcName, namespace)
|
||||||
rc.ObjectMeta.Finalizers = initialFinalizers
|
rc.ObjectMeta.Finalizers = initialFinalizers
|
||||||
rc, err := rcClient.Create(rc)
|
rc, err := rcClient.Create(rc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -305,7 +301,7 @@ func setupRCsPods(t *testing.T, gc *garbagecollector.GarbageCollector, clientSet
|
||||||
var podUIDs []types.UID
|
var podUIDs []types.UID
|
||||||
for j := 0; j < 3; j++ {
|
for j := 0; j < 3; j++ {
|
||||||
podName := "test.pod." + nameSuffix + "-" + strconv.Itoa(j)
|
podName := "test.pod." + nameSuffix + "-" + strconv.Itoa(j)
|
||||||
pod := newPod(podName, []v1.OwnerReference{{UID: rc.ObjectMeta.UID, Name: rc.ObjectMeta.Name}})
|
pod := newPod(podName, namespace, []v1.OwnerReference{{UID: rc.ObjectMeta.UID, Name: rc.ObjectMeta.Name}})
|
||||||
_, err = podClient.Create(pod)
|
_, err = podClient.Create(pod)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Failed to create Pod: %v", err)
|
t.Fatalf("Failed to create Pod: %v", err)
|
||||||
|
@ -325,9 +321,9 @@ func setupRCsPods(t *testing.T, gc *garbagecollector.GarbageCollector, clientSet
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func verifyRemainingObjects(t *testing.T, clientSet clientset.Interface, rcNum, podNum int) (bool, error) {
|
func verifyRemainingObjects(t *testing.T, clientSet clientset.Interface, namespace string, rcNum, podNum int) (bool, error) {
|
||||||
rcClient := clientSet.Core().ReplicationControllers(framework.TestNS)
|
rcClient := clientSet.Core().ReplicationControllers(namespace)
|
||||||
podClient := clientSet.Core().Pods(framework.TestNS)
|
podClient := clientSet.Core().Pods(namespace)
|
||||||
pods, err := podClient.List(api.ListOptions{})
|
pods, err := podClient.List(api.ListOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, fmt.Errorf("Failed to list pods: %v", err)
|
return false, fmt.Errorf("Failed to list pods: %v", err)
|
||||||
|
@ -353,7 +349,12 @@ func verifyRemainingObjects(t *testing.T, clientSet clientset.Interface, rcNum,
|
||||||
// e2e tests that put more stress.
|
// e2e tests that put more stress.
|
||||||
func TestStressingCascadingDeletion(t *testing.T) {
|
func TestStressingCascadingDeletion(t *testing.T) {
|
||||||
t.Logf("starts garbage collector stress test")
|
t.Logf("starts garbage collector stress test")
|
||||||
gc, clientSet := setup(t)
|
s, gc, clientSet := setup(t)
|
||||||
|
defer s.Close()
|
||||||
|
|
||||||
|
ns := framework.CreateTestingNamespace("gc-stressing-cascading-deletion", s, t)
|
||||||
|
defer framework.DeleteTestingNamespace(ns, s, t)
|
||||||
|
|
||||||
oldEnableGarbageCollector := registry.EnableGarbageCollector
|
oldEnableGarbageCollector := registry.EnableGarbageCollector
|
||||||
registry.EnableGarbageCollector = true
|
registry.EnableGarbageCollector = true
|
||||||
defer func() { registry.EnableGarbageCollector = oldEnableGarbageCollector }()
|
defer func() { registry.EnableGarbageCollector = oldEnableGarbageCollector }()
|
||||||
|
@ -367,13 +368,13 @@ func TestStressingCascadingDeletion(t *testing.T) {
|
||||||
rcUIDs := make(chan types.UID, collections*4)
|
rcUIDs := make(chan types.UID, collections*4)
|
||||||
for i := 0; i < collections; i++ {
|
for i := 0; i < collections; i++ {
|
||||||
// rc is created with empty finalizers, deleted with nil delete options, pods will be deleted
|
// rc is created with empty finalizers, deleted with nil delete options, pods will be deleted
|
||||||
go setupRCsPods(t, gc, clientSet, "collection1-"+strconv.Itoa(i), []string{}, nil, &wg, rcUIDs)
|
go setupRCsPods(t, gc, clientSet, "collection1-"+strconv.Itoa(i), ns.Name, []string{}, nil, &wg, rcUIDs)
|
||||||
// rc is created with the orphan finalizer, deleted with nil options, pods will remain.
|
// rc is created with the orphan finalizer, deleted with nil options, pods will remain.
|
||||||
go setupRCsPods(t, gc, clientSet, "collection2-"+strconv.Itoa(i), []string{api.FinalizerOrphan}, nil, &wg, rcUIDs)
|
go setupRCsPods(t, gc, clientSet, "collection2-"+strconv.Itoa(i), ns.Name, []string{api.FinalizerOrphan}, nil, &wg, rcUIDs)
|
||||||
// rc is created with the orphan finalizer, deleted with DeleteOptions.OrphanDependents=false, pods will be deleted.
|
// rc is created with the orphan finalizer, deleted with DeleteOptions.OrphanDependents=false, pods will be deleted.
|
||||||
go setupRCsPods(t, gc, clientSet, "collection3-"+strconv.Itoa(i), []string{api.FinalizerOrphan}, getNonOrphanOptions(), &wg, rcUIDs)
|
go setupRCsPods(t, gc, clientSet, "collection3-"+strconv.Itoa(i), ns.Name, []string{api.FinalizerOrphan}, getNonOrphanOptions(), &wg, rcUIDs)
|
||||||
// rc is created with empty finalizers, deleted with DeleteOptions.OrphanDependents=true, pods will remain.
|
// rc is created with empty finalizers, deleted with DeleteOptions.OrphanDependents=true, pods will remain.
|
||||||
go setupRCsPods(t, gc, clientSet, "collection4-"+strconv.Itoa(i), []string{}, getOrphanOptions(), &wg, rcUIDs)
|
go setupRCsPods(t, gc, clientSet, "collection4-"+strconv.Itoa(i), ns.Name, []string{}, getOrphanOptions(), &wg, rcUIDs)
|
||||||
}
|
}
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
t.Logf("all pods are created, all replications controllers are created then deleted")
|
t.Logf("all pods are created, all replications controllers are created then deleted")
|
||||||
|
@ -390,14 +391,14 @@ func TestStressingCascadingDeletion(t *testing.T) {
|
||||||
podsInEachCollection := 3
|
podsInEachCollection := 3
|
||||||
// see the comments on the calls to setupRCsPods for details
|
// see the comments on the calls to setupRCsPods for details
|
||||||
remainingGroups := 2
|
remainingGroups := 2
|
||||||
return verifyRemainingObjects(t, clientSet, 0, collections*podsInEachCollection*remainingGroups)
|
return verifyRemainingObjects(t, clientSet, ns.Name, 0, collections*podsInEachCollection*remainingGroups)
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
t.Logf("number of remaining replication controllers and pods are as expected")
|
t.Logf("number of remaining replication controllers and pods are as expected")
|
||||||
|
|
||||||
// verify the remaining pods all have "orphan" in their names.
|
// verify the remaining pods all have "orphan" in their names.
|
||||||
podClient := clientSet.Core().Pods(framework.TestNS)
|
podClient := clientSet.Core().Pods(ns.Name)
|
||||||
pods, err := podClient.List(api.ListOptions{})
|
pods, err := podClient.List(api.ListOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
@ -420,14 +421,19 @@ func TestStressingCascadingDeletion(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestOrphaning(t *testing.T) {
|
func TestOrphaning(t *testing.T) {
|
||||||
gc, clientSet := setup(t)
|
s, gc, clientSet := setup(t)
|
||||||
|
defer s.Close()
|
||||||
|
|
||||||
|
ns := framework.CreateTestingNamespace("gc-orphaning", s, t)
|
||||||
|
defer framework.DeleteTestingNamespace(ns, s, t)
|
||||||
|
|
||||||
oldEnableGarbageCollector := registry.EnableGarbageCollector
|
oldEnableGarbageCollector := registry.EnableGarbageCollector
|
||||||
registry.EnableGarbageCollector = true
|
registry.EnableGarbageCollector = true
|
||||||
defer func() { registry.EnableGarbageCollector = oldEnableGarbageCollector }()
|
defer func() { registry.EnableGarbageCollector = oldEnableGarbageCollector }()
|
||||||
podClient := clientSet.Core().Pods(framework.TestNS)
|
podClient := clientSet.Core().Pods(ns.Name)
|
||||||
rcClient := clientSet.Core().ReplicationControllers(framework.TestNS)
|
rcClient := clientSet.Core().ReplicationControllers(ns.Name)
|
||||||
// create the RC with the orphan finalizer set
|
// create the RC with the orphan finalizer set
|
||||||
toBeDeletedRC := newOwnerRC(toBeDeletedRCName)
|
toBeDeletedRC := newOwnerRC(toBeDeletedRCName, ns.Name)
|
||||||
toBeDeletedRC, err := rcClient.Create(toBeDeletedRC)
|
toBeDeletedRC, err := rcClient.Create(toBeDeletedRC)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Failed to create replication controller: %v", err)
|
t.Fatalf("Failed to create replication controller: %v", err)
|
||||||
|
@ -438,7 +444,7 @@ func TestOrphaning(t *testing.T) {
|
||||||
podsNum := 3
|
podsNum := 3
|
||||||
for i := 0; i < podsNum; i++ {
|
for i := 0; i < podsNum; i++ {
|
||||||
podName := garbageCollectedPodName + strconv.Itoa(i)
|
podName := garbageCollectedPodName + strconv.Itoa(i)
|
||||||
pod := newPod(podName, []v1.OwnerReference{{UID: toBeDeletedRC.ObjectMeta.UID, Name: toBeDeletedRCName}})
|
pod := newPod(podName, ns.Name, []v1.OwnerReference{{UID: toBeDeletedRC.ObjectMeta.UID, Name: toBeDeletedRCName}})
|
||||||
_, err = podClient.Create(pod)
|
_, err = podClient.Create(pod)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Failed to create Pod: %v", err)
|
t.Fatalf("Failed to create Pod: %v", err)
|
||||||
|
|
Loading…
Reference in New Issue