@@ -1668,6 +1668,86 @@ var _ = Describe("GCE PD CSI Driver", func() {
16681668 Expect (err ).To (BeNil (), "Failed to rm file path %s: %v" , fp , err )
16691669 })
16701670
1671+ It ("Should mount if udev disabled, and remount if it's enabled again" , func () {
1672+ testContext := getRandomTestContext ()
1673+ p , z , _ := testContext .Instance .GetIdentity ()
1674+ client := testContext .Client
1675+ instance := testContext .Instance
1676+
1677+ err := instance .DisableUdev ()
1678+ Expect (err ).To (BeNil (), "Failed to disable udev" )
1679+
1680+ // Create Disk
1681+ volName , volID := createAndValidateUniqueZonalDisk (client , p , z , standardDiskType )
1682+ vol2Name , vol2ID := createAndValidateUniqueZonalDisk (client , p , z , standardDiskType )
1683+
1684+ defer func () {
1685+ // Delete Disks
1686+ err := client .DeleteVolume (volID )
1687+ Expect (err ).To (BeNil (), "DeleteVolume failed" )
1688+
1689+ err = client .DeleteVolume (vol2ID )
1690+ Expect (err ).To (BeNil (), "DeleteVolume failed" )
1691+
1692+ // Validate Disks Deleted
1693+ _ , err = computeService .Disks .Get (p , z , volName ).Do ()
1694+ Expect (gce .IsGCEError (err , "notFound" )).To (BeTrue (), "Expected disk to not be found" )
1695+ _ , err = computeService .Disks .Get (p , z , vol2Name ).Do ()
1696+ Expect (gce .IsGCEError (err , "notFound" )).To (BeTrue (), "Expected disk to not be found" )
1697+ }()
1698+
1699+ // Attach & detach disk. We retry as we expect the udev repair to take a little bit of time.
1700+ err = wait .Poll (10 * time .Second , 5 * time .Minute , func () (bool , error ) {
1701+ err = testAttachWriteReadDetach (volID , volName , instance , client , false /* readOnly */ , false /* detachAndReattach */ , false /* setupDataCache */ )
1702+ if err != nil {
1703+ klog .Infof ("initial udev error, retrying: %v" , err )
1704+ }
1705+ return err == nil , nil
1706+ })
1707+ Expect (err ).To (BeNil (), "Failed to go through volume lifecycle" )
1708+
1709+ // Attach a different disk. The conflicting udev paths should not cause a problem.
1710+ err = wait .Poll (10 * time .Second , 5 * time .Minute , func () (bool , error ) {
1711+ err = testAttachWriteReadDetach (vol2ID , vol2Name , instance , client , false /* readOnly */ , false /* detachAndReattach */ , false /* setupDataCache */ )
1712+ if err != nil {
1713+ klog .Infof ("second disk udev error, retrying: %v" , err )
1714+ }
1715+ return err == nil , nil
1716+ })
1717+ Expect (err ).To (BeNil (), "Failed to go through second volume lifecycle" )
1718+
1719+ // Attach, reenable udev, go through lifecycle of second disk, detach first
1720+ var detacher func ()
1721+ var args * verifyArgs
1722+ err = wait .Poll (10 * time .Second , 5 * time .Minute , func () (bool , error ) {
1723+ err , detacher , args = testAttachAndMount (volID , volName , instance , client , attachAndMountArgs {})
1724+ if err != nil {
1725+ klog .Infof ("attach before reenable failed, retrying: %v" , err )
1726+ }
1727+ return err == nil , nil
1728+ })
1729+ Expect (err ).To (BeNil (), "Failed second attach" )
1730+ defer detacher ()
1731+
1732+ err = instance .EnableUdev ()
1733+ Expect (err ).To (BeNil (), "Failed to enable udev" )
1734+
1735+ // After udev is enabled we expect everything to succeed on the first try.
1736+
1737+ err = testAttachWriteReadDetach (vol2ID , vol2Name , instance , client , false /* readOnly */ , false /* detachAndReattach */ , false /* setupDataCache */ )
1738+ Expect (err ).To (BeNil (), "Failed to go through nested volume lifecycle with enabled" )
1739+
1740+ err = client .NodeUnpublishVolume (volID , args .publishDir )
1741+ Expect (err ).To (BeNil (), "Failed to unpublish first" )
1742+
1743+ err = client .NodeUnstageVolume (volID , args .stageDir )
1744+ Expect (err ).To (BeNil (), "Failed to unstage first" )
1745+
1746+ // Go through complete lifecycle again, with udev enabled.
1747+ err = testAttachWriteReadDetach (volID , volName , instance , client , false /* readOnly */ , false /* detachAndReattach */ , false /* setupDataCache */ )
1748+ Expect (err ).To (BeNil (), "Failed to go through volume lifecycle with udev enabled" )
1749+ })
1750+
16711751 type multiZoneTestConfig struct {
16721752 diskType string
16731753 readOnly bool
0 commit comments