diff --git a/tests/framework/utils/k8s_helper.go b/tests/framework/utils/k8s_helper.go index 2a0a1fde8..6474d8d6a 100644 --- a/tests/framework/utils/k8s_helper.go +++ b/tests/framework/utils/k8s_helper.go @@ -533,15 +533,16 @@ func (k8sh *K8sHelper) IsStorageClassPresent(name string) (bool, error) { } //GetPVCStatus returns status of PVC -func (k8sh *K8sHelper) GetPVCStatus(name string) (string, error) { - args := []string{"get", "pvc", "-o", "jsonpath='{.items[*].metadata.name}'"} - result, err := k8sh.Kubectl(args...) - if strings.Contains(result, name) { - args := []string{"get", "pvc", name, "-o", "jsonpath='{.status.phase}'"} - res, _ := k8sh.Kubectl(args...) - return res, nil +func (k8sh *K8sHelper) GetPVCStatus(namespace string, name string) (v1.PersistentVolumeClaimPhase, error) { + getOpts := metav1.GetOptions{} + + pvc, err := k8sh.Clientset.PersistentVolumeClaims(namespace).Get(name, getOpts) + if err != nil { + return v1.ClaimLost, fmt.Errorf("PVC %s not found,err->%v", name, err) } - return "PVC NOT FOUND", fmt.Errorf("PVC %s not found,err->%v", name, err) + + return pvc.Status.Phase, nil + } //IsPodInExpectedState waits for 90s for a pod to be an expected state @@ -638,16 +639,32 @@ func (k8sh *K8sHelper) WaitUntilPodIsDeleted(podNamePattern string) bool { //WaitUntilPVCIsBound waits for a PVC to be in bound state for 90 seconds //if PVC goes to Bound state within 90s True is returned, if not false -func (k8sh *K8sHelper) WaitUntilPVCIsBound(pvcname string) bool { +func (k8sh *K8sHelper) WaitUntilPVCIsBound(namespace string, pvcname string) bool { inc := 0 for inc < RetryLoop { - out, err := k8sh.GetPVCStatus(pvcname) - if strings.Contains(out, "Bound") { + out, err := k8sh.GetPVCStatus(namespace, pvcname) + if err == nil { + if out == v1.PersistentVolumeClaimPhase(v1.ClaimBound) { + return true + } + } + logger.Infof("waiting for PVC %s to be bound. current=%s. err=%+v", pvcname, out, err) + inc++ + time.Sleep(RetryInterval * time.Second) + } + return false +} + +func (k8sh *K8sHelper) WaitUntilPVCIsDeleted(namespace string, pvcname string) bool { + getOpts := metav1.GetOptions{} + inc := 0 + for inc < RetryLoop { + _, err := k8sh.Clientset.PersistentVolumeClaims(namespace).Get(pvcname, getOpts) + if err != nil { return true } - - logger.Infof("waiting for PVC to be bound. current=%s. err=%+v", out, err) + logger.Infof("waiting for PVC %s to be deleted.", pvcname) inc++ time.Sleep(RetryInterval * time.Second) } diff --git a/tests/integration/base_block_test.go b/tests/integration/base_block_test.go index 84baf26f8..94c4d8ffa 100644 --- a/tests/integration/base_block_test.go +++ b/tests/integration/base_block_test.go @@ -20,8 +20,6 @@ import ( "fmt" "time" - "strings" - "github.com/rook/rook/tests/framework/clients" "github.com/rook/rook/tests/framework/utils" "github.com/stretchr/testify/assert" @@ -55,7 +53,7 @@ func runBlockE2ETest(helper *clients.TestClient, k8sh *utils.K8sHelper, s suite. require.Nil(s.T(), cbErr) require.True(s.T(), retryBlockImageCountCheck(helper, k8sh, len(initBlockImages), 1), "Make sure a new block is created") logger.Infof("Block Storage created successfully") - require.True(s.T(), k8sh.WaitUntilPVCIsBound(blockName), "Make sure PVC is Bound") + require.True(s.T(), k8sh.WaitUntilPVCIsBound(defaultNamespace, blockName), "Make sure PVC is Bound") logger.Infof("step 2: Mount block storage") _, mtErr := rbc.BlockMap(getBlockPodDefintion(podName, blockName), blockMountPath) @@ -121,7 +119,7 @@ func runBlockE2ETestLite(helper *clients.TestClient, k8sh *utils.K8sHelper, s su require.Contains(s.T(), res1, "persistentvolumeclaim \"test-block-claim\" created", "Make sure pvc is created") require.NoError(s.T(), err) - require.True(s.T(), isPVCBound(k8sh, "test-block-claim")) + require.True(s.T(), k8sh.WaitUntilPVCIsBound(defaultNamespace, "test-block-claim")) //Make sure new block is created b, _ := bc.BlockList() @@ -131,11 +129,13 @@ func runBlockE2ETestLite(helper *clients.TestClient, k8sh *utils.K8sHelper, s su //Delete pvc and storageclass _, err = k8sh.ResourceOperationFromTemplate("delete", volumeDef, sc) - require.NoError(s.T(), err) - time.Sleep(2 * time.Second) + assert.NoError(s.T(), err) + + assert.True(s.T(), k8sh.WaitUntilPVCIsDeleted(defaultNamespace, "test-block-claim")) + require.True(s.T(), retryBlockImageCountCheck(helper, k8sh, initBlockCount, 0), "Make sure a new block is deleted") b, _ = bc.BlockList() - require.Equal(s.T(), initBlockCount, len(b), "Make sure new block image is deleted") + assert.Equal(s.T(), initBlockCount, len(b), "Make sure new block image is deleted") checkPoolDeleted(helper, s, poolName) } @@ -260,17 +260,3 @@ spec: claimName: ` + blockName + ` restartPolicy: Never` } - -func isPVCBound(k8sh *utils.K8sHelper, name string) bool { - inc := 0 - for inc < utils.RetryLoop { - status, _ := k8sh.GetPVCStatus(name) - if strings.TrimRight(status, "\n") == "'Bound'" { - return true - } - time.Sleep(time.Second * utils.RetryInterval) - inc++ - - } - return false -} diff --git a/tests/integration/block_createBlock_k8s_test.go b/tests/integration/block_createBlock_k8s_test.go index f916f28e2..b798b4d1b 100644 --- a/tests/integration/block_createBlock_k8s_test.go +++ b/tests/integration/block_createBlock_k8s_test.go @@ -18,9 +18,7 @@ package integration import ( "fmt" - "strings" "testing" - "time" "github.com/rook/rook/tests/framework/clients" "github.com/rook/rook/tests/framework/contracts" @@ -117,7 +115,7 @@ func (s *K8sBlockImageCreateSuite) TestCreatePVCWhenNoStorageClassExists() { require.NoError(s.T(), err) //check status of PVC - pvcStatus, err := s.kh.GetPVCStatus(claimName) + pvcStatus, err := s.kh.GetPVCStatus(defaultNamespace, claimName) require.Nil(s.T(), err) require.Contains(s.T(), pvcStatus, "Pending", "Makes sure PVC is in Pending state") @@ -151,7 +149,7 @@ func (s *K8sBlockImageCreateSuite) TestCreatePVCWhenStorageClassExists() { require.NoError(s.T(), err2) //check status of PVC - require.True(s.T(), s.isPVCBound(claimName)) + require.True(s.T(), s.kh.WaitUntilPVCIsBound(defaultNamespace, claimName)) //check block image count b, _ := s.bc.BlockList() @@ -165,7 +163,7 @@ func (s *K8sBlockImageCreateSuite) TestCreateSamePVCTwice() { claimName := "test-twice-claim" poolName := "test-twice-pool" defer s.tearDownTest(claimName, poolName) - status, _ := s.kh.GetPVCStatus(claimName) + status, _ := s.kh.GetPVCStatus(defaultNamespace, claimName) logger.Infof("PVC %s status: %s", claimName, status) s.bc.BlockList() @@ -186,7 +184,7 @@ func (s *K8sBlockImageCreateSuite) TestCreateSamePVCTwice() { require.NoError(s.T(), err2) logger.Infof("check status of PVC") - require.True(s.T(), s.isPVCBound(claimName)) + require.True(s.T(), s.kh.WaitUntilPVCIsBound(defaultNamespace, claimName)) b1, err := s.bc.BlockList() assert.Nil(s.T(), err) @@ -198,7 +196,7 @@ func (s *K8sBlockImageCreateSuite) TestCreateSamePVCTwice() { require.NoError(s.T(), err3) logger.Infof("check status of PVC") - require.True(s.T(), s.isPVCBound(claimName)) + require.True(s.T(), s.kh.WaitUntilPVCIsBound(defaultNamespace, claimName)) logger.Infof("check block image count") b2, _ := s.bc.BlockList() @@ -233,21 +231,6 @@ func (s *K8sBlockImageCreateSuite) pvcOperation(claimName string, action string) } -func (s *K8sBlockImageCreateSuite) isPVCBound(name string) bool { - inc := 0 - for inc < utils.RetryLoop { - status, _ := s.kh.GetPVCStatus(name) - logger.Infof("PVC %s status: %s", name, status) - if strings.TrimRight(status, "\n") == "'Bound'" { - return true - } - time.Sleep(time.Second * utils.RetryInterval) - inc++ - - } - return false -} - func (s *K8sBlockImageCreateSuite) TearDownSuite() { s.installer.UninstallRookFromK8s("rook", false) } diff --git a/tests/longhaul/block_test.go b/tests/longhaul/block_test.go index f81dc2f3a..5be792e4f 100644 --- a/tests/longhaul/block_test.go +++ b/tests/longhaul/block_test.go @@ -171,14 +171,14 @@ spec: require.True(s.T(), present, "Make sure storageclass is present") } //create mysql pod - if _, err := s.kh.GetPVCStatus("mysql-pv-claim"); err != nil { + if _, err := s.kh.GetPVCStatus(defaultNamespace, "mysql-pv-claim"); err != nil { logger.Infof("Create PVC") s.kh.ResourceOperation("create", s.mysqlAppPath) //wait till mysql pod is up require.True(s.T(), s.kh.IsPodInExpectedState("mysqldb", "", "Running")) - pvcStatus, err := s.kh.GetPVCStatus("mysql-pv-claim") + pvcStatus, err := s.kh.GetPVCStatus(defaultNamespace, "mysql-pv-claim") require.Nil(s.T(), err) require.Contains(s.T(), pvcStatus, "Bound") }