Skip to content

Commit

Permalink
added Mgmt() runtime func to retrieve mgmtnet settings
Browse files Browse the repository at this point in the history
  • Loading branch information
hellt committed Feb 20, 2022
1 parent ddbdc5a commit 161fcb1
Show file tree
Hide file tree
Showing 6 changed files with 76 additions and 64 deletions.
15 changes: 9 additions & 6 deletions runtime/containerd/containerd.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ const (
func init() {
runtime.Register(runtimeName, func() runtime.ContainerRuntime {
return &ContainerdRuntime{
Mgmt: new(types.MgmtNet)}
mgmt: &types.MgmtNet{},
}
})
}

Expand All @@ -65,10 +66,12 @@ func (c *ContainerdRuntime) Init(opts ...runtime.RuntimeOption) error {
return nil
}

func (c *ContainerdRuntime) Mgmt() *types.MgmtNet { return c.mgmt }

type ContainerdRuntime struct {
config runtime.RuntimeConfig
client *containerd.Client
Mgmt *types.MgmtNet
mgmt *types.MgmtNet
}

func (c *ContainerdRuntime) WithConfig(cfg *runtime.RuntimeConfig) {
Expand All @@ -88,7 +91,7 @@ func (c *ContainerdRuntime) WithMgmtNet(n *types.MgmtNet) {
}
n.Bridge = "br-" + netname
}
c.Mgmt = n
c.mgmt = n
}

