@@ -1668,6 +1668,94 @@ 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+ klog .Infof ("Disabling udev" )
1678+ err := instance .DisableUdev ()
1679+ Expect (err ).To (BeNil (), "Failed to disable udev" )
1680+
1681+ // Create Disk
1682+ volName , volID := createAndValidateUniqueZonalDisk (client , p , z , standardDiskType )
1683+ vol2Name , vol2ID := createAndValidateUniqueZonalDisk (client , p , z , standardDiskType )
1684+
1685+ defer func () {
1686+ // Delete Disks
1687+ err := client .DeleteVolume (volID )
1688+ Expect (err ).To (BeNil (), "DeleteVolume failed" )
1689+
1690+ err = client .DeleteVolume (vol2ID )
1691+ Expect (err ).To (BeNil (), "DeleteVolume failed" )
1692+
1693+ // Validate Disks Deleted
1694+ _ , err = computeService .Disks .Get (p , z , volName ).Do ()
1695+ Expect (gce .IsGCEError (err , "notFound" )).To (BeTrue (), "Expected disk to not be found" )
1696+ _ , err = computeService .Disks .Get (p , z , vol2Name ).Do ()
1697+ Expect (gce .IsGCEError (err , "notFound" )).To (BeTrue (), "Expected disk to not be found" )
1698+ }()
1699+
1700+ // Attach & detach disk. We retry as we expect the udev repair to take a little bit of time.
1701+ klog .Infof ("Starting attach & detach with disabled udev" )
1702+ err = wait .Poll (10 * time .Second , 5 * time .Minute , func () (bool , error ) {
1703+ err = testAttachWriteReadDetach (volID , volName , instance , client , false /* readOnly */ , false /* detachAndReattach */ , false /* setupDataCache */ )
1704+ if err != nil {
1705+ klog .Infof ("Initial udev error, retrying: %v" , err )
1706+ }
1707+ return err == nil , nil
1708+ })
1709+ Expect (err ).To (BeNil (), "Failed to go through volume lifecycle" )
1710+
1711+ // Attach a different disk. The conflicting udev paths should not cause a problem.
1712+ klog .Infof ("Starting second attach & detach with disabled udev" )
1713+ err = wait .Poll (10 * time .Second , 5 * time .Minute , func () (bool , error ) {
1714+ err = testAttachWriteReadDetach (vol2ID , vol2Name , instance , client , false /* readOnly */ , false /* detachAndReattach */ , false /* setupDataCache */ )
1715+ if err != nil {
1716+ klog .Infof ("second disk udev error, retrying: %v" , err )
1717+ }
1718+ return err == nil , nil
1719+ })
1720+ Expect (err ).To (BeNil (), "Failed to go through second volume lifecycle" )
1721+
1722+ // Attach, reenable udev, go through lifecycle of second disk, detach first
1723+ klog .Infof ("Starting attach & udev re-enable" )
1724+ var detacher func ()
1725+ var args * verifyArgs
1726+ err = wait .Poll (10 * time .Second , 5 * time .Minute , func () (bool , error ) {
1727+ err , detacher , args = testAttachAndMount (volID , volName , instance , client , attachAndMountArgs {})
1728+ if err != nil {
1729+ klog .Infof ("attach before reenable failed, retrying: %v" , err )
1730+ }
1731+ return err == nil , nil
1732+ })
1733+ Expect (err ).To (BeNil (), "Failed second attach" )
1734+ defer detacher ()
1735+
1736+ klog .Infof ("Re-enabling udev" )
1737+ err = instance .EnableUdev ()
1738+ Expect (err ).To (BeNil (), "Failed to enable udev" )
1739+
1740+ // After udev is enabled we expect everything to succeed on the first try.
1741+
1742+ klog .Infof ("Testing attach & detach with re-enabled udev" )
1743+ err = testAttachWriteReadDetach (vol2ID , vol2Name , instance , client , false /* readOnly */ , false /* detachAndReattach */ , false /* setupDataCache */ )
1744+ Expect (err ).To (BeNil (), "Failed to go through nested volume lifecycle with enabled" )
1745+
1746+ klog .Infof ("Testing detach with re-enabled udev" )
1747+ err = client .NodeUnpublishVolume (volID , args .publishDir )
1748+ Expect (err ).To (BeNil (), "Failed to unpublish first" )
1749+
1750+ err = client .NodeUnstageVolume (volID , args .stageDir )
1751+ Expect (err ).To (BeNil (), "Failed to unstage first" )
1752+
1753+ // Go through complete lifecycle again, with udev enabled.
1754+ klog .Infof ("Testing final lifecycle enabled udev" )
1755+ err = testAttachWriteReadDetach (volID , volName , instance , client , false /* readOnly */ , false /* detachAndReattach */ , false /* setupDataCache */ )
1756+ Expect (err ).To (BeNil (), "Failed to go through volume lifecycle with udev enabled" )
1757+ })
1758+
16711759 type multiZoneTestConfig struct {
16721760 diskType string
16731761 readOnly bool
0 commit comments