2017-02-01 00:45:59 +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-02-03 13:41:32 +00:00
package e2e_federation
2017-02-01 00:45:59 +00:00
import (
"fmt"
"os"
"strings"
"time"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/wait"
clientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset/typed/core/v1"
"k8s.io/kubernetes/pkg/api/v1"
api_v1 "k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/test/e2e/framework"
2017-02-03 13:41:32 +00:00
fedframework "k8s.io/kubernetes/test/e2e_federation/framework"
2017-02-01 00:45:59 +00:00
. "github.com/onsi/ginkgo"
)
const (
namespacePrefix = "e2e-namespace-test-"
eventNamePrefix = "e2e-namespace-test-event-"
)
// Create/delete ingress api objects
var _ = framework . KubeDescribe ( "Federation namespace [Feature:Federation]" , func ( ) {
2017-02-03 13:41:32 +00:00
f := fedframework . NewDefaultFederatedFramework ( "federation-namespace" )
2017-02-01 00:45:59 +00:00
Describe ( "Namespace objects" , func ( ) {
var federationName string
var clusters map [ string ] * cluster // All clusters, keyed by cluster name
BeforeEach ( func ( ) {
2017-02-03 13:41:32 +00:00
fedframework . SkipUnlessFederated ( f . ClientSet )
2017-02-01 00:45:59 +00:00
// TODO: Federation API server should be able to answer this.
if federationName = os . Getenv ( "FEDERATION_NAME" ) ; federationName == "" {
federationName = DefaultFederationName
}
clusters = map [ string ] * cluster { }
registerClusters ( clusters , UserAgentName , federationName , f )
} )
AfterEach ( func ( ) {
2017-02-03 13:41:32 +00:00
fedframework . SkipUnlessFederated ( f . ClientSet )
2017-02-01 00:45:59 +00:00
deleteAllTestNamespaces ( nil ,
2017-02-03 13:41:32 +00:00
f . FederationClientset . Core ( ) . Namespaces ( ) . List ,
f . FederationClientset . Core ( ) . Namespaces ( ) . Delete )
2017-02-01 00:45:59 +00:00
for _ , cluster := range clusters {
deleteAllTestNamespaces ( nil ,
cluster . Core ( ) . Namespaces ( ) . List ,
cluster . Core ( ) . Namespaces ( ) . Delete )
}
unregisterClusters ( clusters , f )
} )
It ( "should be created and deleted successfully" , func ( ) {
2017-02-03 13:41:32 +00:00
fedframework . SkipUnlessFederated ( f . ClientSet )
2017-02-01 00:45:59 +00:00
2017-02-03 13:41:32 +00:00
nsName := createNamespace ( f . FederationClientset . Core ( ) . Namespaces ( ) )
2017-02-01 00:45:59 +00:00
By ( fmt . Sprintf ( "Deleting namespace %s" , nsName ) )
deleteAllTestNamespaces ( nil ,
2017-02-03 13:41:32 +00:00
f . FederationClientset . Core ( ) . Namespaces ( ) . List ,
f . FederationClientset . Core ( ) . Namespaces ( ) . Delete )
2017-02-01 00:45:59 +00:00
By ( fmt . Sprintf ( "Verified that deletion succeeded" ) )
} )
It ( "should be deleted from underlying clusters when OrphanDependents is false" , func ( ) {
2017-02-03 13:41:32 +00:00
fedframework . SkipUnlessFederated ( f . ClientSet )
2017-02-01 00:45:59 +00:00
orphanDependents := false
2017-02-03 13:41:32 +00:00
verifyNsCascadingDeletion ( f . FederationClientset . Core ( ) . Namespaces ( ) , clusters , & orphanDependents )
2017-02-01 00:45:59 +00:00
By ( fmt . Sprintf ( "Verified that namespaces were deleted from underlying clusters" ) )
} )
It ( "should not be deleted from underlying clusters when OrphanDependents is true" , func ( ) {
2017-02-03 13:41:32 +00:00
fedframework . SkipUnlessFederated ( f . ClientSet )
2017-02-01 00:45:59 +00:00
orphanDependents := true
2017-02-03 13:41:32 +00:00
verifyNsCascadingDeletion ( f . FederationClientset . Core ( ) . Namespaces ( ) , clusters , & orphanDependents )
2017-02-01 00:45:59 +00:00
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 ( ) {
2017-02-03 13:41:32 +00:00
fedframework . SkipUnlessFederated ( f . ClientSet )
2017-02-01 00:45:59 +00:00
2017-02-03 13:41:32 +00:00
verifyNsCascadingDeletion ( f . FederationClientset . Core ( ) . Namespaces ( ) , clusters , nil )
2017-02-01 00:45:59 +00:00
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 ( ) {
2017-02-03 13:41:32 +00:00
fedframework . SkipUnlessFederated ( f . ClientSet )
2017-02-01 00:45:59 +00:00
2017-02-03 13:41:32 +00:00
nsName := createNamespace ( f . FederationClientset . Core ( ) . Namespaces ( ) )
2017-02-01 00:45:59 +00:00
// Create resources in the namespace.
event := api_v1 . Event {
2017-02-03 13:41:32 +00:00
ObjectMeta : metav1 . ObjectMeta {
2017-02-01 00:45:59 +00:00
Name : v1 . SimpleNameGenerator . GenerateName ( eventNamePrefix ) ,
Namespace : nsName ,
} ,
InvolvedObject : api_v1 . ObjectReference {
Kind : "Pod" ,
Namespace : nsName ,
Name : "sample-pod" ,
} ,
}
By ( fmt . Sprintf ( "Creating event %s in namespace %s" , event . Name , nsName ) )
2017-02-03 13:41:32 +00:00
_ , err := f . FederationClientset . Core ( ) . Events ( nsName ) . Create ( & event )
2017-02-01 00:45:59 +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 ) )
deleteAllTestNamespaces ( nil ,
2017-02-03 13:41:32 +00:00
f . FederationClientset . Core ( ) . Namespaces ( ) . List ,
f . FederationClientset . Core ( ) . Namespaces ( ) . Delete )
2017-02-01 00:45:59 +00:00
By ( fmt . Sprintf ( "Verify that event %s was deleted as well" , event . Name ) )
2017-02-03 13:41:32 +00:00
latestEvent , err := f . FederationClientset . Core ( ) . Events ( nsName ) . Get ( event . Name , metav1 . GetOptions { } )
2017-02-01 00:45:59 +00:00
if ! errors . IsNotFound ( err ) {
framework . Failf ( "Event %s should have been deleted. Found: %v" , event . Name , latestEvent )
}
By ( fmt . Sprintf ( "Verified that deletion succeeded" ) )
} )
} )
} )
// verifyNsCascadingDeletion verifies that namespaces are deleted from
// underlying clusters when orphan dependents is false and they are not
// deleted when orphan dependents is true.
func verifyNsCascadingDeletion ( nsClient clientset . NamespaceInterface , clusters map [ string ] * cluster , orphanDependents * bool ) {
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 {
_ , err := cluster . Core ( ) . Namespaces ( ) . Get ( nsName , metav1 . GetOptions { } )
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 ) )
deleteAllTestNamespaces ( orphanDependents , nsClient . List , nsClient . Delete )
By ( fmt . Sprintf ( "Verifying namespaces %s in underlying clusters" , nsName ) )
errMessages := [ ] string { }
// namespace should be present in underlying clusters unless orphanDependents is false.
shouldExist := orphanDependents == nil || * orphanDependents == true
for clusterName , clusterClientset := range clusters {
_ , err := clusterClientset . Core ( ) . Namespaces ( ) . Get ( nsName , metav1 . GetOptions { } )
if shouldExist && errors . IsNotFound ( err ) {
errMessages = append ( errMessages , fmt . Sprintf ( "unexpected NotFound error for namespace %s in cluster %s, expected namespace to exist" , nsName , clusterName ) )
} else if ! shouldExist && ! errors . IsNotFound ( err ) {
errMessages = append ( errMessages , fmt . Sprintf ( "expected NotFound error for namespace %s in cluster %s, got error: %v" , nsName , clusterName , err ) )
}
}
if len ( errMessages ) != 0 {
framework . Failf ( "%s" , strings . Join ( errMessages , "; " ) )
}
}
func createNamespace ( nsClient clientset . NamespaceInterface ) string {
ns := api_v1 . Namespace {
2017-02-03 13:41:32 +00:00
ObjectMeta : metav1 . ObjectMeta {
2017-02-01 00:45:59 +00:00
Name : v1 . SimpleNameGenerator . GenerateName ( namespacePrefix ) ,
} ,
}
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-03 13:41:32 +00:00
func deleteAllTestNamespaces ( orphanDependents * bool , lister func ( metav1 . ListOptions ) ( * api_v1 . NamespaceList , error ) , deleter func ( string , * metav1 . DeleteOptions ) error ) {
list , err := lister ( metav1 . ListOptions { } )
2017-02-01 00:45:59 +00:00
if err != nil {
framework . Failf ( "Failed to get all namespaes: %v" , err )
return
}
for _ , namespace := range list . Items {
if strings . HasPrefix ( namespace . Name , namespacePrefix ) {
By ( fmt . Sprintf ( "Deleting ns: %s, found by listing" , namespace . Name ) )
2017-02-03 13:41:32 +00:00
err := deleter ( namespace . Name , & metav1 . DeleteOptions { OrphanDependents : orphanDependents } )
2017-02-01 00:45:59 +00:00
if err != nil {
framework . Failf ( "Failed to set %s for deletion: %v" , namespace . Name , err )
}
}
}
waitForNoTestNamespaces ( lister )
}
2017-02-03 13:41:32 +00:00
func waitForNoTestNamespaces ( lister func ( metav1 . ListOptions ) ( * api_v1 . NamespaceList , error ) ) {
2017-02-01 00:45:59 +00:00
err := wait . Poll ( 5 * time . Second , 2 * time . Minute , func ( ) ( bool , error ) {
2017-02-03 13:41:32 +00:00
list , err := lister ( metav1 . ListOptions { } )
2017-02-01 00:45:59 +00:00
if err != nil {
return false , err
}
for _ , namespace := range list . Items {
if strings . HasPrefix ( namespace . Name , namespacePrefix ) {
return false , nil
}
}
return true , nil
} )
if err != nil {
framework . Failf ( "Namespaces not deleted: %v" , err )
}
}