...
1
2
3 package tc
4
5 import (
6 "fmt"
7 "strings"
8
9 "github.com/hashicorp/go-multierror"
10 "github.com/vishvananda/netlink"
11 )
12
13 type Tc interface {
14 Add() error
15 Delete() error
16 Replace() error
17 }
18
19 func Adder() func(commandList ...Tc) error {
20 var err *multierror.Error
21 return func(commandList ...Tc) error {
22 for _, command := range commandList {
23 err = multierror.Append(err, command.Add())
24 }
25 return err.ErrorOrNil()
26 }
27 }
28
29 func Replacer() func(commandList ...Tc) error {
30 var err *multierror.Error
31 return func(commandList ...Tc) error {
32 for _, command := range commandList {
33 err = multierror.Append(err, command.Replace())
34 }
35 return err.ErrorOrNil()
36 }
37 }
38
39 func errorIsNotFound(err error) bool {
40 return strings.Contains(err.Error(), "not found") || strings.Contains(err.Error(), "no such file or directory")
41 }
42
43 func errorIsFileExists(err error) bool {
44 return strings.Contains(err.Error(), "file exists")
45 }
46
47 func formatTcError(prefix string, linkIndex int, parent, handle uint32, tcErr error) error {
48 link, err := netlink.LinkByIndex(linkIndex)
49 if err != nil {
50 return fmt.Errorf("failed to get link when handling err: %w", tcErr)
51 }
52 return fmt.Errorf(
53 "%s with parent %s and handle %s (dev %s): %w",
54 prefix,
55 netlink.HandleStr(parent),
56 netlink.HandleStr(handle),
57 link.Attrs().Name,
58 err,
59 )
60 }
61
View as plain text