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