2016-08-12 06:24:03 +00:00
/ *
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 .
* /
2017-09-18 17:26:35 +00:00
package e2e
2016-08-12 06:24:03 +00:00
import (
"fmt"
"strings"
"time"
2017-06-22 17:25:57 +00:00
"k8s.io/api/core/v1"
2017-06-22 18:24:23 +00:00
"k8s.io/api/extensions/v1beta1"
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"
"k8s.io/apimachinery/pkg/util/wait"
2017-10-09 15:22:26 +00:00
"k8s.io/apiserver/pkg/storage/names"
2016-12-14 17:57:24 +00:00
clientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset/typed/core/v1"
2017-09-18 17:26:35 +00:00
fedframework "k8s.io/kubernetes/federation/test/e2e/framework"
2016-08-12 06:24:03 +00:00
"k8s.io/kubernetes/test/e2e/framework"
. "github.com/onsi/ginkgo"
)
const (
2017-02-11 01:12:07 +00:00
eventNamePrefix = "e2e-namespace-test-event-"
namespacePrefix = "e2e-namespace-test-"
replicaSetNamePrefix = "e2e-namespace-test-rs-"
2016-08-12 06:24:03 +00:00
)
// Create/delete ingress api objects
var _ = framework . KubeDescribe ( "Federation namespace [Feature:Federation]" , func ( ) {
2017-01-11 13:23:31 +00:00
f := fedframework . NewDefaultFederatedFramework ( "federation-namespace" )
2016-08-12 06:24:03 +00:00
Describe ( "Namespace objects" , func ( ) {
2017-04-04 16:21:38 +00:00
var clusters fedframework . ClusterSlice
2016-09-30 23:31:08 +00:00
2017-02-10 09:23:57 +00:00
var nsName string
2016-08-12 06:24:03 +00:00
BeforeEach ( func ( ) {
2017-01-11 13:23:31 +00:00
fedframework . SkipUnlessFederated ( f . ClientSet )
2017-04-04 16:21:38 +00:00
clusters = f . GetRegisteredClusters ( )
2016-08-12 06:24:03 +00:00
} )
AfterEach ( func ( ) {
2017-01-11 13:23:31 +00:00
fedframework . SkipUnlessFederated ( f . ClientSet )
2017-02-10 09:23:57 +00:00
deleteNamespace ( nil , nsName ,
f . FederationClientset . Core ( ) . Namespaces ( ) . Get ,
2017-01-11 13:23:31 +00:00
f . FederationClientset . Core ( ) . Namespaces ( ) . Delete )
2016-09-30 23:31:08 +00:00
for _ , cluster := range clusters {
2017-02-10 09:23:57 +00:00
deleteNamespace ( nil , nsName ,
2017-07-25 04:35:12 +00:00
cluster . CoreV1 ( ) . Namespaces ( ) . Get ,
cluster . CoreV1 ( ) . Namespaces ( ) . Delete )
2016-08-12 06:24:03 +00:00
}
} )
2017-02-11 01:12:07 +00:00
// See https://github.com/kubernetes/kubernetes/issues/38225
It ( "deletes replicasets in the namespace when the namespace is deleted" , func ( ) {
fedframework . SkipUnlessFederated ( f . ClientSet )
2017-02-15 19:00:09 +00:00
nsName = createNamespace ( f . FederationClientset . Core ( ) . Namespaces ( ) )
2017-10-09 15:22:26 +00:00
rsName := names . SimpleNameGenerator . GenerateName ( replicaSetNamePrefix )
2017-02-11 01:12:07 +00:00
replicaCount := int32 ( 2 )
rs := & v1beta1 . ReplicaSet {
ObjectMeta : metav1 . ObjectMeta {
Name : rsName ,
Namespace : nsName ,
} ,
Spec : v1beta1 . ReplicaSetSpec {
Replicas : & replicaCount ,
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" ,
} ,
} ,
} ,
} ,
} ,
}
By ( fmt . Sprintf ( "Creating replicaset %s in namespace %s" , rsName , nsName ) )
_ , err := f . FederationClientset . Extensions ( ) . ReplicaSets ( nsName ) . Create ( rs )
if err != nil {
framework . Failf ( "Failed to create replicaset %v in namespace %s, err: %s" , rs , nsName , err )
}
By ( fmt . Sprintf ( "Deleting namespace %s" , nsName ) )
deleteNamespace ( nil , nsName ,
f . FederationClientset . Core ( ) . Namespaces ( ) . Get ,
f . FederationClientset . Core ( ) . Namespaces ( ) . Delete )
By ( fmt . Sprintf ( "Verify that replicaset %s was deleted as well" , rsName ) )
waitForReplicaSetToBeDeletedOrFail ( f . FederationClientset , nsName , rsName )
} )
2016-11-05 03:26:52 +00:00
It ( "all resources in the namespace should be deleted when namespace is deleted" , func ( ) {
2017-01-11 13:23:31 +00:00
fedframework . SkipUnlessFederated ( f . ClientSet )
2016-11-05 03:26:52 +00:00
2017-02-10 09:23:57 +00:00
nsName = createNamespace ( f . FederationClientset . Core ( ) . Namespaces ( ) )
2016-11-05 03:26:52 +00:00
// Create resources in the namespace.
2017-02-11 01:12:07 +00:00
event := v1 . Event {
2017-01-17 03:38:19 +00:00
ObjectMeta : metav1 . ObjectMeta {
2017-10-09 15:22:26 +00:00
Name : names . SimpleNameGenerator . GenerateName ( eventNamePrefix ) ,
2016-11-05 03:26:52 +00:00
Namespace : nsName ,
} ,
2017-02-11 01:12:07 +00:00
InvolvedObject : v1 . ObjectReference {
2016-11-05 03:26:52 +00:00
Kind : "Pod" ,
Namespace : nsName ,
Name : "sample-pod" ,
2016-08-12 06:24:03 +00:00
} ,
}
2016-11-05 03:26:52 +00:00
By ( fmt . Sprintf ( "Creating event %s in namespace %s" , event . Name , nsName ) )
2017-01-11 13:23:31 +00:00
_ , err := f . FederationClientset . Core ( ) . Events ( nsName ) . Create ( & event )
2016-11-05 03:26:52 +00:00
if err != nil {
framework . Failf ( "Failed to create event %v in namespace %s, err: %s" , event , nsName , err )
}
By ( fmt . Sprintf ( "Deleting namespace %s" , nsName ) )
2017-02-10 09:23:57 +00:00
deleteNamespace ( nil , nsName ,
f . FederationClientset . Core ( ) . Namespaces ( ) . Get ,
2017-01-11 13:23:31 +00:00
f . FederationClientset . Core ( ) . Namespaces ( ) . Delete )
2016-11-05 03:26:52 +00:00
By ( fmt . Sprintf ( "Verify that event %s was deleted as well" , event . Name ) )
2017-01-11 13:23:31 +00:00
latestEvent , err := f . FederationClientset . Core ( ) . Events ( nsName ) . Get ( event . Name , metav1 . GetOptions { } )
2016-11-05 03:26:52 +00:00
if ! errors . IsNotFound ( err ) {
framework . Failf ( "Event %s should have been deleted. Found: %v" , event . Name , latestEvent )
2016-10-11 19:48:38 +00:00
}
By ( fmt . Sprintf ( "Verified that deletion succeeded" ) )
2016-08-12 06:24:03 +00:00
} )
} )
} )
2016-11-10 01:50:25 +00:00
// verifyNsCascadingDeletion verifies that namespaces are deleted from
// underlying clusters when orphan dependents is false and they are not
// deleted when orphan dependents is true.
2017-04-04 16:21:38 +00:00
func verifyNsCascadingDeletion ( nsClient clientset . NamespaceInterface , clusters fedframework . ClusterSlice , orphanDependents * bool ) string {
2016-11-05 03:26:52 +00:00
nsName := createNamespace ( nsClient )
// Check subclusters if the namespace was created there.
By ( fmt . Sprintf ( "Waiting for namespace %s to be created in all underlying clusters" , nsName ) )
err := wait . Poll ( 5 * time . Second , 2 * time . Minute , func ( ) ( bool , error ) {
for _ , cluster := range clusters {
2017-07-25 04:35:12 +00:00
_ , err := cluster . CoreV1 ( ) . Namespaces ( ) . Get ( nsName , metav1 . GetOptions { } )
2016-11-05 03:26:52 +00:00
if err != nil && ! errors . IsNotFound ( err ) {
return false , err
}
if err != nil {
return false , nil
}
}
return true , nil
} )
framework . ExpectNoError ( err , "Not all namespaces created" )
By ( fmt . Sprintf ( "Deleting namespace %s" , nsName ) )
2017-02-10 09:23:57 +00:00
deleteNamespace ( orphanDependents , nsName , nsClient . Get , nsClient . Delete )
2016-11-05 03:26:52 +00:00
By ( fmt . Sprintf ( "Verifying namespaces %s in underlying clusters" , nsName ) )
2016-11-05 05:55:34 +00:00
errMessages := [ ] string { }
2016-11-10 01:50:25 +00:00
// namespace should be present in underlying clusters unless orphanDependents is false.
shouldExist := orphanDependents == nil || * orphanDependents == true
2017-04-04 16:21:38 +00:00
for _ , cluster := range clusters {
clusterName := cluster . Name
2017-07-25 04:35:12 +00:00
_ , err := cluster . CoreV1 ( ) . Namespaces ( ) . Get ( nsName , metav1 . GetOptions { } )
2016-11-10 01:50:25 +00:00
if shouldExist && errors . IsNotFound ( err ) {
2016-11-05 05:55:34 +00:00
errMessages = append ( errMessages , fmt . Sprintf ( "unexpected NotFound error for namespace %s in cluster %s, expected namespace to exist" , nsName , clusterName ) )
2016-11-10 01:50:25 +00:00
} else if ! shouldExist && ! errors . IsNotFound ( err ) {
2016-11-05 05:55:34 +00:00
errMessages = append ( errMessages , fmt . Sprintf ( "expected NotFound error for namespace %s in cluster %s, got error: %v" , nsName , clusterName , err ) )
2016-11-05 03:26:52 +00:00
}
}
2016-11-05 05:55:34 +00:00
if len ( errMessages ) != 0 {
framework . Failf ( "%s" , strings . Join ( errMessages , "; " ) )
2016-11-05 03:26:52 +00:00
}
2017-02-10 09:23:57 +00:00
return nsName
2016-11-05 03:26:52 +00:00
}
func createNamespace ( nsClient clientset . NamespaceInterface ) string {
2017-02-11 01:12:07 +00:00
ns := v1 . Namespace {
2017-01-17 03:38:19 +00:00
ObjectMeta : metav1 . ObjectMeta {
2017-10-09 15:22:26 +00:00
Name : names . SimpleNameGenerator . GenerateName ( namespacePrefix ) ,
2016-11-05 03:26:52 +00:00
} ,
}
By ( fmt . Sprintf ( "Creating namespace %s" , ns . Name ) )
_ , err := nsClient . Create ( & ns )
framework . ExpectNoError ( err , "Failed to create namespace %s" , ns . Name )
By ( fmt . Sprintf ( "Created namespace %s" , ns . Name ) )
return ns . Name
}
2017-02-10 09:23:57 +00:00
func deleteNamespace ( orphanDependents * bool , namespace string , getter func ( name string , options metav1 . GetOptions ) ( * v1 . Namespace , error ) , deleter func ( string , * metav1 . DeleteOptions ) error ) {
By ( fmt . Sprintf ( "Deleting namespace: %s" , namespace ) )
err := deleter ( namespace , & metav1 . DeleteOptions { OrphanDependents : orphanDependents } )
if errors . IsNotFound ( err ) {
2016-08-25 08:26:08 +00:00
return
2017-02-10 09:23:57 +00:00
} else if err != nil {
framework . Failf ( "Failed to set %s for deletion: %v" , namespace , err )
2016-08-25 08:26:08 +00:00
}
2017-02-10 09:23:57 +00:00
waitForNamespaceDeletion ( namespace , getter )
2016-08-25 08:26:08 +00:00
}
2017-02-10 09:23:57 +00:00
func waitForNamespaceDeletion ( namespace string , getter func ( name string , options metav1 . GetOptions ) ( * v1 . Namespace , error ) ) {
2016-08-25 12:54:04 +00:00
err := wait . Poll ( 5 * time . Second , 2 * time . Minute , func ( ) ( bool , error ) {
2017-02-10 09:23:57 +00:00
_ , err := getter ( namespace , metav1 . GetOptions { } )
2017-02-10 20:05:10 +00:00
if errors . IsNotFound ( err ) {
return true , nil
} else if err != nil {
2016-08-25 12:54:04 +00:00
return false , err
}
2017-02-10 20:05:10 +00:00
return false , nil
2016-08-25 12:54:04 +00:00
} )
if err != nil {
framework . Failf ( "Namespaces not deleted: %v" , err )
2016-08-12 06:24:03 +00:00
}
}