mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-11 13:02:14 +00:00
[Federation] Make federation namespace e2e tests parallelizable.
Because deleteAllTestNamespaces deleted all the e2e namespaces it interefered with other federation namespace tests running in parallel. This change should mitigate the problem and make the tests runnable in parallel.
This commit is contained in:
parent
bd17091e16
commit
c29e0753ac
@ -45,6 +45,8 @@ var _ = framework.KubeDescribe("Federation namespace [Feature:Federation]", func
|
|||||||
Describe("Namespace objects", func() {
|
Describe("Namespace objects", func() {
|
||||||
var clusters map[string]*cluster // All clusters, keyed by cluster name
|
var clusters map[string]*cluster // All clusters, keyed by cluster name
|
||||||
|
|
||||||
|
var nsName string
|
||||||
|
|
||||||
BeforeEach(func() {
|
BeforeEach(func() {
|
||||||
fedframework.SkipUnlessFederated(f.ClientSet)
|
fedframework.SkipUnlessFederated(f.ClientSet)
|
||||||
clusters, _ = getRegisteredClusters(UserAgentName, f)
|
clusters, _ = getRegisteredClusters(UserAgentName, f)
|
||||||
@ -52,12 +54,12 @@ var _ = framework.KubeDescribe("Federation namespace [Feature:Federation]", func
|
|||||||
|
|
||||||
AfterEach(func() {
|
AfterEach(func() {
|
||||||
fedframework.SkipUnlessFederated(f.ClientSet)
|
fedframework.SkipUnlessFederated(f.ClientSet)
|
||||||
deleteAllTestNamespaces(nil,
|
deleteNamespace(nil, nsName,
|
||||||
f.FederationClientset.Core().Namespaces().List,
|
f.FederationClientset.Core().Namespaces().Get,
|
||||||
f.FederationClientset.Core().Namespaces().Delete)
|
f.FederationClientset.Core().Namespaces().Delete)
|
||||||
for _, cluster := range clusters {
|
for _, cluster := range clusters {
|
||||||
deleteAllTestNamespaces(nil,
|
deleteNamespace(nil, nsName,
|
||||||
cluster.Core().Namespaces().List,
|
cluster.Core().Namespaces().Get,
|
||||||
cluster.Core().Namespaces().Delete)
|
cluster.Core().Namespaces().Delete)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -65,11 +67,11 @@ var _ = framework.KubeDescribe("Federation namespace [Feature:Federation]", func
|
|||||||
It("should be created and deleted successfully", func() {
|
It("should be created and deleted successfully", func() {
|
||||||
fedframework.SkipUnlessFederated(f.ClientSet)
|
fedframework.SkipUnlessFederated(f.ClientSet)
|
||||||
|
|
||||||
nsName := createNamespace(f.FederationClientset.Core().Namespaces())
|
nsName = createNamespace(f.FederationClientset.Core().Namespaces())
|
||||||
|
|
||||||
By(fmt.Sprintf("Deleting namespace %s", nsName))
|
By(fmt.Sprintf("Deleting namespace %s", nsName))
|
||||||
deleteAllTestNamespaces(nil,
|
deleteNamespace(nil, nsName,
|
||||||
f.FederationClientset.Core().Namespaces().List,
|
f.FederationClientset.Core().Namespaces().Get,
|
||||||
f.FederationClientset.Core().Namespaces().Delete)
|
f.FederationClientset.Core().Namespaces().Delete)
|
||||||
By(fmt.Sprintf("Verified that deletion succeeded"))
|
By(fmt.Sprintf("Verified that deletion succeeded"))
|
||||||
})
|
})
|
||||||
@ -77,28 +79,28 @@ var _ = framework.KubeDescribe("Federation namespace [Feature:Federation]", func
|
|||||||
It("should be deleted from underlying clusters when OrphanDependents is false", func() {
|
It("should be deleted from underlying clusters when OrphanDependents is false", func() {
|
||||||
fedframework.SkipUnlessFederated(f.ClientSet)
|
fedframework.SkipUnlessFederated(f.ClientSet)
|
||||||
orphanDependents := false
|
orphanDependents := false
|
||||||
verifyNsCascadingDeletion(f.FederationClientset.Core().Namespaces(), clusters, &orphanDependents)
|
nsName = verifyNsCascadingDeletion(f.FederationClientset.Core().Namespaces(), clusters, &orphanDependents)
|
||||||
By(fmt.Sprintf("Verified that namespaces were deleted from underlying clusters"))
|
By(fmt.Sprintf("Verified that namespaces were deleted from underlying clusters"))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("should not be deleted from underlying clusters when OrphanDependents is true", func() {
|
It("should not be deleted from underlying clusters when OrphanDependents is true", func() {
|
||||||
fedframework.SkipUnlessFederated(f.ClientSet)
|
fedframework.SkipUnlessFederated(f.ClientSet)
|
||||||
orphanDependents := true
|
orphanDependents := true
|
||||||
verifyNsCascadingDeletion(f.FederationClientset.Core().Namespaces(), clusters, &orphanDependents)
|
nsName = verifyNsCascadingDeletion(f.FederationClientset.Core().Namespaces(), clusters, &orphanDependents)
|
||||||
By(fmt.Sprintf("Verified that namespaces were not deleted from underlying clusters"))
|
By(fmt.Sprintf("Verified that namespaces were not deleted from underlying clusters"))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("should not be deleted from underlying clusters when OrphanDependents is nil", func() {
|
It("should not be deleted from underlying clusters when OrphanDependents is nil", func() {
|
||||||
fedframework.SkipUnlessFederated(f.ClientSet)
|
fedframework.SkipUnlessFederated(f.ClientSet)
|
||||||
|
|
||||||
verifyNsCascadingDeletion(f.FederationClientset.Core().Namespaces(), clusters, nil)
|
nsName = verifyNsCascadingDeletion(f.FederationClientset.Core().Namespaces(), clusters, nil)
|
||||||
By(fmt.Sprintf("Verified that namespaces were not deleted from underlying clusters"))
|
By(fmt.Sprintf("Verified that namespaces were not deleted from underlying clusters"))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("all resources in the namespace should be deleted when namespace is deleted", func() {
|
It("all resources in the namespace should be deleted when namespace is deleted", func() {
|
||||||
fedframework.SkipUnlessFederated(f.ClientSet)
|
fedframework.SkipUnlessFederated(f.ClientSet)
|
||||||
|
|
||||||
nsName := createNamespace(f.FederationClientset.Core().Namespaces())
|
nsName = createNamespace(f.FederationClientset.Core().Namespaces())
|
||||||
|
|
||||||
// Create resources in the namespace.
|
// Create resources in the namespace.
|
||||||
event := api_v1.Event{
|
event := api_v1.Event{
|
||||||
@ -119,8 +121,8 @@ var _ = framework.KubeDescribe("Federation namespace [Feature:Federation]", func
|
|||||||
}
|
}
|
||||||
|
|
||||||
By(fmt.Sprintf("Deleting namespace %s", nsName))
|
By(fmt.Sprintf("Deleting namespace %s", nsName))
|
||||||
deleteAllTestNamespaces(nil,
|
deleteNamespace(nil, nsName,
|
||||||
f.FederationClientset.Core().Namespaces().List,
|
f.FederationClientset.Core().Namespaces().Get,
|
||||||
f.FederationClientset.Core().Namespaces().Delete)
|
f.FederationClientset.Core().Namespaces().Delete)
|
||||||
|
|
||||||
By(fmt.Sprintf("Verify that event %s was deleted as well", event.Name))
|
By(fmt.Sprintf("Verify that event %s was deleted as well", event.Name))
|
||||||
@ -136,7 +138,7 @@ var _ = framework.KubeDescribe("Federation namespace [Feature:Federation]", func
|
|||||||
// verifyNsCascadingDeletion verifies that namespaces are deleted from
|
// verifyNsCascadingDeletion verifies that namespaces are deleted from
|
||||||
// underlying clusters when orphan dependents is false and they are not
|
// underlying clusters when orphan dependents is false and they are not
|
||||||
// deleted when orphan dependents is true.
|
// deleted when orphan dependents is true.
|
||||||
func verifyNsCascadingDeletion(nsClient clientset.NamespaceInterface, clusters map[string]*cluster, orphanDependents *bool) {
|
func verifyNsCascadingDeletion(nsClient clientset.NamespaceInterface, clusters map[string]*cluster, orphanDependents *bool) string {
|
||||||
nsName := createNamespace(nsClient)
|
nsName := createNamespace(nsClient)
|
||||||
// Check subclusters if the namespace was created there.
|
// Check subclusters if the namespace was created there.
|
||||||
By(fmt.Sprintf("Waiting for namespace %s to be created in all underlying clusters", nsName))
|
By(fmt.Sprintf("Waiting for namespace %s to be created in all underlying clusters", nsName))
|
||||||
@ -155,7 +157,7 @@ func verifyNsCascadingDeletion(nsClient clientset.NamespaceInterface, clusters m
|
|||||||
framework.ExpectNoError(err, "Not all namespaces created")
|
framework.ExpectNoError(err, "Not all namespaces created")
|
||||||
|
|
||||||
By(fmt.Sprintf("Deleting namespace %s", nsName))
|
By(fmt.Sprintf("Deleting namespace %s", nsName))
|
||||||
deleteAllTestNamespaces(orphanDependents, nsClient.List, nsClient.Delete)
|
deleteNamespace(orphanDependents, nsName, nsClient.Get, nsClient.Delete)
|
||||||
|
|
||||||
By(fmt.Sprintf("Verifying namespaces %s in underlying clusters", nsName))
|
By(fmt.Sprintf("Verifying namespaces %s in underlying clusters", nsName))
|
||||||
errMessages := []string{}
|
errMessages := []string{}
|
||||||
@ -172,6 +174,7 @@ func verifyNsCascadingDeletion(nsClient clientset.NamespaceInterface, clusters m
|
|||||||
if len(errMessages) != 0 {
|
if len(errMessages) != 0 {
|
||||||
framework.Failf("%s", strings.Join(errMessages, "; "))
|
framework.Failf("%s", strings.Join(errMessages, "; "))
|
||||||
}
|
}
|
||||||
|
return nsName
|
||||||
}
|
}
|
||||||
|
|
||||||
func createNamespace(nsClient clientset.NamespaceInterface) string {
|
func createNamespace(nsClient clientset.NamespaceInterface) string {
|
||||||
@ -187,35 +190,23 @@ func createNamespace(nsClient clientset.NamespaceInterface) string {
|
|||||||
return ns.Name
|
return ns.Name
|
||||||
}
|
}
|
||||||
|
|
||||||
func deleteAllTestNamespaces(orphanDependents *bool, lister func(metav1.ListOptions) (*api_v1.NamespaceList, error), deleter func(string, *metav1.DeleteOptions) error) {
|
func deleteNamespace(orphanDependents *bool, namespace string, getter func(name string, options metav1.GetOptions) (*v1.Namespace, error), deleter func(string, *metav1.DeleteOptions) error) {
|
||||||
list, err := lister(metav1.ListOptions{})
|
By(fmt.Sprintf("Deleting namespace: %s", namespace))
|
||||||
if err != nil {
|
err := deleter(namespace, &metav1.DeleteOptions{OrphanDependents: orphanDependents})
|
||||||
framework.Failf("Failed to get all namespaes: %v", err)
|
if errors.IsNotFound(err) {
|
||||||
return
|
return
|
||||||
|
} else if err != nil {
|
||||||
|
framework.Failf("Failed to set %s for deletion: %v", namespace, err)
|
||||||
}
|
}
|
||||||
for _, namespace := range list.Items {
|
waitForNamespaceDeletion(namespace, getter)
|
||||||
if strings.HasPrefix(namespace.Name, namespacePrefix) {
|
|
||||||
By(fmt.Sprintf("Deleting ns: %s, found by listing", namespace.Name))
|
|
||||||
err := deleter(namespace.Name, &metav1.DeleteOptions{OrphanDependents: orphanDependents})
|
|
||||||
if err != nil {
|
|
||||||
framework.Failf("Failed to set %s for deletion: %v", namespace.Name, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
waitForNoTestNamespaces(lister)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func waitForNoTestNamespaces(lister func(metav1.ListOptions) (*api_v1.NamespaceList, error)) {
|
func waitForNamespaceDeletion(namespace string, getter func(name string, options metav1.GetOptions) (*v1.Namespace, error)) {
|
||||||
err := wait.Poll(5*time.Second, 2*time.Minute, func() (bool, error) {
|
err := wait.Poll(5*time.Second, 2*time.Minute, func() (bool, error) {
|
||||||
list, err := lister(metav1.ListOptions{})
|
_, err := getter(namespace, metav1.GetOptions{})
|
||||||
if err != nil {
|
if err != nil && !errors.IsNotFound(err) {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
for _, namespace := range list.Items {
|
|
||||||
if strings.HasPrefix(namespace.Name, namespacePrefix) {
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true, nil
|
return true, nil
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user