Skip to content

Commit

Permalink
simplify init functions
Browse files Browse the repository at this point in the history
  • Loading branch information
karimra committed Jun 19, 2021
1 parent 3994035 commit 30081bf
Show file tree
Hide file tree
Showing 14 changed files with 107 additions and 170 deletions.
26 changes: 9 additions & 17 deletions clab/ceos.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,19 +52,16 @@ func ceosPostDeploy(ctx context.Context, c *CLab, node *types.NodeConfig, lworke
return err
}

func initCeosNode(c *CLab, nodeDef *types.NodeDefinition, nodeCfg *types.NodeConfig, user string, envs map[string]string) error {
func (c *CLab) initCeosNode(nodeCfg *types.NodeConfig) error {
var err error

// initialize the global parameters with defaults, can be overwritten later
// node.Config, err = c.configInit(nodeCfg, node.Kind)
c.Config.Topology.GetNodeConfig(nodeCfg.ShortName)
if err != nil {
return err
}
nodeCfg.Image = c.Config.Topology.GetNodeImage(nodeCfg.ShortName)
nodeCfg.Position = c.Config.Topology.GetNodePosition(nodeCfg.ShortName)

// initialize specific container information
if nodeCfg.Config == "" {
nodeCfg.Config = defaultConfigTemplates[nodeCfg.Kind]
}

// defined env vars for the ceos
kindEnv := map[string]string{
Expand All @@ -75,29 +72,24 @@ func initCeosNode(c *CLab, nodeDef *types.NodeDefinition, nodeCfg *types.NodeCon
"SKIP_ZEROTOUCH_BARRIER_IN_SYSDBINIT": "1",
"INTFTYPE": "eth",
"MAPETH0": "1",
"MGMT_INTF": "eth0"}
nodeCfg.Env = utils.MergeStringMaps(kindEnv, envs)
"MGMT_INTF": "eth0",
}
nodeCfg.Env = utils.MergeStringMaps(kindEnv, nodeCfg.Env)

// the node.Cmd should be aligned with the environment.
var envSb strings.Builder
envSb.WriteString("/sbin/init ")
for k, v := range nodeCfg.Env {
envSb.WriteString("systemd.setenv=" + k + "=" + v + " ")

}
nodeCfg.Cmd = envSb.String()

nodeCfg.User = user
nodeCfg.Group = c.Config.Topology.GetNodeGroup(nodeCfg.ShortName)
nodeCfg.NodeType = nodeDef.Type

nodeCfg.MacAddress = genMac("00:1c:73")

// mount config dir
cfgPath := filepath.Join(nodeCfg.LabDir, "flash")
nodeCfg.Binds = append(nodeCfg.Binds, fmt.Sprint(cfgPath, ":/mnt/flash/"))
nodeCfg.Binds = append(nodeCfg.Binds, fmt.Sprintf("%s:/mnt/flash/", cfgPath))

return err
return nil
}

func (c *CLab) createCEOSFiles(node *types.NodeConfig) error {
Expand Down
4 changes: 2 additions & 2 deletions clab/clab.go
Original file line number Diff line number Diff line change
Expand Up @@ -224,11 +224,11 @@ func (c *CLab) CreateNodes(ctx context.Context, workers uint) {
case node := <-nodesChan:
if node == nil {
log.Debugf("Worker %d terminating...", i)
return
continue
}
log.Debugf("Worker %d received node: %+v", i, node)
if node.Kind == "bridge" || node.Kind == "ovs-bridge" {
return
continue
}

var nodeCerts *Certificates
Expand Down
79 changes: 42 additions & 37 deletions clab/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -132,115 +132,121 @@ func (c *CLab) ParseTopology() error {

// NewNode initializes a new node object
func (c *CLab) NewNode(nodeName string, nodeDef *types.NodeDefinition, idx int) error {
// initialize a new node configuration
nodeCfg, err := c.createNodeCfg(nodeName, nodeDef, idx)
if err != nil {
return err
}

err = c.initializeNodeCfg(nodeCfg)
if err != nil {
return err
}
c.Nodes[nodeName] = nodeCfg
return nil
}

func (c *CLab) createNodeCfg(nodeName string, nodeDef *types.NodeDefinition, idx int) (*types.NodeConfig, error) {
nodeCfg := &types.NodeConfig{
ShortName: nodeName,
LongName: strings.Join([]string{prefix, c.Config.Name, nodeName}, "-"),
Fqdn: strings.Join([]string{nodeName, c.Config.Name, ".io"}, "."),
LabDir: path.Join(c.Dir.Lab, nodeName),
Index: idx,
Endpoints: make([]*types.Endpoint, 0),
Group: c.Config.Topology.GetNodeGroup(nodeName),
Kind: strings.ToLower(c.Config.Topology.GetNodeKind(nodeName)),
NodeType: c.Config.Topology.GetNodeType(nodeName),
Position: c.Config.Topology.GetNodePosition(nodeName),
Image: c.Config.Topology.GetNodeImage(nodeName),
User: c.Config.Topology.GetNodeUser(nodeName),
Cmd: c.Config.Topology.GetNodeCmd(nodeName),
Env: c.Config.Topology.GetNodeEnv(nodeName),
NetworkMode: strings.ToLower(c.Config.Topology.GetNodeNetworkMode(nodeName)),
MgmtIPv4Address: nodeDef.GetMgmtIPv4(),
MgmtIPv6Address: nodeDef.GetMgmtIPv6(),
Publish: c.Config.Topology.GetNodePublish(nodeName),
}

// initialize the node with global parameters
// Kind initialization is either coming from `topology.nodes` section or from `topology.defaults`
// normalize the data to lower case to compare
nodeCfg.Kind = strings.ToLower(c.Config.Topology.GetNodeKind(nodeName))

// initialize bind mounts
binds := c.Config.Topology.GetNodeBinds(nodeName)
err := resolveBindPaths(binds, nodeCfg.LabDir)
if err != nil {
return err
return nil, err
}
nodeCfg.Binds = binds

nodeCfg.PortSet, nodeCfg.PortBindings, err = c.Config.Topology.GetNodePorts(nodeName)
if err != nil {
return err
}

// initialize passed env variables which will be merged with kind specific ones
envs := c.Config.Topology.GetNodeEnv(nodeName)
user := c.Config.Topology.GetNodeUser(nodeName)
return nodeCfg, err
}

nodeCfg.Publish = c.Config.Topology.GetNodePublish(nodeName)
func (c *CLab) initializeNodeCfg(nodeCfg *types.NodeConfig) error {
var err error
switch nodeCfg.Kind {
case "ceos":
err = initCeosNode(c, nodeDef, nodeCfg, user, envs)
err = c.initCeosNode(nodeCfg)
if err != nil {
return err
}

case "srl":
err = initSRLNode(c, nodeDef, nodeCfg, user, envs)
err = c.initSRLNode(nodeCfg)
if err != nil {
return err
}
case "crpd":
err = initCrpdNode(c, nodeDef, nodeCfg, user, envs)
err = c.initCrpdNode(nodeCfg)
if err != nil {
return err
}
case "sonic-vs":
err = initSonicNode(c, nodeDef, nodeCfg, user, envs)
err = c.initSonicNode(nodeCfg)
if err != nil {
return err
}
case "vr-sros":
err = initSROSNode(c, nodeDef, nodeCfg, user, envs)
err = c.initSROSNode(nodeCfg)
if err != nil {
return err
}
case "vr-vmx":
err = initVrVMXNode(c, nodeDef, nodeCfg, user, envs)
err = c.initVrVMXNode(nodeCfg)
if err != nil {
return err
}
case "vr-xrv":
err = initVrXRVNode(c, nodeDef, nodeCfg, user, envs)
err = c.initVrXRVNode(nodeCfg)
if err != nil {
return err
}
case "vr-xrv9k":
err = initVrXRV9kNode(c, nodeDef, nodeCfg, user, envs)
err = c.initVrXRV9kNode(nodeCfg)
if err != nil {
return err
}
case "vr-veos":
err = initVrVeosNode(c, nodeDef, nodeCfg, user, envs)
err = c.initVrVeosNode(nodeCfg)
if err != nil {
return err
}
case "vr-csr":
err = initVrCSRNode(c, nodeDef, nodeCfg, user, envs)
err = c.initVrCSRNode(nodeCfg)
if err != nil {
return err
}
case "vr-ros":
err = initVrROSNode(c, nodeDef, nodeCfg, user, envs)
err = c.initVrROSNode(nodeCfg)
if err != nil {
return err
}
case "alpine", "linux", "mysocketio":
err = initLinuxNode(c, nodeDef, nodeCfg, user, envs)
err = c.initLinuxNode(nodeCfg)
if err != nil {
return err
}

case "bridge", "ovs-bridge":
nodeCfg.Group = c.Config.Topology.GetNodeGroup(nodeCfg.ShortName)
nodeCfg.Position = c.Config.Topology.GetNodePosition(nodeCfg.ShortName)

default:
return fmt.Errorf("node '%s' refers to a kind '%s' which is not supported. Supported kinds are %q", nodeName, nodeCfg.Kind, kinds)
return fmt.Errorf("node '%s' refers to a kind '%s' which is not supported. Supported kinds are %q", nodeCfg.ShortName, nodeCfg.Kind, kinds)
}

// init labels after all node kinds are processed
nodeCfg.Labels = c.Config.Topology.GetNodeLabels(nodeName)
nodeCfg.Labels = c.Config.Topology.GetNodeLabels(nodeCfg.ShortName)
nodeCfg.Labels = utils.MergeStringMaps(nodeCfg.Labels, map[string]string{
"containerlab": c.Config.Name,
"clab-node-name": nodeCfg.ShortName,
Expand All @@ -250,7 +256,6 @@ func (c *CLab) NewNode(nodeName string, nodeDef *types.NodeDefinition, idx int)
"clab-node-lab-dir": nodeCfg.LabDir,
"clab-topo-file": c.TopoFile.path,
})
c.Nodes[nodeName] = nodeCfg
return nil
}

Expand Down
19 changes: 8 additions & 11 deletions clab/crpd.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,16 @@ import (
"github.com/srl-labs/containerlab/utils"
)

func initCrpdNode(c *CLab, nodeDef *types.NodeDefinition, nodeCfg *types.NodeConfig, user string, envs map[string]string) error {
func (c *CLab) initCrpdNode(nodeCfg *types.NodeConfig) error {
var err error

c.Config.Topology.GetNodeConfig(nodeCfg.ShortName)
nodeCfg.Config, err = c.Config.Topology.GetNodeConfig(nodeCfg.ShortName)
if err != nil {
return err
}
nodeCfg.Image = c.Config.Topology.GetNodeImage(nodeCfg.ShortName)
nodeCfg.Group = c.Config.Topology.GetNodeGroup(nodeCfg.ShortName)
nodeCfg.Position = c.Config.Topology.GetNodePosition(nodeCfg.ShortName)
nodeCfg.User = user

if nodeCfg.Config == "" {
nodeCfg.Config = defaultConfigTemplates[nodeCfg.Kind]
}
// initialize license file
nodeCfg.License, err = c.Config.Topology.GetNodeLicense(nodeCfg.ShortName)
if err != nil {
Expand All @@ -36,8 +34,7 @@ func initCrpdNode(c *CLab, nodeDef *types.NodeDefinition, nodeCfg *types.NodeCon
nodeCfg.Binds = append(nodeCfg.Binds, fmt.Sprint(path.Join(nodeCfg.LabDir, "log"), ":/var/log"))
// mount sshd_config
nodeCfg.Binds = append(nodeCfg.Binds, fmt.Sprint(path.Join(nodeCfg.LabDir, "config/sshd_config"), ":/etc/ssh/sshd_config"))

return err
return nil
}

func (c *CLab) createCRPDFiles(nodeCfg *types.NodeConfig) error {
Expand All @@ -55,7 +52,7 @@ func (c *CLab) createCRPDFiles(nodeCfg *types.NodeConfig) error {

// copy crpd sshd conf file to crpd node dir
src := "/etc/containerlab/templates/crpd/sshd_config"
dst := nodeCfg.LabDir + "/config/sshd_config"
dst := path.Join(nodeCfg.LabDir, "/config/sshd_config")
err = copyFile(src, dst)
if err != nil {
return fmt.Errorf("file copy [src %s -> dst %s] failed %v", src, dst, err)
Expand All @@ -71,5 +68,5 @@ func (c *CLab) createCRPDFiles(nodeCfg *types.NodeConfig) error {
}
log.Debugf("CopyFile src %s -> dst %s succeeded", src, dst)
}
return err
return nil
}
14 changes: 3 additions & 11 deletions clab/linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,26 +10,18 @@ import (
"github.com/srl-labs/containerlab/types"
)

func initLinuxNode(c *CLab, nodeDef *types.NodeDefinition, nodeCfg *types.NodeConfig, user string, envs map[string]string) error {
func (c *CLab) initLinuxNode(nodeCfg *types.NodeConfig) error {
var err error

// nodeCfg.Config, err = c.configInit(nodeDef, nodeCfg.Kind)
c.Config.Topology.GetNodeConfig(nodeCfg.ShortName)
nodeCfg.Config, err = c.Config.Topology.GetNodeConfig(nodeCfg.ShortName)
if err != nil {
return err
}
nodeCfg.Image = c.Config.Topology.GetNodeImage(nodeCfg.ShortName)
nodeCfg.Group = c.Config.Topology.GetNodeGroup(nodeCfg.ShortName)
nodeCfg.Position = c.Config.Topology.GetNodePosition(nodeCfg.ShortName)
nodeCfg.Cmd = c.Config.Topology.GetNodeCmd(nodeCfg.ShortName)
nodeCfg.User = user

nodeCfg.Sysctls = make(map[string]string)
if strings.ToLower(nodeCfg.NetworkMode) != "host" {
nodeCfg.Sysctls["net.ipv6.conf.all.disable_ipv6"] = "0"
}

nodeCfg.Env = envs

return err
return nil
}
10 changes: 3 additions & 7 deletions clab/sonic.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,16 @@ package clab

import "github.com/srl-labs/containerlab/types"

func initSonicNode(c *CLab, nodeDef *types.NodeDefinition, nodeCfg *types.NodeConfig, user string, envs map[string]string) error {
func (c *CLab) initSonicNode(nodeCfg *types.NodeConfig) error {
var err error

c.Config.Topology.GetNodeConfig(nodeCfg.ShortName)
nodeCfg.Config, err = c.Config.Topology.GetNodeConfig(nodeCfg.ShortName)
if err != nil {
return err
}
nodeCfg.Image = c.Config.Topology.GetNodeImage(nodeCfg.ShortName)
nodeCfg.Group = c.Config.Topology.GetNodeGroup(nodeCfg.ShortName)
nodeCfg.Position = c.Config.Topology.GetNodePosition(nodeCfg.ShortName)
nodeCfg.User = user

// rewrite entrypoint so sonic won't start supervisord before we attach veth interfaces
nodeCfg.Entrypoint = "/bin/bash"

return err
return nil
}
Loading

0 comments on commit 30081bf

Please sign in to comment.