@@ -3205,6 +3205,108 @@ func TestLinkSetBondSlave(t *testing.T) {
32053205 }
32063206}
32073207
3208+ func testFailover (t * testing.T , slaveName , bondName string ) {
3209+ slaveLink , err := LinkByName (slaveName )
3210+ if err != nil {
3211+ t .Fatal (err )
3212+ }
3213+
3214+ bondLink , err := LinkByName (bondName )
3215+ if err != nil {
3216+ t .Fatal (err )
3217+ }
3218+
3219+ err = LinkSetBondSlaveActive (slaveLink , & Bond {LinkAttrs : * bondLink .Attrs ()})
3220+ if err != nil {
3221+ t .Errorf ("set slave link active failed: %v" , err )
3222+ return
3223+ }
3224+
3225+ bondLink , err = LinkByName (bondName )
3226+ if err != nil {
3227+ t .Fatal (err )
3228+ }
3229+ bond := bondLink .(* Bond )
3230+ if bond .ActiveSlave != slaveLink .Attrs ().Index {
3231+ t .Errorf ("the current active slave %d is not expected as %d" , bond .ActiveSlave , slaveLink .Attrs ().Index )
3232+ }
3233+ }
3234+
3235+ func TestLinkFailover (t * testing.T ) {
3236+ minKernelRequired (t , 3 , 13 )
3237+
3238+ tearDown := setUpNetlinkTest (t )
3239+ defer tearDown ()
3240+
3241+ const (
3242+ bondName = "foo"
3243+ slaveOneName = "fooFoo"
3244+ slaveTwoName = "fooBar"
3245+ )
3246+
3247+ bond := NewLinkBond (LinkAttrs {Name : bondName })
3248+ bond .Mode = StringToBondModeMap ["active-backup" ]
3249+ bond .Miimon = 100
3250+
3251+ if err := LinkAdd (bond ); err != nil {
3252+ t .Fatal (err )
3253+ }
3254+
3255+ bondLink , err := LinkByName (bondName )
3256+ if err != nil {
3257+ t .Fatal (err )
3258+ }
3259+ defer LinkDel (bondLink )
3260+
3261+ if err := LinkAdd (& Dummy {LinkAttrs {Name : slaveOneName }}); err != nil {
3262+ t .Fatal (err )
3263+ }
3264+
3265+ slaveOneLink , err := LinkByName (slaveOneName )
3266+ if err != nil {
3267+ t .Fatal (err )
3268+ }
3269+ defer LinkDel (slaveOneLink )
3270+
3271+ if err := LinkAdd (& Dummy {LinkAttrs {Name : slaveTwoName }}); err != nil {
3272+ t .Fatal (err )
3273+ }
3274+ slaveTwoLink , err := LinkByName (slaveTwoName )
3275+ if err != nil {
3276+ t .Fatal (err )
3277+ }
3278+ defer LinkDel (slaveTwoLink )
3279+
3280+ if err := LinkSetBondSlave (slaveOneLink , & Bond {LinkAttrs : * bondLink .Attrs ()}); err != nil {
3281+ t .Fatal (err )
3282+ }
3283+
3284+ if err := LinkSetBondSlave (slaveTwoLink , & Bond {LinkAttrs : * bondLink .Attrs ()}); err != nil {
3285+ t .Fatal (err )
3286+ }
3287+
3288+ testFailover (t , slaveOneName , bondName )
3289+ testFailover (t , slaveTwoName , bondName )
3290+ testFailover (t , slaveTwoName , bondName )
3291+
3292+ // del slave from bond
3293+ slaveOneLink , err = LinkByName (slaveOneName )
3294+ if err != nil {
3295+ t .Fatal (err )
3296+ }
3297+ err = LinkDelBondSlave (slaveOneLink , & Bond {LinkAttrs : * bondLink .Attrs ()})
3298+ if err != nil {
3299+ t .Errorf ("Remove slave %s from bond failed: %v" , slaveOneName , err )
3300+ }
3301+ slaveOneLink , err = LinkByName (slaveOneName )
3302+ if err != nil {
3303+ t .Fatal (err )
3304+ }
3305+ if slaveOneLink .Attrs ().MasterIndex > 0 {
3306+ t .Errorf ("The nic %s is still a slave of %d" , slaveOneName , slaveOneLink .Attrs ().MasterIndex )
3307+ }
3308+ }
3309+
32083310func TestLinkSetAllmulticast (t * testing.T ) {
32093311 tearDown := setUpNetlinkTest (t )
32103312 defer tearDown ()
0 commit comments