Skip to content

Commit

Permalink
Refactored to init runtimes before nodes
Browse files Browse the repository at this point in the history
  • Loading branch information
networkop committed Jul 6, 2021
1 parent 179492b commit 4a8a8f6
Show file tree
Hide file tree
Showing 19 changed files with 105 additions and 124 deletions.
60 changes: 47 additions & 13 deletions clab/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
"github.com/mitchellh/go-homedir"
log "github.com/sirupsen/logrus"
"github.com/srl-labs/containerlab/nodes"
clabRuntimes "github.com/srl-labs/containerlab/runtime"
"github.com/srl-labs/containerlab/types"
"github.com/srl-labs/containerlab/utils"
"github.com/vishvananda/netlink"
Expand Down Expand Up @@ -93,9 +94,52 @@ func (c *CLab) parseTopology() error {
nodeNames = append(nodeNames, nodeName)
}
sort.Strings(nodeNames)

// collect node runtimes in a map[NodeName] -> RuntimeName
var nodeRuntimes = make(map[string]string)

for nodeName, topologyNode := range c.Config.Topology.Nodes {
// this case is when runtime was overridden at the node level
if r := c.Config.Topology.GetNodeRuntime(nodeName); r != "" {
nodeRuntimes[nodeName] = r
continue
}

// this case if for non-default runtimes overriding the global default
if r, ok := nodes.NonDefaultRuntimes[topologyNode.GetKind()]; ok {
nodeRuntimes[nodeName] = r
continue
}

// saving the global default runtime
nodeRuntimes[nodeName] = c.globalRuntime
}

// initialize any extra runtimes
for _, r := range nodeRuntimes {
// this is the case for already init'ed runtimes
if _, ok := c.Runtimes[r]; ok {
continue
}

if rInit, ok := clabRuntimes.ContainerRuntimes[r]; ok {

newRuntime := rInit()
defaultConfig := c.Runtimes[c.globalRuntime].Config()
err := newRuntime.Init(
clabRuntimes.WithConfig(&defaultConfig),
)
if err != nil {
log.Fatalf("failed to init the container runtime: %s", err)
}

c.Runtimes[r] = newRuntime
}
}

var err error
for idx, nodeName := range nodeNames {
err = c.NewNode(nodeName, c.Config.Topology.Nodes[nodeName], idx)
err = c.NewNode(nodeName, nodeRuntimes[nodeName], c.Config.Topology.Nodes[nodeName], idx)
if err != nil {
return err
}
Expand All @@ -105,21 +149,11 @@ func (c *CLab) parseTopology() error {
c.Links[i] = c.NewLink(l)
}

// update runtimes in case overridden by nodes
for _, node := range c.Nodes {
if node.GetRuntime() == nil {
continue
}
if _, ok := c.Runtimes[node.GetRuntime().GetName()]; !ok {
c.Runtimes[node.GetRuntime().GetName()] = node.GetRuntime()
}
}

return nil
}

