Skip to content

Commit 81d730c

Browse files
fix: cleaning unused tap devices (#12)
* fix: cleaning unused tap devices - add helper method to remove all unused (down+nocarrier) interfaces - remove both ygg/myc interfaces while deprovisioning vm * check interface name length/prefix before deletion
1 parent 3fcfb26 commit 81d730c

2 files changed

Lines changed: 55 additions & 8 deletions

File tree

pkg/network/cleanup.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package network
2+
3+
import (
4+
"fmt"
5+
"os/exec"
6+
"strings"
7+
8+
"github.com/vishvananda/netlink"
9+
)
10+
11+
func CleanupUnusedLinks() error {
12+
links, err := netlink.LinkList()
13+
if err != nil {
14+
return fmt.Errorf("failed to list network interfaces: %w", err)
15+
}
16+
17+
for _, link := range links {
18+
attrs := link.Attrs()
19+
if attrs == nil {
20+
continue
21+
}
22+
23+
interfaceName := attrs.Name
24+
25+
if attrs.OperState == netlink.OperDown &&
26+
hasNoCarrier(interfaceName) &&
27+
isOrphanVMTap(interfaceName) {
28+
if err := netlink.LinkDel(link); err != nil {
29+
return fmt.Errorf("failed to delete interface %s: %w", interfaceName, err)
30+
}
31+
}
32+
}
33+
34+
return nil
35+
}
36+
37+
func hasNoCarrier(interfaceName string) bool {
38+
cmd := exec.Command("ip", "link", "show", interfaceName)
39+
output, err := cmd.CombinedOutput()
40+
if err != nil {
41+
return false
42+
}
43+
44+
return strings.Contains(string(output), "NO-CARRIER")
45+
}
46+
47+
func isOrphanVMTap(interfaceName string) bool {
48+
return len(interfaceName) == 15 && strings.HasPrefix(interfaceName, "t-")
49+
}

pkg/primitives/vm/vm.go

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,6 @@ func (p *Manager) mountVolume(ctx context.Context, wl *gridtypes.WorkloadWithID,
109109
}
110110

111111
func (p *Manager) mountQsfs(wl *gridtypes.WorkloadWithID, mount zos.MachineMount, vm *pkg.VM) error {
112-
113112
var info zos.QuatumSafeFSResult
114113
if err := wl.Result.Unmarshal(&info); err != nil {
115114
return fmt.Errorf("invalid qsfs result '%s': %w", mount.Name, err)
@@ -276,7 +275,6 @@ func (p *Manager) virtualMachineProvisionImpl(ctx context.Context, wl *gridtypes
276275
if err = p.prepVirtualMachine(ctx, cloudImage, imageInfo, &machine, &config, &deployment, wl); err != nil {
277276
return result, err
278277
}
279-
280278
}
281279

282280
// - Attach mounts
@@ -351,14 +349,14 @@ func (p *Manager) Deprovision(ctx context.Context, wl *gridtypes.WorkloadWithID)
351349
}
352350

353351
if cfg.Network.Planetary {
354-
var tapName string
355-
if cfg.Network.Mycelium == nil {
356-
// yggdrasil network
357-
tapName = wl.ID.Unique("ygg")
358-
} else {
359-
tapName = wl.ID.Unique("mycelium")
352+
tapName := wl.ID.Unique("ygg")
353+
if err := network.RemoveTap(ctx, tapName); err != nil {
354+
return errors.Wrap(err, "could not clean up tap device")
360355
}
356+
}
361357

358+
if cfg.Network.Mycelium != nil {
359+
tapName := wl.ID.Unique("mycelium")
362360
if err := network.RemoveTap(ctx, tapName); err != nil {
363361
return errors.Wrap(err, "could not clean up tap device")
364362
}

0 commit comments

Comments
 (0)