func (c *ContainerdRuntime) WithKeepMgmtNet() {
Expand All @@ -103,7 +106,7 @@ func (*ContainerdRuntime) CreateNet(_ context.Context) error {
}
func (c *ContainerdRuntime) DeleteNet(context.Context) error {
var err error
bridgename := c.Mgmt.Bridge
bridgename := c.mgmt.Bridge
brInUse := true
for i := 0; i < 10; i++ {
brInUse, err = utils.CheckBrInUse(bridgename)
Expand Down Expand Up @@ -232,7 +235,7 @@ func (c *ContainerdRuntime) CreateContainer(ctx context.Context, node *types.Nod
case "none":
// Done!
default:
cnic, cncl, cnirc, err = cniInit(node.LongName, "eth0", c.Mgmt)
cnic, cncl, cnirc, err = cniInit(node.LongName, "eth0", c.mgmt)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -764,7 +767,7 @@ func (c *ContainerdRuntime) DeleteContainer(ctx context.Context, containerID str
return err
}

cnic, cncl, cnirc, err := cniInit(containerID, "eth0", c.Mgmt)
cnic, cncl, cnirc, err := cniInit(containerID, "eth0", c.mgmt)
if err != nil {
return err
}
Expand Down
67 changes: 35 additions & 32 deletions runtime/docker/docker.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,15 +40,15 @@ const (
func init() {
runtime.Register(runtimeName, func() runtime.ContainerRuntime {
return &DockerRuntime{
Mgmt: new(types.MgmtNet),
mgmt: new(types.MgmtNet),
}
})
}

type DockerRuntime struct {
config runtime.RuntimeConfig
Client *dockerC.Client
Mgmt *types.MgmtNet
mgmt *types.MgmtNet
}

func (c *DockerRuntime) Init(opts ...runtime.RuntimeOption) error {
Expand All @@ -70,6 +70,9 @@ func (c *DockerRuntime) WithKeepMgmtNet() {
func (*DockerRuntime) GetName() string { return runtimeName }
func (c *DockerRuntime) Config() runtime.RuntimeConfig { return c.config }

// Mgmt return management network struct of a runtime
func (c *DockerRuntime) Mgmt() *types.MgmtNet { return c.mgmt }

func (c *DockerRuntime) WithConfig(cfg *runtime.RuntimeConfig) {
c.config.Timeout = cfg.Timeout
c.config.Debug = cfg.Debug
Expand All @@ -80,7 +83,7 @@ func (c *DockerRuntime) WithConfig(cfg *runtime.RuntimeConfig) {
}

func (c *DockerRuntime) WithMgmtNet(n *types.MgmtNet) {
c.Mgmt = n
c.mgmt = n
}

// CreateDockerNet creates a docker network or reusing if it exists
Expand All @@ -89,49 +92,49 @@ func (c *DockerRuntime) CreateNet(ctx context.Context) (err error) {
defer cancel()

// linux bridge name that is used by docker network
bridgeName := c.Mgmt.Bridge
bridgeName := c.mgmt.Bridge

log.Debugf("Checking if docker network '%s' exists", c.Mgmt.Network)
netResource, err := c.Client.NetworkInspect(nctx, c.Mgmt.Network, dockerTypes.NetworkInspectOptions{})
log.Debugf("Checking if docker network '%s' exists", c.mgmt.Network)
netResource, err := c.Client.NetworkInspect(nctx, c.mgmt.Network, dockerTypes.NetworkInspectOptions{})
switch {
case dockerC.IsErrNotFound(err):
log.Debugf("Network '%s' does not exist", c.Mgmt.Network)
log.Debugf("Network '%s' does not exist", c.mgmt.Network)
log.Infof("Creating docker network: Name='%s', IPv4Subnet='%s', IPv6Subnet='%s', MTU='%s'",
c.Mgmt.Network, c.Mgmt.IPv4Subnet, c.Mgmt.IPv6Subnet, c.Mgmt.MTU)
c.mgmt.Network, c.mgmt.IPv4Subnet, c.mgmt.IPv6Subnet, c.mgmt.MTU)

enableIPv6 := false
var ipamConfig []network.IPAMConfig

// check if IPv4/6 addr are assigned to a mgmt bridge
var v4gw, v6gw string
if c.Mgmt.Bridge != "" {
v4gw, v6gw, err = utils.FirstLinkIPs(c.Mgmt.Bridge)
if c.mgmt.Bridge != "" {
v4gw, v6gw, err = utils.FirstLinkIPs(c.mgmt.Bridge)
if err != nil {
// only return error if the error is not about link not found
// we will create the bridge if it doesn't exist
if !errors.As(err, &netlink.LinkNotFoundError{}) {
return err
}
}
log.Debugf("bridge %q has ipv4 adrr of %q and ipv6 addr of %q", c.Mgmt.Bridge, v4gw, v6gw)
log.Debugf("bridge %q has ipv4 adrr of %q and ipv6 addr of %q", c.mgmt.Bridge, v4gw, v6gw)
}

if c.Mgmt.IPv4Subnet != "" {
if c.Mgmt.IPv4Gw != "" {
v4gw = c.Mgmt.IPv4Gw
if c.mgmt.IPv4Subnet != "" {
if c.mgmt.IPv4Gw != "" {
v4gw = c.mgmt.IPv4Gw
}
ipamConfig = append(ipamConfig, network.IPAMConfig{
Subnet: c.Mgmt.IPv4Subnet,
Subnet: c.mgmt.IPv4Subnet,
Gateway: v4gw,
})
}

if c.Mgmt.IPv6Subnet != "" {
if c.Mgmt.IPv6Gw != "" {
v6gw = c.Mgmt.IPv6Gw
if c.mgmt.IPv6Subnet != "" {
if c.mgmt.IPv6Gw != "" {
v6gw = c.mgmt.IPv6Gw
}
ipamConfig = append(ipamConfig, network.IPAMConfig{
Subnet: c.Mgmt.IPv6Subnet,
Subnet: c.mgmt.IPv6Subnet,
Gateway: v6gw,
})
enableIPv6 = true
Expand All @@ -143,7 +146,7 @@ func (c *DockerRuntime) CreateNet(ctx context.Context) (err error) {
}

netwOpts := map[string]string{
"com.docker.network.driver.mtu": c.Mgmt.MTU,
"com.docker.network.driver.mtu": c.mgmt.MTU,
}

if bridgeName != "" {
Expand All @@ -163,7 +166,7 @@ func (c *DockerRuntime) CreateNet(ctx context.Context) (err error) {
Options: netwOpts,
}

netCreateResponse, err := c.Client.NetworkCreate(nctx, c.Mgmt.Network, opts)
netCreateResponse, err := c.Client.NetworkCreate(nctx, c.mgmt.Network, opts)
if err != nil {
return err
}
Expand All @@ -178,11 +181,11 @@ func (c *DockerRuntime) CreateNet(ctx context.Context) (err error) {
}

case err == nil:
log.Debugf("network '%s' was found. Reusing it...", c.Mgmt.Network)
log.Debugf("network '%s' was found. Reusing it...", c.mgmt.Network)
if len(netResource.ID) < 12 {
return fmt.Errorf("could not get bridge ID")
}
switch c.Mgmt.Network {
switch c.mgmt.Network {
case "bridge":
bridgeName = "docker0"
default:
Expand All @@ -197,11 +200,11 @@ func (c *DockerRuntime) CreateNet(ctx context.Context) (err error) {
return err
}

if c.Mgmt.Bridge == "" {
c.Mgmt.Bridge = bridgeName
if c.mgmt.Bridge == "" {
c.mgmt.Bridge = bridgeName
}

log.Debugf("Docker network '%s', bridge name '%s'", c.Mgmt.Network, bridgeName)
log.Debugf("Docker network '%s', bridge name '%s'", c.mgmt.Network, bridgeName)

log.Debug("Disable RPF check on the docker host")
err = setSysctl("net/ipv4/conf/all/rp_filter", 0)
Expand Down Expand Up @@ -231,7 +234,7 @@ func (c *DockerRuntime) CreateNet(ctx context.Context) (err error) {

// DeleteNet deletes a docker bridge
func (c *DockerRuntime) DeleteNet(ctx context.Context) (err error) {
network := c.Mgmt.Network
network := c.mgmt.Network
if network == "bridge" || c.config.KeepMgmtNet {
log.Debugf("Skipping deletion of '%s' network", network)
return nil
Expand All @@ -246,7 +249,7 @@ func (c *DockerRuntime) DeleteNet(ctx context.Context) (err error) {
numEndpoints := len(nres.Containers)
if numEndpoints > 0 {
if c.config.Debug {
log.Debugf("network '%s' has %d active endpoints, deletion skipped", c.Mgmt.Network, numEndpoints)
log.Debugf("network '%s' has %d active endpoints, deletion skipped", c.mgmt.Network, numEndpoints)
for _, endp := range nres.Containers {
log.Debugf("'%s' is connected to %s", endp.Name, network)
}
Expand Down Expand Up @@ -342,10 +345,10 @@ func (c *DockerRuntime) CreateContainer(ctx context.Context, node *types.NodeCon
case "host":
containerHostConfig.NetworkMode = "host"
default:
containerHostConfig.NetworkMode = container.NetworkMode(c.Mgmt.Network)
containerHostConfig.NetworkMode = container.NetworkMode(c.mgmt.Network)

containerNetworkingConfig.EndpointsConfig = map[string]*network.EndpointSettings{
c.Mgmt.Network: {
c.mgmt.Network: {
IPAMConfig: &network.EndpointIPAMConfig{
IPv4Address: node.MgmtIPv4Address,
IPv6Address: node.MgmtIPv6Address,
Expand Down Expand Up @@ -478,7 +481,7 @@ func (c *DockerRuntime) ListContainers(ctx context.Context, gfilters []*types.Ge
return nil, err
}
var nr []dockerTypes.NetworkResource
if c.Mgmt.Network == "" {
if c.mgmt.Network == "" {
nctx, cancel := context.WithTimeout(ctx, c.config.Timeout)
defer cancel()
// fetch containerlab created networks
Expand Down Expand Up @@ -554,7 +557,7 @@ func (c *DockerRuntime) produceGenericContainerList(inputContainers []dockerType
Labels: i.Labels,
NetworkSettings: types.GenericMgmtIPs{},
}
bridgeName := c.Mgmt.Network
bridgeName := c.mgmt.Network
// if bridgeName is "", try to find a network created by clab that the container is connected to
if bridgeName == "" && inputNetworkRessources != nil {
for _, nr := range inputNetworkRessources {
Expand Down
14 changes: 8 additions & 6 deletions runtime/ignite/ignite.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,21 +47,18 @@ var runtimePaths = []string{
type IgniteRuntime struct {
config runtime.RuntimeConfig
baseVM *api.VM
Mgmt *types.MgmtNet
mgmt *types.MgmtNet
ctrRuntime runtime.ContainerRuntime
}

func init() {
runtime.Register(runtimeName, func() runtime.ContainerRuntime {
return &IgniteRuntime{
Mgmt: new(types.MgmtNet),
mgmt: &types.MgmtNet{},
}
})
}

func (*IgniteRuntime) GetName() string { return runtimeName }
func (c *IgniteRuntime) Config() runtime.RuntimeConfig { return c.config }

func (c *IgniteRuntime) Init(opts ...runtime.RuntimeOption) error {

// check that /dev/kvm exists
Expand Down Expand Up @@ -112,6 +109,11 @@ func (c *IgniteRuntime) Init(opts ...runtime.RuntimeOption) error {
return nil
}

func (c *IgniteRuntime) Mgmt() *types.MgmtNet { return c.mgmt }

func (*IgniteRuntime) GetName() string { return runtimeName }
func (c *IgniteRuntime) Config() runtime.RuntimeConfig { return c.config }

func (c *IgniteRuntime) WithConfig(cfg *runtime.RuntimeConfig) {
c.config.Timeout = cfg.Timeout
c.config.Debug = cfg.Debug
Expand All @@ -126,7 +128,7 @@ func (c *IgniteRuntime) WithKeepMgmtNet() {
}

func (c *IgniteRuntime) WithMgmtNet(n *types.MgmtNet) {
c.Mgmt = n
c.mgmt = n
}

func (c *IgniteRuntime) CreateNet(ctx context.Context) error {
Expand Down
22 changes: 12 additions & 10 deletions runtime/podman/podman.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,14 @@ const (

type PodmanRuntime struct {
config *runtime.RuntimeConfig
Mgmt *types.MgmtNet
mgmt *types.MgmtNet
}

func init() {
runtime.Register(runtimeName, func() runtime.ContainerRuntime {
return &PodmanRuntime{
config: &runtime.RuntimeConfig{},
Mgmt: &types.MgmtNet{},
mgmt: &types.MgmtNet{},
}
})
}
Expand All @@ -47,6 +47,8 @@ func (r *PodmanRuntime) Init(opts ...runtime.RuntimeOption) error {
return nil
}

func (r *PodmanRuntime) Mgmt() *types.MgmtNet { return r.mgmt }

func (r *PodmanRuntime) WithConfig(cfg *runtime.RuntimeConfig) {
log.Debugf("Podman method WithConfig was called with cfg params: %+v", cfg)
// Check for nil pointers on input
Expand All @@ -68,11 +70,11 @@ func (r *PodmanRuntime) WithMgmtNet(net *types.MgmtNet) {
return
}
log.Debugf("Podman method WithMgmtNet was called with net params: %+v", net)
r.Mgmt = net
if r.Mgmt.Bridge == "" && r.Mgmt.Network != "" {
r.mgmt = net
if r.mgmt.Bridge == "" && r.mgmt.Network != "" {
// set bridge name = network name
// albeit we don't use it as of right now when creating a bridge
r.Mgmt.Bridge = r.Mgmt.Network
r.mgmt.Bridge = r.mgmt.Network
}

}
Expand All @@ -91,9 +93,9 @@ func (r *PodmanRuntime) CreateNet(ctx context.Context) error {
if err != nil {
return err
}
log.Debugf("Trying to create a management network with params %+v", r.Mgmt)
log.Debugf("Trying to create a management network with params %+v", r.mgmt)
// check the network existence first
b, err := network.Exists(ctx, r.Mgmt.Network, &network.ExistsOptions{})
b, err := network.Exists(ctx, r.mgmt.Network, &network.ExistsOptions{})
if err != nil {
return err
}
Expand All @@ -111,16 +113,16 @@ func (r *PodmanRuntime) CreateNet(ctx context.Context) error {
// DeleteNet deletes a clab mgmt bridge
func (r *PodmanRuntime) DeleteNet(ctx context.Context) error {
// Skip if "keep mgmt" is set
log.Debugf("Method DeleteNet was called with runtime inputs %+v and net settings %+v", r, r.Mgmt)
log.Debugf("Method DeleteNet was called with runtime inputs %+v and net settings %+v", r, r.mgmt)
if r.config.KeepMgmtNet {
return nil
}
ctx, err := r.connect(ctx)
if err != nil {
return err
}
log.Debugf("Trying to delete mgmt network %v", r.Mgmt.Network)
_, err = network.Remove(ctx, r.Mgmt.Network, &network.RemoveOptions{})
log.Debugf("Trying to delete mgmt network %v", r.mgmt.Network)
_, err = network.Remove(ctx, r.mgmt.Network, &network.RemoveOptions{})
if err != nil {
return fmt.Errorf("Error while trying to remove a mgmt network %w", err)
}
Expand Down
Loading

0 comments on commit 161fcb1

Please sign in to comment.