// NewNode initializes a new node object
func (c *CLab) NewNode(nodeName string, nodeDef *types.NodeDefinition, idx int) error {
func (c *CLab) NewNode(nodeName, nodeRuntime string, nodeDef *types.NodeDefinition, idx int) error {
nodeCfg, err := c.createNodeCfg(nodeName, nodeDef, idx)
if err != nil {
return err
Expand All @@ -133,7 +167,7 @@ func (c *CLab) NewNode(nodeName string, nodeDef *types.NodeDefinition, idx int)
n := nodeInitializer()
// Init

err = n.Init(nodeCfg, nodes.WithRuntime(c.globalRuntime, c.Runtimes), nodes.WithMgmtNet(c.Config.Mgmt))
err = n.Init(nodeCfg, nodes.WithRuntime(c.Runtimes[nodeRuntime]), nodes.WithMgmtNet(c.Config.Mgmt))
if err != nil {
log.Errorf("failed to initialize node %q: %v", nodeCfg.ShortName, err)
return fmt.Errorf("failed to initialize node %q: %v", nodeCfg.ShortName, err)
Expand Down
8 changes: 3 additions & 5 deletions nodes/bridge/bridge.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,9 @@ func (s *bridge) Deploy(ctx context.Context) error { retur
func (s *bridge) PostDeploy(ctx context.Context, ns map[string]nodes.Node) error {
return nil
}
func (s *bridge) WithMgmtNet(*types.MgmtNet) {}
func (s *bridge) WithRuntime(globalRuntime string, allRuntimes map[string]runtime.ContainerRuntime) {
s.runtime = allRuntimes[globalRuntime]
}
func (s *bridge) GetRuntime() runtime.ContainerRuntime { return s.runtime }
func (s *bridge) WithMgmtNet(*types.MgmtNet) {}
func (s *bridge) WithRuntime(r runtime.ContainerRuntime) { s.runtime = r }
func (s *bridge) GetRuntime() runtime.ContainerRuntime { return s.runtime }

func (s *bridge) GetContainer(ctx context.Context) (*types.GenericContainer, error) {
return nil, nil
Expand Down
8 changes: 3 additions & 5 deletions nodes/ceos/ceos.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,11 +92,9 @@ func (s *ceos) PostDeploy(ctx context.Context, ns map[string]nodes.Node) error {
return ceosPostDeploy(ctx, s.runtime, s.cfg)
}

func (s *ceos) WithMgmtNet(*types.MgmtNet) {}
func (s *ceos) WithRuntime(globalRuntime string, allRuntimes map[string]runtime.ContainerRuntime) {
s.runtime = allRuntimes[globalRuntime]
}
func (s *ceos) GetRuntime() runtime.ContainerRuntime { return s.runtime }
func (s *ceos) WithMgmtNet(*types.MgmtNet) {}
func (s *ceos) WithRuntime(r runtime.ContainerRuntime) { s.runtime = r }
func (s *ceos) GetRuntime() runtime.ContainerRuntime { return s.runtime }

func (s *ceos) SaveConfig(ctx context.Context) error {
_, stderr, err := s.runtime.Exec(ctx, s.cfg.LongName, saveCmd)
Expand Down
8 changes: 3 additions & 5 deletions nodes/crpd/crpd.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,11 +90,9 @@ func (s *crpd) GetImages() map[string]string {
}
}

func (s *crpd) WithMgmtNet(*types.MgmtNet) {}
func (s *crpd) WithRuntime(globalRuntime string, allRuntimes map[string]runtime.ContainerRuntime) {
s.runtime = allRuntimes[globalRuntime]
}
func (s *crpd) GetRuntime() runtime.ContainerRuntime { return s.runtime }
func (s *crpd) WithMgmtNet(*types.MgmtNet) {}
func (s *crpd) WithRuntime(r runtime.ContainerRuntime) { s.runtime = r }
func (s *crpd) GetRuntime() runtime.ContainerRuntime { return s.runtime }

func (s *crpd) Delete(ctx context.Context) error {
return s.runtime.DeleteContainer(ctx, s.Config().LongName)
Expand Down
32 changes: 2 additions & 30 deletions nodes/cvx/cvx.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,36 +84,8 @@ func (c *cvx) GetImages() map[string]string {
return images
}

func (c *cvx) WithMgmtNet(*types.MgmtNet) {}
func (c *cvx) WithRuntime(globalRuntime string, allRuntimes map[string]runtime.ContainerRuntime) {

// fallback to the global runtime if overridden
if c.Config().Runtime != "" {
c.runtime = allRuntimes[c.Config().Runtime]
return
}

// By default, running in ignite runtime
if igniteRuntime, ok := allRuntimes[runtime.IgniteRuntime]; ok {
c.runtime = igniteRuntime
return
}

if rInit, ok := runtime.ContainerRuntimes[runtime.IgniteRuntime]; ok {

c.runtime = rInit()

defaultConfig := allRuntimes[globalRuntime].Config()

err := c.runtime.Init(
runtime.WithConfig(&defaultConfig),
)
if err != nil {
log.Fatalf("failed to init the container runtime: %s", err)
}

}
}
func (c *cvx) WithMgmtNet(*types.MgmtNet) {}
func (c *cvx) WithRuntime(r runtime.ContainerRuntime) { c.runtime = r }

func (c *cvx) Delete(ctx context.Context) error {
return c.runtime.DeleteContainer(ctx, c.Config().LongName)
Expand Down
8 changes: 3 additions & 5 deletions nodes/host/host.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,9 @@ func (s *host) GetImages() map[string]string {
}
}

func (s *host) WithMgmtNet(*types.MgmtNet) {}
func (s *host) WithRuntime(globalRuntime string, allRuntimes map[string]runtime.ContainerRuntime) {
s.runtime = allRuntimes[globalRuntime]
}
func (s *host) GetRuntime() runtime.ContainerRuntime { return s.runtime }
func (s *host) WithMgmtNet(*types.MgmtNet) {}
func (s *host) WithRuntime(r runtime.ContainerRuntime) { s.runtime = r }
func (s *host) GetRuntime() runtime.ContainerRuntime { return s.runtime }

func (s *host) GetContainer(ctx context.Context) (*types.GenericContainer, error) {
return nil, nil
Expand Down
8 changes: 3 additions & 5 deletions nodes/linux/linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,9 @@ func (s *linux) GetImages() map[string]string {
return images
}

func (l *linux) WithMgmtNet(*types.MgmtNet) {}
func (l *linux) WithRuntime(globalRuntime string, allRuntimes map[string]runtime.ContainerRuntime) {
l.runtime = allRuntimes[globalRuntime]
}
func (s *linux) GetRuntime() runtime.ContainerRuntime { return s.runtime }
func (l *linux) WithMgmtNet(*types.MgmtNet) {}
func (l *linux) WithRuntime(r runtime.ContainerRuntime) { l.runtime = r }
func (s *linux) GetRuntime() runtime.ContainerRuntime { return s.runtime }

func (l *linux) Delete(ctx context.Context) error {
return l.runtime.DeleteContainer(ctx, l.Config().LongName)
Expand Down
8 changes: 3 additions & 5 deletions nodes/mysocketio/mysocketio.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,9 @@ func (s *mySocketIO) PostDeploy(ctx context.Context, ns map[string]nodes.Node) e
return err
}

func (s *mySocketIO) WithMgmtNet(*types.MgmtNet) {}
func (s *mySocketIO) WithRuntime(globalRuntime string, allRuntimes map[string]runtime.ContainerRuntime) {
s.runtime = allRuntimes[globalRuntime]
}
func (s *mySocketIO) GetRuntime() runtime.ContainerRuntime { return s.runtime }
func (s *mySocketIO) WithMgmtNet(*types.MgmtNet) {}
func (s *mySocketIO) WithRuntime(r runtime.ContainerRuntime) { s.runtime = r }
func (s *mySocketIO) GetRuntime() runtime.ContainerRuntime { return s.runtime }

func (s *mySocketIO) GetContainer(ctx context.Context) (*types.GenericContainer, error) {
return nil, nil
Expand Down
11 changes: 8 additions & 3 deletions nodes/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,19 @@ const (
NodeKindVrXRV9K = "vr-xrv9k"
)

// a map of node kinds overriding the default global runtime
var NonDefaultRuntimes = map[string]string{
NodeKindCVX: runtime.IgniteRuntime,
}

type Node interface {
Init(*types.NodeConfig, ...NodeOption) error
Config() *types.NodeConfig
PreDeploy(configName, labCADir, labCARoot string) error
Deploy(context.Context) error
PostDeploy(context.Context, map[string]Node) error
WithMgmtNet(*types.MgmtNet)
WithRuntime(string, map[string]runtime.ContainerRuntime)
WithRuntime(runtime.ContainerRuntime)
SaveConfig(context.Context) error
Delete(context.Context) error
GetImages() map[string]string
Expand All @@ -76,9 +81,9 @@ func WithMgmtNet(mgmt *types.MgmtNet) NodeOption {
}
}

func WithRuntime(g string, r map[string]runtime.ContainerRuntime) NodeOption {
func WithRuntime(r runtime.ContainerRuntime) NodeOption {
return func(n Node) {
n.WithRuntime(g, r)
n.WithRuntime(r)
}
}

Expand Down
8 changes: 3 additions & 5 deletions nodes/ovs/ovs.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,9 @@ func (l *ovs) PostDeploy(ctx context.Context, ns map[string]nodes.Node) error {
return nil
}

func (l *ovs) WithMgmtNet(*types.MgmtNet) {}
func (s *ovs) WithRuntime(globalRuntime string, allRuntimes map[string]runtime.ContainerRuntime) {
s.runtime = allRuntimes[globalRuntime]
}
func (s *ovs) GetRuntime() runtime.ContainerRuntime { return s.runtime }
func (l *ovs) WithMgmtNet(*types.MgmtNet) {}
func (s *ovs) WithRuntime(r runtime.ContainerRuntime) { s.runtime = r }
func (s *ovs) GetRuntime() runtime.ContainerRuntime { return s.runtime }

func (s *ovs) GetContainer(ctx context.Context) (*types.GenericContainer, error) {
return nil, nil
Expand Down
8 changes: 3 additions & 5 deletions nodes/sonic/sonic.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,11 +67,9 @@ func (s *sonic) PostDeploy(ctx context.Context, ns map[string]nodes.Node) error
return nil
}

func (s *sonic) WithMgmtNet(*types.MgmtNet) {}
func (s *sonic) WithRuntime(globalRuntime string, allRuntimes map[string]runtime.ContainerRuntime) {
s.runtime = allRuntimes[globalRuntime]
}
func (s *sonic) GetRuntime() runtime.ContainerRuntime { return s.runtime }
func (s *sonic) WithMgmtNet(*types.MgmtNet) {}
func (s *sonic) WithRuntime(r runtime.ContainerRuntime) { s.runtime = r }
func (s *sonic) GetRuntime() runtime.ContainerRuntime { return s.runtime }

func (s *sonic) Delete(ctx context.Context) error {
return s.runtime.DeleteContainer(ctx, s.Config().LongName)
Expand Down
8 changes: 3 additions & 5 deletions nodes/srl/srl.go
Original file line number Diff line number Diff line change
Expand Up @@ -180,11 +180,9 @@ func (s *srl) GetImages() map[string]string {
}
}

func (s *srl) WithMgmtNet(*types.MgmtNet) {}
func (s *srl) WithRuntime(globalRuntime string, allRuntimes map[string]runtime.ContainerRuntime) {
s.runtime = allRuntimes[globalRuntime]
}
func (s *srl) GetRuntime() runtime.ContainerRuntime { return s.runtime }
func (s *srl) WithMgmtNet(*types.MgmtNet) {}
func (s *srl) WithRuntime(r runtime.ContainerRuntime) { s.runtime = r }
func (s *srl) GetRuntime() runtime.ContainerRuntime { return s.runtime }

func (s *srl) Delete(ctx context.Context) error {
return s.runtime.DeleteContainer(ctx, s.Config().LongName)
Expand Down
10 changes: 4 additions & 6 deletions nodes/vr_csr/vr-csr.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,12 +70,10 @@ func (s *vrCsr) GetImages() map[string]string {
}
}

func (s *vrCsr) Destroy(ctx context.Context) error { return nil }
func (s *vrCsr) WithMgmtNet(mgmt *types.MgmtNet) { s.mgmt = mgmt }
func (s *vrCsr) WithRuntime(globalRuntime string, allRuntimes map[string]runtime.ContainerRuntime) {
s.runtime = allRuntimes[globalRuntime]
}
func (s *vrCsr) GetRuntime() runtime.ContainerRuntime { return s.runtime }
func (s *vrCsr) Destroy(ctx context.Context) error { return nil }
func (s *vrCsr) WithMgmtNet(mgmt *types.MgmtNet) { s.mgmt = mgmt }
func (s *vrCsr) WithRuntime(r runtime.ContainerRuntime) { s.runtime = r }
func (s *vrCsr) GetRuntime() runtime.ContainerRuntime { return s.runtime }

func (s *vrCsr) Delete(ctx context.Context) error {
return s.runtime.DeleteContainer(ctx, s.Config().LongName)
Expand Down
8 changes: 3 additions & 5 deletions nodes/vr_ros/vr-ros.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,11 +72,9 @@ func (s *vrRos) PostDeploy(ctx context.Context, ns map[string]nodes.Node) error
return nil
}

func (s *vrRos) WithMgmtNet(mgmt *types.MgmtNet) { s.mgmt = mgmt }
func (s *vrRos) WithRuntime(globalRuntime string, allRuntimes map[string]runtime.ContainerRuntime) {
s.runtime = allRuntimes[globalRuntime]
}
func (s *vrRos) GetRuntime() runtime.ContainerRuntime { return s.runtime }
func (s *vrRos) WithMgmtNet(mgmt *types.MgmtNet) { s.mgmt = mgmt }
func (s *vrRos) WithRuntime(r runtime.ContainerRuntime) { s.runtime = r }
func (s *vrRos) GetRuntime() runtime.ContainerRuntime { return s.runtime }

func (s *vrRos) Delete(ctx context.Context) error {
return s.runtime.DeleteContainer(ctx, s.Config().LongName)
Expand Down
8 changes: 3 additions & 5 deletions nodes/vr_sros/vr-sros.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,11 +83,9 @@ func (s *vrSROS) PostDeploy(ctx context.Context, ns map[string]nodes.Node) error
return nil
}

func (s *vrSROS) WithMgmtNet(mgmt *types.MgmtNet) { s.mgmt = mgmt }
func (s *vrSROS) WithRuntime(globalRuntime string, allRuntimes map[string]runtime.ContainerRuntime) {
s.runtime = allRuntimes[globalRuntime]
}
func (s *vrSROS) GetRuntime() runtime.ContainerRuntime { return s.runtime }
func (s *vrSROS) WithMgmtNet(mgmt *types.MgmtNet) { s.mgmt = mgmt }
func (s *vrSROS) WithRuntime(r runtime.ContainerRuntime) { s.runtime = r }
func (s *vrSROS) GetRuntime() runtime.ContainerRuntime { return s.runtime }

func (s *vrSROS) Delete(ctx context.Context) error {
return s.runtime.DeleteContainer(ctx, s.Config().LongName)
Expand Down
8 changes: 3 additions & 5 deletions nodes/vr_veos/vr-veos.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,11 +71,9 @@ func (s *vrVEOS) GetImages() map[string]string {
}
}

func (s *vrVEOS) WithMgmtNet(mgmt *types.MgmtNet) { s.mgmt = mgmt }
func (s *vrVEOS) WithRuntime(globalRuntime string, allRuntimes map[string]runtime.ContainerRuntime) {
s.runtime = allRuntimes[globalRuntime]
}
func (s *vrVEOS) GetRuntime() runtime.ContainerRuntime { return s.runtime }
func (s *vrVEOS) WithMgmtNet(mgmt *types.MgmtNet) { s.mgmt = mgmt }
func (s *vrVEOS) WithRuntime(r runtime.ContainerRuntime) { s.runtime = r }
func (s *vrVEOS) GetRuntime() runtime.ContainerRuntime { return s.runtime }

func (s *vrVEOS) Delete(ctx context.Context) error {
return s.runtime.DeleteContainer(ctx, s.Config().LongName)
Expand Down
8 changes: 3 additions & 5 deletions nodes/vr_vmx/vr-vmx.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,11 +75,9 @@ func (s *vrVMX) GetImages() map[string]string {
}
}

func (s *vrVMX) WithMgmtNet(mgmt *types.MgmtNet) { s.mgmt = mgmt }
func (s *vrVMX) WithRuntime(globalRuntime string, allRuntimes map[string]runtime.ContainerRuntime) {
s.runtime = allRuntimes[globalRuntime]
}
func (s *vrVMX) GetRuntime() runtime.ContainerRuntime { return s.runtime }
func (s *vrVMX) WithMgmtNet(mgmt *types.MgmtNet) { s.mgmt = mgmt }
func (s *vrVMX) WithRuntime(r runtime.ContainerRuntime) { s.runtime = r }
func (s *vrVMX) GetRuntime() runtime.ContainerRuntime { return s.runtime }

func (s *vrVMX) Delete(ctx context.Context) error {
return s.runtime.DeleteContainer(ctx, s.Config().LongName)
Expand Down
8 changes: 3 additions & 5 deletions nodes/vr_xrv/vr-xrv.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,11 +74,9 @@ func (s *vrXRV) GetImages() map[string]string {
}
}

func (s *vrXRV) WithMgmtNet(mgmt *types.MgmtNet) { s.mgmt = mgmt }
func (s *vrXRV) WithRuntime(globalRuntime string, allRuntimes map[string]runtime.ContainerRuntime) {
s.runtime = allRuntimes[globalRuntime]
}
func (s *vrXRV) GetRuntime() runtime.ContainerRuntime { return s.runtime }
func (s *vrXRV) WithMgmtNet(mgmt *types.MgmtNet) { s.mgmt = mgmt }
func (s *vrXRV) WithRuntime(r runtime.ContainerRuntime) { s.runtime = r }
func (s *vrXRV) GetRuntime() runtime.ContainerRuntime { return s.runtime }

func (s *vrXRV) Delete(ctx context.Context) error {
return s.runtime.DeleteContainer(ctx, s.Config().LongName)
Expand Down
Loading

0 comments on commit 4a8a8f6

Please sign in to comment.