diff --git a/test/e2e_federation/BUILD b/test/e2e_federation/BUILD index 2d7afd28d74..aad15eb188b 100644 --- a/test/e2e_federation/BUILD +++ b/test/e2e_federation/BUILD @@ -13,7 +13,6 @@ go_library( "apiserver.go", "authn.go", "crud.go", - "deployment.go", "event.go", "ingress.go", "namespace.go", diff --git a/test/e2e_federation/deployment.go b/test/e2e_federation/deployment.go deleted file mode 100644 index 07e4075869d..00000000000 --- a/test/e2e_federation/deployment.go +++ /dev/null @@ -1,301 +0,0 @@ -/* -Copyright 2016 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. -*/ - -package e2e_federation - -import ( - "fmt" - "strings" - "time" - - "k8s.io/api/core/v1" - "k8s.io/api/extensions/v1beta1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/wait" - fedclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset" - fedutil "k8s.io/kubernetes/federation/pkg/federation-controller/util" - "k8s.io/kubernetes/test/e2e/framework" - fedframework "k8s.io/kubernetes/test/e2e_federation/framework" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "k8s.io/apimachinery/pkg/api/errors" -) - -const ( - FederationDeploymentName = "federation-deployment" -) - -// Create/delete deployment api objects -var _ = framework.KubeDescribe("Federation deployments [Feature:Federation]", func() { - f := fedframework.NewDefaultFederatedFramework("federation-deployment") - - Describe("Deployment objects [NoCluster]", func() { - AfterEach(func() { - fedframework.SkipUnlessFederated(f.ClientSet) - - // Delete all deployments. - nsName := f.FederationNamespace.Name - deleteAllDeploymentsOrFail(f.FederationClientset, nsName) - }) - - It("should be created and deleted successfully", func() { - fedframework.SkipUnlessFederated(f.ClientSet) - - nsName := f.FederationNamespace.Name - deployment := createDeploymentOrFail(f.FederationClientset, nsName) - By(fmt.Sprintf("Creation of deployment %q in namespace %q succeeded. Deleting deployment.", deployment.Name, nsName)) - // Cleanup - err := f.FederationClientset.Extensions().Deployments(nsName).Delete(deployment.Name, &metav1.DeleteOptions{}) - framework.ExpectNoError(err, "Error deleting deployment %q in namespace %q", deployment.Name, deployment.Namespace) - By(fmt.Sprintf("Deletion of deployment %q in namespace %q succeeded.", deployment.Name, nsName)) - }) - - }) - - // e2e cases for federated deployment controller - Describe("Federated Deployment", func() { - var ( - clusters fedframework.ClusterSlice - ) - BeforeEach(func() { - fedframework.SkipUnlessFederated(f.ClientSet) - clusters = f.GetRegisteredClusters() - }) - - AfterEach(func() { - nsName := f.FederationNamespace.Name - deleteAllDeploymentsOrFail(f.FederationClientset, nsName) - }) - - It("should create and update matching deployments in underlying clusters", func() { - nsName := f.FederationNamespace.Name - dep := createDeploymentOrFail(f.FederationClientset, nsName) - defer func() { - // cleanup. deletion of deployments is not supported for underlying clusters - By(fmt.Sprintf("Preparing deployment %q/%q for deletion by setting replicas to zero", nsName, dep.Name)) - replicas := int32(0) - dep.Spec.Replicas = &replicas - f.FederationClientset.Deployments(nsName).Update(dep) - waitForDeploymentOrFail(f.FederationClientset, nsName, dep.Name, clusters) - f.FederationClientset.Deployments(nsName).Delete(dep.Name, &metav1.DeleteOptions{}) - }() - - waitForDeploymentOrFail(f.FederationClientset, nsName, dep.Name, clusters) - By(fmt.Sprintf("Successfuly created and synced deployment %q/%q to clusters", nsName, dep.Name)) - updateDeploymentOrFail(f.FederationClientset, nsName) - waitForDeploymentOrFail(f.FederationClientset, nsName, dep.Name, clusters) - By(fmt.Sprintf("Successfuly updated and synced deployment %q/%q to clusters", nsName, dep.Name)) - }) - - It("should be deleted from underlying clusters when OrphanDependents is false", func() { - fedframework.SkipUnlessFederated(f.ClientSet) - nsName := f.FederationNamespace.Name - orphanDependents := false - verifyCascadingDeletionForDeployment(f.FederationClientset, clusters, &orphanDependents, nsName) - By(fmt.Sprintf("Verified that deployments were deleted from underlying clusters")) - }) - - It("should not be deleted from underlying clusters when OrphanDependents is true", func() { - fedframework.SkipUnlessFederated(f.ClientSet) - nsName := f.FederationNamespace.Name - orphanDependents := true - verifyCascadingDeletionForDeployment(f.FederationClientset, clusters, &orphanDependents, nsName) - By(fmt.Sprintf("Verified that deployments were not deleted from underlying clusters")) - }) - - It("should not be deleted from underlying clusters when OrphanDependents is nil", func() { - fedframework.SkipUnlessFederated(f.ClientSet) - nsName := f.FederationNamespace.Name - verifyCascadingDeletionForDeployment(f.FederationClientset, clusters, nil, nsName) - By(fmt.Sprintf("Verified that deployments were not deleted from underlying clusters")) - }) - - }) -}) - -// deleteAllDeploymentsOrFail deletes all deployments in the given namespace name. -func deleteAllDeploymentsOrFail(clientset *fedclientset.Clientset, nsName string) { - deploymentList, err := clientset.Extensions().Deployments(nsName).List(metav1.ListOptions{}) - Expect(err).NotTo(HaveOccurred()) - orphanDependents := false - for _, deployment := range deploymentList.Items { - deleteDeploymentOrFail(clientset, nsName, deployment.Name, &orphanDependents) - } -} - -// verifyCascadingDeletionForDeployment verifies that deployments are deleted -// from underlying clusters when orphan dependents is false and they are not -// deleted when orphan dependents is true. -func verifyCascadingDeletionForDeployment(clientset *fedclientset.Clientset, clusters fedframework.ClusterSlice, orphanDependents *bool, nsName string) { - deployment := createDeploymentOrFail(clientset, nsName) - deploymentName := deployment.Name - // Check subclusters if the deployment was created there. - By(fmt.Sprintf("Waiting for deployment %s to be created in all underlying clusters", deploymentName)) - err := wait.Poll(5*time.Second, 2*time.Minute, func() (bool, error) { - for _, cluster := range clusters { - _, err := cluster.Extensions().Deployments(nsName).Get(deploymentName, metav1.GetOptions{}) - if err != nil && errors.IsNotFound(err) { - return false, nil - } - if err != nil { - return false, err - } - } - return true, nil - }) - framework.ExpectNoError(err, "Not all deployments created") - - By(fmt.Sprintf("Deleting deployment %s", deploymentName)) - deleteDeploymentOrFail(clientset, nsName, deploymentName, orphanDependents) - - By(fmt.Sprintf("Verifying deployments %s in underlying clusters", deploymentName)) - errMessages := []string{} - // deployment should be present in underlying clusters unless orphanDependents is false. - shouldExist := orphanDependents == nil || *orphanDependents == true - for _, cluster := range clusters { - clusterName := cluster.Name - _, err := cluster.Extensions().Deployments(nsName).Get(deploymentName, metav1.GetOptions{}) - if shouldExist && errors.IsNotFound(err) { - errMessages = append(errMessages, fmt.Sprintf("unexpected NotFound error for deployment %s in cluster %s, expected deployment to exist", deploymentName, clusterName)) - } else if !shouldExist && !errors.IsNotFound(err) { - errMessages = append(errMessages, fmt.Sprintf("expected NotFound error for deployment %s in cluster %s, got error: %v", deploymentName, clusterName, err)) - } - } - if len(errMessages) != 0 { - framework.Failf("%s", strings.Join(errMessages, "; ")) - } -} - -func waitForDeploymentOrFail(c *fedclientset.Clientset, namespace string, deploymentName string, clusters fedframework.ClusterSlice) { - err := waitForDeployment(c, namespace, deploymentName, clusters) - framework.ExpectNoError(err, "Failed to verify deployment %q/%q, err: %v", namespace, deploymentName, err) -} - -func waitForDeployment(c *fedclientset.Clientset, namespace string, deploymentName string, clusters fedframework.ClusterSlice) error { - err := wait.Poll(10*time.Second, fedframework.FederatedDefaultTestTimeout, func() (bool, error) { - fdep, err := c.Deployments(namespace).Get(deploymentName, metav1.GetOptions{}) - if err != nil { - return false, err - } - specReplicas, statusReplicas := int32(0), int32(0) - for _, cluster := range clusters { - dep, err := cluster.Extensions().Deployments(namespace).Get(deploymentName, metav1.GetOptions{}) - if err != nil && !errors.IsNotFound(err) { - By(fmt.Sprintf("Failed getting deployment: %q/%q/%q, err: %v", cluster.Name, namespace, deploymentName, err)) - return false, err - } - if err == nil { - if !verifyDeployment(fdep, dep) { - By(fmt.Sprintf("Deployment meta or spec not match for cluster %q:\n federation: %v\n cluster: %v", cluster.Name, fdep, dep)) - return false, nil - } - specReplicas += *dep.Spec.Replicas - statusReplicas += dep.Status.Replicas - } - } - if statusReplicas == fdep.Status.Replicas && specReplicas >= *fdep.Spec.Replicas { - return true, nil - } - By(fmt.Sprintf("Replicas not match, federation replicas: %v/%v, clusters replicas: %v/%v\n", *fdep.Spec.Replicas, fdep.Status.Replicas, specReplicas, statusReplicas)) - return false, nil - }) - - return err -} - -func verifyDeployment(fedDeployment, localDeployment *v1beta1.Deployment) bool { - localDeployment = fedutil.DeepCopyDeployment(localDeployment) - localDeployment.Spec.Replicas = fedDeployment.Spec.Replicas - return fedutil.DeploymentEquivalent(fedDeployment, localDeployment) -} - -func createDeploymentOrFail(clientset *fedclientset.Clientset, namespace string) *v1beta1.Deployment { - if clientset == nil || len(namespace) == 0 { - Fail(fmt.Sprintf("Internal error: invalid parameters passed to createDeploymentOrFail: clientset: %v, namespace: %v", clientset, namespace)) - } - By(fmt.Sprintf("Creating federation deployment %q in namespace %q", FederationDeploymentName, namespace)) - - deployment := newDeploymentForFed(namespace, FederationDeploymentName, 5) - - _, err := clientset.Extensions().Deployments(namespace).Create(deployment) - framework.ExpectNoError(err, "Creating deployment %q in namespace %q", deployment.Name, namespace) - By(fmt.Sprintf("Successfully created federation deployment %q in namespace %q", FederationDeploymentName, namespace)) - return deployment -} - -func updateDeploymentOrFail(clientset *fedclientset.Clientset, namespace string) *v1beta1.Deployment { - if clientset == nil || len(namespace) == 0 { - Fail(fmt.Sprintf("Internal error: invalid parameters passed to updateDeploymentOrFail: clientset: %v, namespace: %v", clientset, namespace)) - } - By(fmt.Sprintf("Updating federation deployment %q in namespace %q", FederationDeploymentName, namespace)) - - deployment := newDeploymentForFed(namespace, FederationDeploymentName, 15) - - newDeployment, err := clientset.Deployments(namespace).Update(deployment) - framework.ExpectNoError(err, "Updating deployment %q in namespace %q", deployment.Name, namespace) - By(fmt.Sprintf("Successfully updated federation deployment %q in namespace %q", FederationDeploymentName, namespace)) - - return newDeployment -} - -func deleteDeploymentOrFail(clientset *fedclientset.Clientset, nsName string, deploymentName string, orphanDependents *bool) { - By(fmt.Sprintf("Deleting deployment %q in namespace %q", deploymentName, nsName)) - err := clientset.Extensions().Deployments(nsName).Delete(deploymentName, &metav1.DeleteOptions{OrphanDependents: orphanDependents}) - if err != nil && !errors.IsNotFound(err) { - framework.ExpectNoError(err, "Error deleting deployment %q in namespace %q", deploymentName, nsName) - } - - // Wait for the deployment to be deleted. - err = wait.Poll(10*time.Second, fedframework.FederatedDefaultTestTimeout, func() (bool, error) { - _, err := clientset.Extensions().Deployments(nsName).Get(deploymentName, metav1.GetOptions{}) - if err != nil && errors.IsNotFound(err) { - return true, nil - } - return false, err - }) - if err != nil { - framework.Failf("Error in deleting deployment %s: %v", deploymentName, err) - } -} - -func newDeploymentForFed(namespace string, name string, replicas int32) *v1beta1.Deployment { - return &v1beta1.Deployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - Spec: v1beta1.DeploymentSpec{ - Replicas: &replicas, - Selector: &metav1.LabelSelector{ - MatchLabels: map[string]string{"name": "myrs"}, - }, - Template: v1.PodTemplateSpec{ - ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{"name": "myrs"}, - }, - Spec: v1.PodSpec{ - Containers: []v1.Container{ - { - Name: "nginx", - Image: "nginx", - }, - }, - }, - }, - }, - } -} diff --git a/test/e2e_federation/replicaset.go b/test/e2e_federation/replicaset.go index 1e588ccf6a6..ff3bc4bb71a 100644 --- a/test/e2e_federation/replicaset.go +++ b/test/e2e_federation/replicaset.go @@ -20,7 +20,6 @@ import ( "encoding/json" "fmt" "reflect" - "strings" "time" "k8s.io/api/core/v1" @@ -82,62 +81,6 @@ var _ = framework.KubeDescribe("Federated ReplicaSet [Feature:Federation]", func clusters = f.GetRegisteredClusters() }) - // e2e cases for federated replicaset controller - Describe("CRUD", func() { - var ( - rs *v1beta1.ReplicaSet - ) - - BeforeEach(func() { - nsName := f.FederationNamespace.Name - - By(fmt.Sprintf("Creating a new replicaset in namespace %q", nsName)) - rs = createAndWaitForReplicasetOrFail(f.FederationClientset, nsName, clusters) - }) - - AfterEach(func() { - // Delete all replicasets. - nsName := f.FederationNamespace.Name - - By(fmt.Sprintf("Deleting replicaset \"%s/%s\"", nsName, rs.Name)) - orphanDependents := false - deleteReplicaSetOrFail(f.FederationClientset, nsName, rs.Name, &orphanDependents) - }) - - It("should create and update matching replicasets in underlying clusters", func() { - nsName := f.FederationNamespace.Name - - // As part of the update, we scale the replicaset here. - rs = newReplicaSetWithName(nsName, rs.Name, 15, nil) - updateReplicaSetOrFail(f.FederationClientset, rs) - waitForReplicaSetOrFail(f.FederationClientset, nsName, rs.Name, clusters, nil) - By(fmt.Sprintf("Successfully updated and synced replicaset \"%s/%s\" (%v/%v) to clusters", nsName, rs.Name, rs.Status.Replicas, *rs.Spec.Replicas)) - }) - - It("should be deleted from underlying clusters when OrphanDependents is false", func() { - fedframework.SkipUnlessFederated(f.ClientSet) - nsName := f.FederationNamespace.Name - orphanDependents := false - verifyCascadingDeletionForReplicaSet(f.FederationClientset, clusters, &orphanDependents, nsName, rs.Name) - By(fmt.Sprintf("Verified that replicasets were deleted from underlying clusters")) - }) - - It("should not be deleted from underlying clusters when OrphanDependents is true", func() { - fedframework.SkipUnlessFederated(f.ClientSet) - nsName := f.FederationNamespace.Name - orphanDependents := true - verifyCascadingDeletionForReplicaSet(f.FederationClientset, clusters, &orphanDependents, nsName, rs.Name) - By(fmt.Sprintf("Verified that replicasets were not deleted from underlying clusters")) - }) - - It("should not be deleted from underlying clusters when OrphanDependents is nil", func() { - fedframework.SkipUnlessFederated(f.ClientSet) - nsName := f.FederationNamespace.Name - verifyCascadingDeletionForReplicaSet(f.FederationClientset, clusters, nil, nsName, rs.Name) - By(fmt.Sprintf("Verified that replicasets were not deleted from underlying clusters")) - }) - }) - // e2e cases for federated replicaset controller Describe("Preferences", func() { var ( @@ -251,29 +194,6 @@ func deleteAllReplicaSetsOrFail(clientset *fedclientset.Clientset, nsName string } } -// verifyCascadingDeletionForReplicaSet verifies that replicaSets are deleted -// from underlying clusters when orphan dependents is false and they are not -// deleted when orphan dependents is true. -func verifyCascadingDeletionForReplicaSet(clientset *fedclientset.Clientset, clusters fedframework.ClusterSlice, orphanDependents *bool, nsName, rsName string) { - By(fmt.Sprintf("Deleting replica set %s", rsName)) - deleteReplicaSetOrFail(clientset, nsName, rsName, orphanDependents) - - By(fmt.Sprintf("Verifying replica sets %s in underlying clusters", rsName)) - errMessages := []string{} - for _, cluster := range clusters { - clusterName := cluster.Name - _, err := cluster.Extensions().ReplicaSets(nsName).Get(rsName, metav1.GetOptions{}) - if (orphanDependents == nil || *orphanDependents == true) && errors.IsNotFound(err) { - errMessages = append(errMessages, fmt.Sprintf("unexpected NotFound error for replica set %s in cluster %s, expected replica set to exist", rsName, clusterName)) - } else if (orphanDependents != nil && *orphanDependents == false) && (err == nil || !errors.IsNotFound(err)) { - errMessages = append(errMessages, fmt.Sprintf("expected NotFound error for replica set %s in cluster %s, got error: %v", rsName, clusterName, err)) - } - } - if len(errMessages) != 0 { - framework.Failf("%s", strings.Join(errMessages, "; ")) - } -} - func generateFedRSPrefsWithWeight(clusters fedframework.ClusterSlice) (pref *federation.ReplicaAllocationPreferences, replicas int32, expect map[string]int32) { By("Generating replicaset preferences with weights") clusterNames := extractClusterNames(clusters)