2017-10-09 18:11:01 +00:00
/ *
Copyright 2017 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-11-29 22:08:28 +00:00
package vsphere
2017-10-09 18:11:01 +00:00
import (
"fmt"
"strings"
"time"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
clientset "k8s.io/client-go/kubernetes"
"k8s.io/kubernetes/test/e2e/framework"
2017-11-29 22:08:28 +00:00
"k8s.io/kubernetes/test/e2e/storage/utils"
2017-10-09 18:11:01 +00:00
)
const (
InvalidDatastore = "invalidDatastore"
DatastoreSCName = "datastoresc"
)
/ *
Test to verify datastore specified in storage - class is being honored while volume creation .
Steps
1. Create StorageClass with invalid datastore .
2. Create PVC which uses the StorageClass created in step 1.
3. Expect the PVC to fail .
4. Verify the error returned on PVC failure is the correct .
* /
2017-11-29 22:08:28 +00:00
var _ = utils . SIGDescribe ( "Volume Provisioning on Datastore [Feature:vsphere]" , func ( ) {
2017-10-09 18:11:01 +00:00
f := framework . NewDefaultFramework ( "volume-datastore" )
var (
client clientset . Interface
namespace string
scParameters map [ string ] string
)
BeforeEach ( func ( ) {
framework . SkipUnlessProviderIs ( "vsphere" )
2018-02-01 05:14:55 +00:00
Bootstrap ( f )
2017-10-09 18:11:01 +00:00
client = f . ClientSet
namespace = f . Namespace . Name
scParameters = make ( map [ string ] string )
nodeList := framework . GetReadySchedulableNodesOrDie ( f . ClientSet )
if ! ( len ( nodeList . Items ) > 0 ) {
framework . Failf ( "Unable to find ready and schedulable Node" )
}
} )
It ( "verify dynamically provisioned pv using storageclass fails on an invalid datastore" , func ( ) {
By ( "Invoking Test for invalid datastore" )
scParameters [ Datastore ] = InvalidDatastore
scParameters [ DiskFormat ] = ThinDisk
err := invokeInvalidDatastoreTestNeg ( client , namespace , scParameters )
Expect ( err ) . To ( HaveOccurred ( ) )
2017-11-16 06:24:23 +00:00
errorMsg := ` Failed to provision volume with StorageClass \" ` + DatastoreSCName + ` \": The specified datastore ` + InvalidDatastore + ` is not a shared datastore across node VMs `
2017-10-09 18:11:01 +00:00
if ! strings . Contains ( err . Error ( ) , errorMsg ) {
Expect ( err ) . NotTo ( HaveOccurred ( ) , errorMsg )
}
} )
} )
func invokeInvalidDatastoreTestNeg ( client clientset . Interface , namespace string , scParameters map [ string ] string ) error {
By ( "Creating Storage Class With Invalid Datastore" )
storageclass , err := client . StorageV1 ( ) . StorageClasses ( ) . Create ( getVSphereStorageClassSpec ( DatastoreSCName , scParameters ) )
Expect ( err ) . NotTo ( HaveOccurred ( ) , fmt . Sprintf ( "Failed to create storage class with err: %v" , err ) )
defer client . StorageV1 ( ) . StorageClasses ( ) . Delete ( storageclass . Name , nil )
By ( "Creating PVC using the Storage Class" )
2018-04-10 07:29:08 +00:00
pvclaim , err := framework . CreatePVC ( client , namespace , getVSphereClaimSpecWithStorageClass ( namespace , "2Gi" , storageclass ) )
2017-10-09 18:11:01 +00:00
Expect ( err ) . NotTo ( HaveOccurred ( ) )
defer framework . DeletePersistentVolumeClaim ( client , pvclaim . Name , namespace )
By ( "Expect claim to fail provisioning volume" )
err = framework . WaitForPersistentVolumeClaimPhase ( v1 . ClaimBound , client , pvclaim . Namespace , pvclaim . Name , framework . Poll , 2 * time . Minute )
Expect ( err ) . To ( HaveOccurred ( ) )
eventList , err := client . CoreV1 ( ) . Events ( pvclaim . Namespace ) . List ( metav1 . ListOptions { } )
return fmt . Errorf ( "Failure message: %+q" , eventList . Items [ 0 ] . Message )
}