Skip to content

Commit b123542

Browse files
committed
network/port driver build tags support
Signed-off-by: fahed dorgaa <[email protected]>
1 parent 236f31e commit b123542

File tree

13 files changed

+329
-0
lines changed

13 files changed

+329
-0
lines changed

docs/network.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,3 +267,29 @@ The `--detach-netns` flag (since v2.0.0) detaches network namespaces into `$ROOT
267267
and executes the child command in the host's network namespace.
268268

269269
The child command can enter `$ROOTLESSKIT_STATE_DIR/netns` by itself to create nested network namespaces.
270+
271+
272+
## Build tags to omit drivers
273+
274+
To exclude specific drivers at compilation time, use Go build tags:
275+
276+
- Tag no_vpnkit: omits the VPNKit network driver implementation.
277+
- Tag no_gvisortapvsock: omits the gvisor-tap-vsock network driver implementation and its port driver.
278+
- Tag no_slirp4netns: omits the slirp4netns network driver implementation and its port driver.
279+
- Tag no_lxcusernic: omits the lxc-user-nic network driver implementation.
280+
281+
Examples:
282+
283+
- Build without VPNKit support:
284+
go build -tags no_vpnkit ./cmd/rootlesskit
285+
286+
- Build without gvisor-tap-vsock support (also disables the gvisor-tap-vsock port driver):
287+
go build -tags no_gvisortapvsock ./cmd/rootlesskit
288+
289+
- Build without slirp4netns support (also disables the slirp4netns port driver):
290+
go build -tags no_slirp4netns ./cmd/rootlesskit
291+
292+
- Build without lxc-user-nic support:
293+
go build -tags no_lxcusernic ./cmd/rootlesskit
294+
295+
If a disabled driver is selected at runtime (e.g., --net=vpnkit when built with -tags no_vpnkit), RootlessKit returns an error indicating that the driver was disabled at build time.

pkg/network/gvisortapvsock/gvisortapvsock.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
//go:build !no_gvisortapvsock
2+
// +build !no_gvisortapvsock
3+
14
package gvisortapvsock
25

36
import (
@@ -96,6 +99,13 @@ func (d *parentDriver) MTU() int {
9699
return d.mtu
97100
}
98101

102+
// GetVirtualNetwork returns the virtual network used by this driver
103+
func (d *parentDriver) GetVirtualNetwork() *virtualnetwork.VirtualNetwork {
104+
d.vnMu.RLock()
105+
defer d.vnMu.RUnlock()
106+
return d.vn
107+
}
108+
99109
// setupNetworkConfig sets up the basic network configuration
100110
func (d *parentDriver) setupNetworkConfig() (ip string, gateway string, netmask int, err error) {
101111

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
//go:build no_gvisortapvsock
2+
// +build no_gvisortapvsock
3+
4+
package gvisortapvsock
5+
6+
import (
7+
"context"
8+
"errors"
9+
"io"
10+
"net"
11+
12+
"github.com/rootless-containers/rootlesskit/v3/pkg/api"
13+
"github.com/rootless-containers/rootlesskit/v3/pkg/messages"
14+
"github.com/rootless-containers/rootlesskit/v3/pkg/network"
15+
)
16+
17+
// NewParentDriver returns a stub when built with the no_gvisortapvsock tag.
18+
func NewParentDriver(logWriter io.Writer, mtu int, ipnet *net.IPNet, ifname string, disableHostLoopback bool, enableIPv6 bool) (network.ParentDriver, error) {
19+
return &disabledParent{}, errors.New("gvisor-tap-vsock network driver disabled by build tag no_gvisortapvsock")
20+
}
21+
22+
type disabledParent struct{}
23+
24+
func (d *disabledParent) Info(ctx context.Context) (*api.NetworkDriverInfo, error) {
25+
return nil, errors.New("gvisor-tap-vsock network driver disabled by build tag no_gvisortapvsock")
26+
}
27+
28+
func (d *disabledParent) MTU() int { return 0 }
29+
30+
func (d *disabledParent) ConfigureNetwork(childPID int, stateDir string, detachedNetNSPath string) (*messages.ParentInitNetworkDriverCompleted, func() error, error) {
31+
return nil, func() error { return nil }, errors.New("gvisor-tap-vsock network driver disabled by build tag no_gvisortapvsock")
32+
}
33+
34+
// NewChildDriver returns a stub when built with the no_gvisortapvsock tag.
35+
func NewChildDriver() network.ChildDriver { return &disabledChild{} }
36+
37+
type disabledChild struct{}
38+
39+
func (d *disabledChild) ChildDriverInfo() (*network.ChildDriverInfo, error) {
40+
return &network.ChildDriverInfo{ConfiguresInterface: false}, nil
41+
}
42+
43+
func (d *disabledChild) ConfigureNetworkChild(netmsg *messages.ParentInitNetworkDriverCompleted, detachedNetNSPath string) (string, error) {
44+
return "", errors.New("gvisor-tap-vsock network driver disabled by build tag no_gvisortapvsock")
45+
}

pkg/network/lxcusernic/lxcusernic.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
//go:build !no_lxcusernic
2+
// +build !no_lxcusernic
3+
14
package lxcusernic
25

36
import (
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
//go:build no_lxcusernic
2+
// +build no_lxcusernic
3+
4+
package lxcusernic
5+
6+
import (
7+
"context"
8+
"errors"
9+
10+
"github.com/rootless-containers/rootlesskit/v3/pkg/api"
11+
"github.com/rootless-containers/rootlesskit/v3/pkg/messages"
12+
"github.com/rootless-containers/rootlesskit/v3/pkg/network"
13+
)
14+
15+
// NewParentDriver returns a stub when built with the no_lxcusernic tag.
16+
func NewParentDriver(binary string, mtu int, bridge string, ifname string) (network.ParentDriver, error) {
17+
return &disabledParent{}, errors.New("lxc-user-nic network driver disabled by build tag no_lxcusernic")
18+
}
19+
20+
type disabledParent struct{}
21+
22+
func (d *disabledParent) Info(ctx context.Context) (*api.NetworkDriverInfo, error) {
23+
return nil, errors.New("lxc-user-nic network driver disabled by build tag no_lxcusernic")
24+
}
25+
26+
func (d *disabledParent) MTU() int { return 0 }
27+
28+
func (d *disabledParent) ConfigureNetwork(childPID int, stateDir string, detachedNetNSPath string) (*messages.ParentInitNetworkDriverCompleted, func() error, error) {
29+
return nil, func() error { return nil }, errors.New("lxc-user-nic network driver disabled by build tag no_lxcusernic")
30+
}
31+
32+
// NewChildDriver returns a stub when built with the no_lxcusernic tag.
33+
func NewChildDriver() network.ChildDriver { return &disabledChild{} }
34+
35+
type disabledChild struct{}
36+
37+
func (d *disabledChild) ChildDriverInfo() (*network.ChildDriverInfo, error) {
38+
return &network.ChildDriverInfo{ConfiguresInterface: false}, nil
39+
}
40+
41+
func (d *disabledChild) ConfigureNetworkChild(netmsg *messages.ParentInitNetworkDriverCompleted, detachedNetNSPath string) (string, error) {
42+
return "", errors.New("lxc-user-nic network driver disabled by build tag no_lxcusernic")
43+
}

pkg/network/slirp4netns/slirp4netns.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
//go:build !no_slirp4netns
2+
// +build !no_slirp4netns
3+
14
package slirp4netns
25

36
import (
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
//go:build no_slirp4netns
2+
// +build no_slirp4netns
3+
4+
package slirp4netns
5+
6+
import (
7+
"context"
8+
"errors"
9+
"io"
10+
"net"
11+
12+
"github.com/rootless-containers/rootlesskit/v3/pkg/api"
13+
"github.com/rootless-containers/rootlesskit/v3/pkg/messages"
14+
"github.com/rootless-containers/rootlesskit/v3/pkg/network"
15+
)
16+
17+
// NewParentDriver returns a stub when built with the no_slirp4netns tag.
18+
func NewParentDriver(logWriter io.Writer, binary string, mtu int, ipnet *net.IPNet, ifname string, disableHostLoopback bool, apiSocketPath string, enableSandbox bool, enableSeccomp bool, enableIPv6 bool) (network.ParentDriver, error) {
19+
return &disabledParent{}, errors.New("slirp4netns network driver disabled by build tag no_slirp4netns")
20+
}
21+
22+
type disabledParent struct{}
23+
24+
func (d *disabledParent) Info(ctx context.Context) (*api.NetworkDriverInfo, error) {
25+
return nil, errors.New("slirp4netns network driver disabled by build tag no_slirp4netns")
26+
}
27+
28+
func (d *disabledParent) MTU() int { return 0 }
29+
30+
func (d *disabledParent) ConfigureNetwork(childPID int, stateDir string, detachedNetNSPath string) (*messages.ParentInitNetworkDriverCompleted, func() error, error) {
31+
return nil, func() error { return nil }, errors.New("slirp4netns network driver disabled by build tag no_slirp4netns")
32+
}
33+
34+
// NewChildDriver returns a stub when built with the no_slirp4netns tag.
35+
func NewChildDriver() network.ChildDriver { return &disabledChild{} }
36+
37+
type disabledChild struct{}
38+
39+
func (d *disabledChild) ChildDriverInfo() (*network.ChildDriverInfo, error) {
40+
return &network.ChildDriverInfo{ConfiguresInterface: false}, nil
41+
}
42+
43+
func (d *disabledChild) ConfigureNetworkChild(netmsg *messages.ParentInitNetworkDriverCompleted, detachedNetNSPath string) (string, error) {
44+
return "", errors.New("slirp4netns network driver disabled by build tag no_slirp4netns")
45+
}

pkg/network/vpnkit/vpnkit.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
//go:build !no_vpnkit
2+
// +build !no_vpnkit
3+
14
package vpnkit
25

36
import (
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
//go:build no_vpnkit
2+
// +build no_vpnkit
3+
4+
package vpnkit
5+
6+
import (
7+
"context"
8+
"errors"
9+
10+
"github.com/rootless-containers/rootlesskit/v3/pkg/api"
11+
"github.com/rootless-containers/rootlesskit/v3/pkg/messages"
12+
"github.com/rootless-containers/rootlesskit/v3/pkg/network"
13+
)
14+
15+
// NewParentDriver returns a stub when built with the no_vpnkit tag.
16+
func NewParentDriver(binary string, mtu int, ifname string, disableHostLoopback bool) network.ParentDriver {
17+
return &disabledParent{}
18+
}
19+
20+
type disabledParent struct{}
21+
22+
func (d *disabledParent) Info(ctx context.Context) (*api.NetworkDriverInfo, error) {
23+
return nil, errors.New("vpnkit network driver disabled by build tag no_vpnkit")
24+
}
25+
26+
func (d *disabledParent) MTU() int { return 0 }
27+
28+
func (d *disabledParent) ConfigureNetwork(childPID int, stateDir, detachedNetNSPath string) (*messages.ParentInitNetworkDriverCompleted, func() error, error) {
29+
return nil, func() error { return nil }, errors.New("vpnkit network driver disabled by build tag no_vpnkit")
30+
}
31+
32+
// NewChildDriver returns a stub when built with the no_vpnkit tag.
33+
func NewChildDriver() network.ChildDriver { return &disabledChild{} }
34+
35+
type disabledChild struct{}
36+
37+
func (d *disabledChild) ChildDriverInfo() (*network.ChildDriverInfo, error) {
38+
return &network.ChildDriverInfo{ConfiguresInterface: false}, nil
39+
}
40+
41+
func (d *disabledChild) ConfigureNetworkChild(netmsg *messages.ParentInitNetworkDriverCompleted, detachedNetNSPath string) (string, error) {
42+
return "", errors.New("vpnkit network driver disabled by build tag no_vpnkit")
43+
}

pkg/port/gvisortapvsock/gvisortapvsock.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
//go:build !no_gvisortapvsock
2+
// +build !no_gvisortapvsock
3+
14
package gvisortapvsock
25

36
import (

0 commit comments

Comments
 (0)