2016-06-17 04:07:39 +00:00
/ *
2016-06-03 00:25:58 +00:00
Copyright 2016 The Kubernetes Authors .
2016-06-17 04:07:39 +00:00
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 .
* /
2017-01-11 13:23:31 +00:00
package e2e_federation
2016-06-17 04:07:39 +00:00
import (
"fmt"
2016-07-29 08:01:41 +00:00
"time"
2017-01-13 17:48:50 +00:00
"k8s.io/apimachinery/pkg/api/errors"
2017-01-11 14:09:48 +00:00
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2017-03-08 21:24:20 +00:00
"k8s.io/apimachinery/pkg/util/intstr"
"k8s.io/apimachinery/pkg/util/rand"
2017-01-11 14:09:48 +00:00
"k8s.io/apimachinery/pkg/util/wait"
2016-08-10 20:43:57 +00:00
federationapi "k8s.io/kubernetes/federation/apis/federation/v1beta1"
2016-12-14 17:57:24 +00:00
fedclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset"
2016-08-10 20:43:57 +00:00
"k8s.io/kubernetes/pkg/api/v1"
2016-12-14 01:18:17 +00:00
kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
2017-06-05 17:08:34 +00:00
"k8s.io/kubernetes/pkg/cloudprovider"
2017-01-11 13:23:31 +00:00
"k8s.io/kubernetes/test/e2e/common"
2016-06-17 04:07:39 +00:00
"k8s.io/kubernetes/test/e2e/framework"
2017-01-11 13:23:31 +00:00
fedframework "k8s.io/kubernetes/test/e2e_federation/framework"
2016-07-29 08:01:41 +00:00
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var (
2017-03-22 05:28:59 +00:00
DefaultFederationName = "e2e-federation"
2016-07-29 08:01:41 +00:00
// We use this to decide how long to wait for our DNS probes to succeed.
DNSTTL = 180 * time . Second // TODO: make k8s.io/kubernetes/federation/pkg/federation-controller/service.minDnsTtl exported, and import it here.
2016-06-17 04:07:39 +00:00
)
2017-03-06 17:48:08 +00:00
const (
2017-03-08 21:24:20 +00:00
// [30000, 32767] is the allowed default service nodeport range and our
// tests just use the defaults.
FederatedSvcNodePortFirst = 30000
FederatedSvcNodePortLast = 32767
2017-03-06 17:48:08 +00:00
)
2017-01-11 13:23:31 +00:00
var FederationSuite common . Suite
2017-04-21 10:56:06 +00:00
func createClusterObjectOrFail ( f * fedframework . Framework , context * fedframework . E2EContext , clusterNamePrefix string ) {
clusterName := clusterNamePrefix + context . Name
framework . Logf ( "Creating cluster object: %s (%s, secret: %s)" , clusterName , context . Cluster . Cluster . Server , context . Name )
2016-06-17 04:07:39 +00:00
cluster := federationapi . Cluster {
2017-01-17 03:38:19 +00:00
ObjectMeta : metav1 . ObjectMeta {
2017-04-21 10:56:06 +00:00
Name : clusterName ,
2016-06-17 04:07:39 +00:00
} ,
Spec : federationapi . ClusterSpec {
ServerAddressByClientCIDRs : [ ] federationapi . ServerAddressByClientCIDR {
{
ClientCIDR : "0.0.0.0/0" ,
ServerAddress : context . Cluster . Cluster . Server ,
} ,
} ,
2016-08-10 20:43:57 +00:00
SecretRef : & v1 . LocalObjectReference {
2016-06-17 04:07:39 +00:00
// Note: Name must correlate with federation build script secret name,
// which currently matches the cluster name.
// See federation/cluster/common.sh:132
Name : context . Name ,
} ,
} ,
}
2017-04-21 10:56:06 +00:00
if clusterNamePrefix != "" {
cluster . Labels = map [ string ] string { "prefix" : clusterNamePrefix }
}
2017-01-11 13:23:31 +00:00
_ , err := f . FederationClientset . Federation ( ) . Clusters ( ) . Create ( & cluster )
2016-06-17 04:07:39 +00:00
framework . ExpectNoError ( err , fmt . Sprintf ( "creating cluster: %+v" , err ) )
2017-04-21 10:56:06 +00:00
framework . Logf ( "Successfully created cluster object: %s (%s, secret: %s)" , clusterName , context . Cluster . Cluster . Server , context . Name )
2016-06-17 04:07:39 +00:00
}
2017-02-13 22:58:49 +00:00
// waitForServiceOrFail waits until a service is either present or absent in the cluster specified by clientset.
// If the condition is not met within timout, it fails the calling test.
2016-09-02 18:57:44 +00:00
func waitForServiceOrFail ( clientset * kubeclientset . Clientset , namespace string , service * v1 . Service , present bool , timeout time . Duration ) {
2016-07-29 08:01:41 +00:00
By ( fmt . Sprintf ( "Fetching a federated service shard of service %q in namespace %q from cluster" , service . Name , namespace ) )
err := wait . PollImmediate ( framework . Poll , timeout , func ( ) ( bool , error ) {
2016-12-07 14:40:26 +00:00
clusterService , err := clientset . Services ( namespace ) . Get ( service . Name , metav1 . GetOptions { } )
2016-07-29 08:01:41 +00:00
if ( ! present ) && errors . IsNotFound ( err ) { // We want it gone, and it's gone.
By ( fmt . Sprintf ( "Success: shard of federated service %q in namespace %q in cluster is absent" , service . Name , namespace ) )
return true , nil // Success
}
if present && err == nil { // We want it present, and the Get succeeded, so we're all good.
2017-02-14 07:20:42 +00:00
if equivalent ( * clusterService , * service ) {
By ( fmt . Sprintf ( "Success: shard of federated service %q in namespace %q in cluster is present" , service . Name , namespace ) )
return true , nil // Success
}
return false , nil
2016-07-29 08:01:41 +00:00
}
By ( fmt . Sprintf ( "Service %q in namespace %q in cluster. Found: %v, waiting for Found: %v, trying again in %s (err=%v)" , service . Name , namespace , clusterService != nil && err == nil , present , framework . Poll , err ) )
return false , nil
} )
framework . ExpectNoError ( err , "Failed to verify service %q in namespace %q in cluster: Present=%v" , service . Name , namespace , present )
}
2017-02-13 22:58:49 +00:00
// waitForServiceShardsOrFail waits for the service to appear in all clusters
2017-04-04 16:21:38 +00:00
func waitForServiceShardsOrFail ( namespace string , service * v1 . Service , clusters fedframework . ClusterSlice ) {
2016-07-29 08:01:41 +00:00
framework . Logf ( "Waiting for service %q in %d clusters" , service . Name , len ( clusters ) )
for _ , c := range clusters {
2017-03-22 05:28:59 +00:00
waitForServiceOrFail ( c . Clientset , namespace , service , true , fedframework . FederatedDefaultTestTimeout )
2016-07-29 08:01:41 +00:00
}
}
2016-09-02 18:57:44 +00:00
func createService ( clientset * fedclientset . Clientset , namespace , name string ) ( * v1 . Service , error ) {
2016-07-29 08:01:41 +00:00
if clientset == nil || len ( namespace ) == 0 {
return nil , fmt . Errorf ( "Internal error: invalid parameters passed to createService: clientset: %v, namespace: %v" , clientset , namespace )
}
By ( fmt . Sprintf ( "Creating federated service %q in namespace %q" , name , namespace ) )
2017-04-28 11:03:34 +00:00
service := & v1 . Service {
ObjectMeta : metav1 . ObjectMeta {
Name : name ,
Namespace : namespace ,
} ,
Spec : v1 . ServiceSpec {
Selector : FederatedServiceLabels ,
Type : v1 . ServiceTypeClusterIP ,
Ports : [ ] v1 . ServicePort {
{
Name : "http" ,
Protocol : v1 . ProtocolTCP ,
Port : 80 ,
TargetPort : intstr . FromInt ( 8080 ) ,
} ,
} ,
SessionAffinity : v1 . ServiceAffinityNone ,
} ,
}
By ( fmt . Sprintf ( "Trying to create service %q in namespace %q" , service . Name , namespace ) )
return clientset . Services ( namespace ) . Create ( service )
}
func createLBService ( clientset * fedclientset . Clientset , namespace , name string ) ( * v1 . Service , error ) {
if clientset == nil || len ( namespace ) == 0 {
return nil , fmt . Errorf ( "Internal error: invalid parameters passed to createService: clientset: %v, namespace: %v" , clientset , namespace )
}
By ( fmt . Sprintf ( "Creating federated service (type: load balancer) %q in namespace %q" , name , namespace ) )
2017-03-08 21:24:20 +00:00
// Tests can be run in parallel, so we need a different nodePort for
// each test.
// We add 1 to FederatedSvcNodePortLast because IntnRange's range end
// is not inclusive.
nodePort := int32 ( rand . IntnRange ( FederatedSvcNodePortFirst , FederatedSvcNodePortLast + 1 ) )
2016-07-29 08:01:41 +00:00
service := & v1 . Service {
2017-01-17 03:38:19 +00:00
ObjectMeta : metav1 . ObjectMeta {
2016-08-22 17:48:43 +00:00
Name : name ,
Namespace : namespace ,
2016-07-29 08:01:41 +00:00
} ,
Spec : v1 . ServiceSpec {
Selector : FederatedServiceLabels ,
2017-04-28 11:03:34 +00:00
Type : v1 . ServiceTypeLoadBalancer ,
2016-07-29 08:01:41 +00:00
Ports : [ ] v1 . ServicePort {
{
Name : "http" ,
2016-10-21 05:30:46 +00:00
Protocol : v1 . ProtocolTCP ,
2016-07-29 08:01:41 +00:00
Port : 80 ,
TargetPort : intstr . FromInt ( 8080 ) ,
2017-03-08 21:24:20 +00:00
NodePort : nodePort ,
2016-07-29 08:01:41 +00:00
} ,
} ,
2016-10-21 05:30:46 +00:00
SessionAffinity : v1 . ServiceAffinityNone ,
2016-07-29 08:01:41 +00:00
} ,
}
2017-04-28 11:03:34 +00:00
2016-07-29 08:01:41 +00:00
By ( fmt . Sprintf ( "Trying to create service %q in namespace %q" , service . Name , namespace ) )
return clientset . Services ( namespace ) . Create ( service )
}
2016-09-02 18:57:44 +00:00
func createServiceOrFail ( clientset * fedclientset . Clientset , namespace , name string ) * v1 . Service {
2016-07-29 08:01:41 +00:00
service , err := createService ( clientset , namespace , name )
framework . ExpectNoError ( err , "Creating service %q in namespace %q" , service . Name , namespace )
By ( fmt . Sprintf ( "Successfully created federated service %q in namespace %q" , name , namespace ) )
return service
}
2017-04-28 11:03:34 +00:00
func createLBServiceOrFail ( clientset * fedclientset . Clientset , namespace , name string ) * v1 . Service {
service , err := createLBService ( clientset , namespace , name )
framework . ExpectNoError ( err , "Creating service %q in namespace %q" , service . Name , namespace )
By ( fmt . Sprintf ( "Successfully created federated service (type: load balancer) %q in namespace %q" , name , namespace ) )
return service
}
2016-12-17 00:06:06 +00:00
func deleteServiceOrFail ( clientset * fedclientset . Clientset , namespace string , serviceName string , orphanDependents * bool ) {
2016-07-29 08:01:41 +00:00
if clientset == nil || len ( namespace ) == 0 || len ( serviceName ) == 0 {
Fail ( fmt . Sprintf ( "Internal error: invalid parameters passed to deleteServiceOrFail: clientset: %v, namespace: %v, service: %v" , clientset , namespace , serviceName ) )
}
2017-02-22 01:39:26 +00:00
framework . Logf ( "Deleting service %q in namespace %v" , serviceName , namespace )
2017-01-24 15:38:21 +00:00
err := clientset . Services ( namespace ) . Delete ( serviceName , & metav1 . DeleteOptions { OrphanDependents : orphanDependents } )
2016-07-29 08:01:41 +00:00
framework . ExpectNoError ( err , "Error deleting service %q from namespace %q" , serviceName , namespace )
2016-12-17 00:06:06 +00:00
// Wait for the service to be deleted.
2017-03-22 05:28:59 +00:00
err = wait . Poll ( 5 * time . Second , fedframework . FederatedDefaultTestTimeout , func ( ) ( bool , error ) {
2016-12-17 00:06:06 +00:00
_ , err := clientset . Core ( ) . Services ( namespace ) . Get ( serviceName , metav1 . GetOptions { } )
if err != nil && errors . IsNotFound ( err ) {
return true , nil
}
return false , err
} )
if err != nil {
2017-03-20 21:35:37 +00:00
framework . DescribeSvc ( namespace )
2016-12-17 00:06:06 +00:00
framework . Failf ( "Error in deleting service %s: %v" , serviceName , err )
}
2016-07-29 08:01:41 +00:00
}
2017-04-04 16:21:38 +00:00
func cleanupServiceShardsAndProviderResources ( namespace string , service * v1 . Service , clusters fedframework . ClusterSlice ) {
2016-09-09 21:07:42 +00:00
framework . Logf ( "Deleting service %q in %d clusters" , service . Name , len ( clusters ) )
2017-04-04 16:21:38 +00:00
for _ , c := range clusters {
name := c . Name
2016-09-22 20:01:45 +00:00
var cSvc * v1 . Service
2017-03-22 05:28:59 +00:00
err := wait . PollImmediate ( framework . Poll , fedframework . FederatedDefaultTestTimeout , func ( ) ( bool , error ) {
2016-09-22 20:01:45 +00:00
var err error
2016-12-07 14:40:26 +00:00
cSvc , err = c . Clientset . Services ( namespace ) . Get ( service . Name , metav1 . GetOptions { } )
2016-09-22 20:01:45 +00:00
if err != nil && ! errors . IsNotFound ( err ) {
// Get failed with an error, try again.
framework . Logf ( "Failed to find service %q in namespace %q, in cluster %q: %v. Trying again in %s" , service . Name , namespace , name , err , framework . Poll )
return false , nil
2016-09-30 18:54:39 +00:00
} else if errors . IsNotFound ( err ) {
cSvc = nil
By ( fmt . Sprintf ( "Service %q in namespace %q in cluster %q not found" , service . Name , namespace , name ) )
2016-09-30 22:13:02 +00:00
return true , err
2016-09-22 20:01:45 +00:00
}
By ( fmt . Sprintf ( "Service %q in namespace %q in cluster %q found" , service . Name , namespace , name ) )
2016-09-30 22:13:02 +00:00
return true , err
2016-09-22 20:01:45 +00:00
} )
if err != nil || cSvc == nil {
2017-03-22 05:28:59 +00:00
By ( fmt . Sprintf ( "Failed to find service %q in namespace %q, in cluster %q in %s" , service . Name , namespace , name , fedframework . FederatedDefaultTestTimeout ) )
2016-09-30 18:54:39 +00:00
continue
2016-09-22 20:01:45 +00:00
}
2017-06-05 17:08:34 +00:00
if cSvc . Spec . Type == v1 . ServiceTypeLoadBalancer {
// In federation tests, e2e zone names are used to derive federation member cluster names
zone := fedframework . GetZoneFromClusterName ( name )
serviceLBName := cloudprovider . GetLoadBalancerName ( cSvc )
framework . Logf ( "cleaning cloud provider resource for service %q in namespace %q, in cluster %q" , service . Name , namespace , name )
framework . CleanupServiceResources ( serviceLBName , zone )
}
2017-03-22 05:28:59 +00:00
err = cleanupServiceShard ( c . Clientset , name , namespace , cSvc , fedframework . FederatedDefaultTestTimeout )
2016-09-09 21:07:42 +00:00
if err != nil {
framework . Logf ( "Failed to delete service %q in namespace %q, in cluster %q: %v" , service . Name , namespace , name , err )
}
}
}
2016-09-02 18:57:44 +00:00
func cleanupServiceShard ( clientset * kubeclientset . Clientset , clusterName , namespace string , service * v1 . Service , timeout time . Duration ) error {
2016-09-09 21:07:42 +00:00
err := wait . PollImmediate ( framework . Poll , timeout , func ( ) ( bool , error ) {
2017-01-24 15:38:21 +00:00
err := clientset . Services ( namespace ) . Delete ( service . Name , & metav1 . DeleteOptions { } )
2016-09-09 21:07:42 +00:00
if err != nil && ! errors . IsNotFound ( err ) {
// Deletion failed with an error, try again.
framework . Logf ( "Failed to delete service %q in namespace %q, in cluster %q" , service . Name , namespace , clusterName )
return false , nil
}
By ( fmt . Sprintf ( "Service %q in namespace %q in cluster %q deleted" , service . Name , namespace , clusterName ) )
return true , nil
} )
return err
}
2017-01-11 13:23:31 +00:00
func podExitCodeDetector ( f * fedframework . Framework , name , namespace string , code int32 ) func ( ) error {
2016-07-29 08:01:41 +00:00
// If we ever get any container logs, stash them here.
logs := ""
logerr := func ( err error ) error {
if err == nil {
return nil
}
if logs == "" {
return err
}
return fmt . Errorf ( "%s (%v)" , logs , err )
}
return func ( ) error {
2016-12-07 14:40:26 +00:00
pod , err := f . ClientSet . Core ( ) . Pods ( namespace ) . Get ( name , metav1 . GetOptions { } )
2016-07-29 08:01:41 +00:00
if err != nil {
return logerr ( err )
}
if len ( pod . Status . ContainerStatuses ) < 1 {
return logerr ( fmt . Errorf ( "no container statuses" ) )
}
// Best effort attempt to grab pod logs for debugging
2016-10-18 13:00:38 +00:00
logs , err = framework . GetPodLogs ( f . ClientSet , namespace , name , pod . Spec . Containers [ 0 ] . Name )
2016-07-29 08:01:41 +00:00
if err != nil {
framework . Logf ( "Cannot fetch pod logs: %v" , err )
}
status := pod . Status . ContainerStatuses [ 0 ]
if status . State . Terminated == nil {
return logerr ( fmt . Errorf ( "container is not in terminated state" ) )
}
if status . State . Terminated . ExitCode == code {
return nil
}
return logerr ( fmt . Errorf ( "exited %d" , status . State . Terminated . ExitCode ) )
}
}
2017-01-11 13:23:31 +00:00
func discoverService ( f * fedframework . Framework , name string , exists bool , podName string ) {
2016-07-29 08:01:41 +00:00
command := [ ] string { "sh" , "-c" , fmt . Sprintf ( "until nslookup '%s'; do sleep 10; done" , name ) }
By ( fmt . Sprintf ( "Looking up %q" , name ) )
2016-11-18 20:55:17 +00:00
pod := & v1 . Pod {
2017-01-17 03:38:19 +00:00
ObjectMeta : metav1 . ObjectMeta {
2016-07-29 08:01:41 +00:00
Name : podName ,
} ,
2016-11-18 20:55:17 +00:00
Spec : v1 . PodSpec {
Containers : [ ] v1 . Container {
2016-07-29 08:01:41 +00:00
{
Name : "federated-service-discovery-container" ,
Image : "gcr.io/google_containers/busybox:1.24" ,
Command : command ,
} ,
} ,
2016-11-18 20:55:17 +00:00
RestartPolicy : v1 . RestartPolicyOnFailure ,
2016-07-29 08:01:41 +00:00
} ,
}
2016-08-22 17:48:43 +00:00
nsName := f . FederationNamespace . Name
By ( fmt . Sprintf ( "Creating pod %q in namespace %q" , pod . Name , nsName ) )
2016-10-18 13:00:38 +00:00
_ , err := f . ClientSet . Core ( ) . Pods ( nsName ) . Create ( pod )
2016-07-29 08:01:41 +00:00
framework . ExpectNoError ( err , "Trying to create pod to run %q" , command )
2016-08-22 17:48:43 +00:00
By ( fmt . Sprintf ( "Successfully created pod %q in namespace %q" , pod . Name , nsName ) )
2016-07-29 08:01:41 +00:00
defer func ( ) {
2016-08-22 17:48:43 +00:00
By ( fmt . Sprintf ( "Deleting pod %q from namespace %q" , podName , nsName ) )
2017-01-24 15:38:21 +00:00
err := f . ClientSet . Core ( ) . Pods ( nsName ) . Delete ( podName , metav1 . NewDeleteOptions ( 0 ) )
2016-08-22 17:48:43 +00:00
framework . ExpectNoError ( err , "Deleting pod %q from namespace %q" , podName , nsName )
By ( fmt . Sprintf ( "Deleted pod %q from namespace %q" , podName , nsName ) )
2016-07-29 08:01:41 +00:00
} ( )
if exists {
// TODO(mml): Eventually check the IP address is correct, too.
2016-08-22 17:48:43 +00:00
Eventually ( podExitCodeDetector ( f , podName , nsName , 0 ) , 3 * DNSTTL , time . Second * 2 ) .
2016-07-29 08:01:41 +00:00
Should ( BeNil ( ) , "%q should exit 0, but it never did" , command )
} else {
2016-08-22 17:48:43 +00:00
Eventually ( podExitCodeDetector ( f , podName , nsName , 0 ) , 3 * DNSTTL , time . Second * 2 ) .
2016-07-29 08:01:41 +00:00
ShouldNot ( BeNil ( ) , "%q should eventually not exit 0, but it always did" , command )
}
}
2017-04-04 15:49:23 +00:00
// BackendPodMap maps a cluster name to a backend pod created in that cluster
type BackendPodMap map [ string ] * v1 . Pod
// createBackendPodsOrFail creates one pod in each cluster, and returns the created pods. If creation of any pod fails,
// the test fails (possibly with a partially created set of pods). No retries are attempted.
2017-04-04 16:21:38 +00:00
func createBackendPodsOrFail ( clusters fedframework . ClusterSlice , namespace string , name string ) BackendPodMap {
2016-07-29 08:01:41 +00:00
pod := & v1 . Pod {
2017-01-17 03:38:19 +00:00
ObjectMeta : metav1 . ObjectMeta {
2016-07-29 08:01:41 +00:00
Name : name ,
// Namespace: namespace,
Labels : FederatedServiceLabels ,
} ,
Spec : v1 . PodSpec {
Containers : [ ] v1 . Container {
{
Name : name ,
Image : "gcr.io/google_containers/echoserver:1.4" ,
} ,
} ,
RestartPolicy : v1 . RestartPolicyAlways ,
} ,
}
2017-04-04 15:49:23 +00:00
podMap := make ( BackendPodMap )
2017-04-04 16:21:38 +00:00
for _ , c := range clusters {
name := c . Name
2016-07-29 08:01:41 +00:00
By ( fmt . Sprintf ( "Creating pod %q in namespace %q in cluster %q" , pod . Name , namespace , name ) )
createdPod , err := c . Clientset . Core ( ) . Pods ( namespace ) . Create ( pod )
framework . ExpectNoError ( err , "Creating pod %q in namespace %q in cluster %q" , name , namespace , name )
By ( fmt . Sprintf ( "Successfully created pod %q in namespace %q in cluster %q: %v" , pod . Name , namespace , name , * createdPod ) )
2017-04-04 15:49:23 +00:00
podMap [ name ] = createdPod
2016-07-29 08:01:41 +00:00
}
2017-04-04 15:49:23 +00:00
return podMap
2016-07-29 08:01:41 +00:00
}
2017-02-13 22:58:49 +00:00
// deleteOneBackendPodOrFail deletes exactly one backend pod which must not be nil
// The test fails if there are any errors.
2017-04-04 15:49:23 +00:00
func deleteOneBackendPodOrFail ( c * fedframework . Cluster , pod * v1 . Pod ) {
2016-07-29 08:01:41 +00:00
Expect ( pod ) . ToNot ( BeNil ( ) )
2017-01-24 15:38:21 +00:00
err := c . Clientset . Core ( ) . Pods ( pod . Namespace ) . Delete ( pod . Name , metav1 . NewDeleteOptions ( 0 ) )
2017-03-22 05:28:59 +00:00
msgFmt := fmt . Sprintf ( "Deleting Pod %q in namespace %q in cluster %q %%v" , pod . Name , pod . Namespace , c . Name )
2016-07-29 08:01:41 +00:00
if errors . IsNotFound ( err ) {
2017-03-13 23:47:33 +00:00
framework . Logf ( msgFmt , "does not exist. No need to delete it." )
return
2016-07-29 08:01:41 +00:00
}
2017-03-13 23:47:33 +00:00
framework . ExpectNoError ( err , msgFmt , "" )
framework . Logf ( msgFmt , "was deleted" )
2016-07-29 08:01:41 +00:00
}
2017-02-13 22:58:49 +00:00
// deleteBackendPodsOrFail deletes one pod from each cluster that has one.
// If deletion of any pod fails, the test fails (possibly with a partially deleted set of pods). No retries are attempted.
2017-04-04 16:21:38 +00:00
func deleteBackendPodsOrFail ( clusters fedframework . ClusterSlice , backendPods BackendPodMap ) {
2017-04-04 15:49:23 +00:00
if backendPods == nil {
return
}
2017-04-04 16:21:38 +00:00
for _ , c := range clusters {
if pod , ok := backendPods [ c . Name ] ; ok {
2017-04-04 15:49:23 +00:00
deleteOneBackendPodOrFail ( c , pod )
2016-07-29 08:01:41 +00:00
} else {
2017-04-04 16:21:38 +00:00
By ( fmt . Sprintf ( "No backend pod to delete for cluster %q" , c . Name ) )
2016-07-29 08:01:41 +00:00
}
}
}
2017-02-11 01:12:07 +00:00
// waitForReplicatSetToBeDeletedOrFail waits for the named ReplicaSet in namespace to be deleted.
// If the deletion fails, the enclosing test fails.
func waitForReplicaSetToBeDeletedOrFail ( clientset * fedclientset . Clientset , namespace string , replicaSet string ) {
2017-03-22 05:28:59 +00:00
err := wait . Poll ( 5 * time . Second , fedframework . FederatedDefaultTestTimeout , func ( ) ( bool , error ) {
2017-02-11 01:12:07 +00:00
_ , err := clientset . Extensions ( ) . ReplicaSets ( namespace ) . Get ( replicaSet , metav1 . GetOptions { } )
if err != nil && errors . IsNotFound ( err ) {
return true , nil
}
return false , err
} )
if err != nil {
framework . Failf ( "Error in deleting replica set %s: %v" , replicaSet , err )
}
}