2016-06-21 16:29:03 +00:00
/ *
Copyright 2015 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
import (
"fmt"
2016-08-29 23:28:15 +00:00
"time"
2016-06-21 16:29:03 +00:00
. "github.com/onsi/ginkgo"
2016-08-29 23:28:15 +00:00
. "github.com/onsi/gomega"
2016-09-02 18:57:44 +00:00
fedclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_release_1_5"
2016-09-13 01:46:01 +00:00
"k8s.io/kubernetes/federation/pkg/federation-controller/util"
2016-08-29 23:28:15 +00:00
"k8s.io/kubernetes/pkg/api/errors"
2016-06-21 16:29:03 +00:00
"k8s.io/kubernetes/pkg/api/v1"
2016-09-02 18:57:44 +00:00
kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5"
2016-08-29 23:28:15 +00:00
"k8s.io/kubernetes/pkg/util/wait"
2016-06-21 16:29:03 +00:00
"k8s.io/kubernetes/test/e2e/framework"
)
const (
2016-09-13 01:46:01 +00:00
FederatedSecretName = "federated-secret"
FederatedSecretTimeout = 60 * time . Second
MaxRetries = 3
2016-06-21 16:29:03 +00:00
)
// Create/delete secret api objects
2016-09-13 01:46:01 +00:00
var _ = framework . KubeDescribe ( "Federation secrets [Feature:Federation12]" , func ( ) {
2016-08-29 23:28:15 +00:00
var clusters map [ string ] * cluster // All clusters, keyed by cluster name
2016-06-21 16:29:03 +00:00
f := framework . NewDefaultFederatedFramework ( "federated-secret" )
Describe ( "Secret objects" , func ( ) {
2016-08-29 23:28:15 +00:00
BeforeEach ( func ( ) {
2016-06-21 16:29:03 +00:00
framework . SkipUnlessFederated ( f . Client )
2016-08-29 23:28:15 +00:00
clusters = map [ string ] * cluster { }
registerClusters ( clusters , UserAgentName , "" , f )
} )
2016-06-21 16:29:03 +00:00
2016-08-29 23:28:15 +00:00
AfterEach ( func ( ) {
framework . SkipUnlessFederated ( f . Client )
unregisterClusters ( clusters , f )
2016-06-21 16:29:03 +00:00
} )
It ( "should be created and deleted successfully" , func ( ) {
framework . SkipUnlessFederated ( f . Client )
2016-08-22 17:48:43 +00:00
nsName := f . FederationNamespace . Name
2016-09-02 18:57:44 +00:00
secret := createSecretOrFail ( f . FederationClientset_1_5 , nsName )
2016-08-29 23:28:15 +00:00
defer func ( ) { // Cleanup
By ( fmt . Sprintf ( "Deleting secret %q in namespace %q" , secret . Name , nsName ) )
2016-09-02 18:57:44 +00:00
err := f . FederationClientset_1_5 . Core ( ) . Secrets ( nsName ) . Delete ( secret . Name , & v1 . DeleteOptions { } )
2016-08-29 23:28:15 +00:00
framework . ExpectNoError ( err , "Error deleting secret %q in namespace %q" , secret . Name , nsName )
} ( )
// wait for secret shards being created
waitForSecretShardsOrFail ( nsName , secret , clusters )
2016-09-02 18:57:44 +00:00
secret = updateSecretOrFail ( f . FederationClientset_1_5 , nsName )
2016-08-29 23:28:15 +00:00
waitForSecretShardsUpdatedOrFail ( nsName , secret , clusters )
} )
2016-06-21 16:29:03 +00:00
} )
} )
2016-09-02 18:57:44 +00:00
func createSecretOrFail ( clientset * fedclientset . Clientset , namespace string ) * v1 . Secret {
2016-06-21 16:29:03 +00:00
if clientset == nil || len ( namespace ) == 0 {
2016-08-29 23:28:15 +00:00
Fail ( fmt . Sprintf ( "Internal error: invalid parameters passed to createSecretOrFail: clientset: %v, namespace: %v" , clientset , namespace ) )
2016-06-21 16:29:03 +00:00
}
secret := & v1 . Secret {
ObjectMeta : v1 . ObjectMeta {
Name : FederatedSecretName ,
} ,
}
2016-08-29 23:28:15 +00:00
By ( fmt . Sprintf ( "Creating secret %q in namespace %q" , secret . Name , namespace ) )
2016-06-21 16:29:03 +00:00
_ , err := clientset . Core ( ) . Secrets ( namespace ) . Create ( secret )
2016-08-29 23:28:15 +00:00
framework . ExpectNoError ( err , "Failed to create secret %s" , secret . Name )
2016-06-21 16:29:03 +00:00
By ( fmt . Sprintf ( "Successfully created federated secret %q in namespace %q" , FederatedSecretName , namespace ) )
return secret
}
2016-08-29 23:28:15 +00:00
2016-09-02 18:57:44 +00:00
func updateSecretOrFail ( clientset * fedclientset . Clientset , namespace string ) * v1 . Secret {
2016-08-29 23:28:15 +00:00
if clientset == nil || len ( namespace ) == 0 {
Fail ( fmt . Sprintf ( "Internal error: invalid parameters passed to updateSecretOrFail: clientset: %v, namespace: %v" , clientset , namespace ) )
}
var newSecret * v1 . Secret
for retryCount := 0 ; retryCount < MaxRetries ; retryCount ++ {
2016-09-13 01:46:01 +00:00
secret , err := clientset . Core ( ) . Secrets ( namespace ) . Get ( FederatedSecretName )
2016-08-29 23:28:15 +00:00
if err != nil {
framework . Failf ( "failed to get secret %q: %v" , FederatedSecretName , err )
}
2016-09-13 01:46:01 +00:00
// Update one of the data in the secret.
secret . Data = map [ string ] [ ] byte {
"key" : [ ] byte ( "value" ) ,
}
2016-08-29 23:28:15 +00:00
newSecret , err = clientset . Core ( ) . Secrets ( namespace ) . Update ( secret )
if err == nil {
return newSecret
}
if ! errors . IsConflict ( err ) && ! errors . IsServerTimeout ( err ) {
framework . Failf ( "failed to update secret %q: %v" , FederatedSecretName , err )
}
}
framework . Failf ( "too many retries updating secret %q" , FederatedSecretName )
return newSecret
}
func waitForSecretShardsOrFail ( namespace string , secret * v1 . Secret , clusters map [ string ] * cluster ) {
framework . Logf ( "Waiting for secret %q in %d clusters" , secret . Name , len ( clusters ) )
for _ , c := range clusters {
waitForSecretOrFail ( c . Clientset , namespace , secret , true , FederatedSecretTimeout )
}
}
2016-09-02 18:57:44 +00:00
func waitForSecretOrFail ( clientset * kubeclientset . Clientset , namespace string , secret * v1 . Secret , present bool , timeout time . Duration ) {
2016-08-29 23:28:15 +00:00
By ( fmt . Sprintf ( "Fetching a federated secret shard of secret %q in namespace %q from cluster" , secret . Name , namespace ) )
var clusterSecret * v1 . Secret
err := wait . PollImmediate ( framework . Poll , timeout , func ( ) ( bool , error ) {
clusterSecret , err := clientset . Core ( ) . Secrets ( namespace ) . Get ( secret . Name )
if ( ! present ) && errors . IsNotFound ( err ) { // We want it gone, and it's gone.
By ( fmt . Sprintf ( "Success: shard of federated secret %q in namespace %q in cluster is absent" , secret . Name , namespace ) )
return true , nil // Success
}
if present && err == nil { // We want it present, and the Get succeeded, so we're all good.
By ( fmt . Sprintf ( "Success: shard of federated secret %q in namespace %q in cluster is present" , secret . Name , namespace ) )
return true , nil // Success
}
By ( fmt . Sprintf ( "Secret %q in namespace %q in cluster. Found: %v, waiting for Found: %v, trying again in %s (err=%v)" , secret . Name , namespace , clusterSecret != nil && err == nil , present , framework . Poll , err ) )
return false , nil
} )
framework . ExpectNoError ( err , "Failed to verify secret %q in namespace %q in cluster: Present=%v" , secret . Name , namespace , present )
if present && clusterSecret != nil {
2016-09-13 01:46:01 +00:00
Expect ( util . SecretEquivalent ( * clusterSecret , * secret ) )
2016-08-29 23:28:15 +00:00
}
}
func waitForSecretShardsUpdatedOrFail ( namespace string , secret * v1 . Secret , clusters map [ string ] * cluster ) {
framework . Logf ( "Waiting for secret %q in %d clusters" , secret . Name , len ( clusters ) )
for _ , c := range clusters {
waitForSecretUpdateOrFail ( c . Clientset , namespace , secret , FederatedSecretTimeout )
}
}
2016-09-02 18:57:44 +00:00
func waitForSecretUpdateOrFail ( clientset * kubeclientset . Clientset , namespace string , secret * v1 . Secret , timeout time . Duration ) {
2016-08-29 23:28:15 +00:00
By ( fmt . Sprintf ( "Fetching a federated secret shard of secret %q in namespace %q from cluster" , secret . Name , namespace ) )
err := wait . PollImmediate ( framework . Poll , timeout , func ( ) ( bool , error ) {
clusterSecret , err := clientset . Core ( ) . Secrets ( namespace ) . Get ( secret . Name )
if err == nil { // We want it present, and the Get succeeded, so we're all good.
2016-09-13 01:46:01 +00:00
if util . SecretEquivalent ( * clusterSecret , * secret ) {
2016-08-29 23:28:15 +00:00
By ( fmt . Sprintf ( "Success: shard of federated secret %q in namespace %q in cluster is updated" , secret . Name , namespace ) )
return true , nil
2016-09-13 01:46:01 +00:00
} else {
By ( fmt . Sprintf ( "Expected equal secrets. expected: %+v\nactual: %+v" , * secret , * clusterSecret ) )
2016-08-29 23:28:15 +00:00
}
2016-09-13 01:46:01 +00:00
By ( fmt . Sprintf ( "Secret %q in namespace %q in cluster, waiting for secret being updated, trying again in %s (err=%v)" , secret . Name , namespace , framework . Poll , err ) )
2016-08-29 23:28:15 +00:00
return false , nil
}
By ( fmt . Sprintf ( "Secret %q in namespace %q in cluster, waiting for being updated, trying again in %s (err=%v)" , secret . Name , namespace , framework . Poll , err ) )
return false , nil
} )
framework . ExpectNoError ( err , "Failed to verify secret %q in namespace %q in cluster" , secret . Name , namespace )
}