From d76c253342eed405fcb4e0daccaaf55b44e540bb Mon Sep 17 00:00:00 2001 From: hellt Date: Fri, 13 Nov 2020 18:19:48 +0200 Subject: [PATCH 1/4] removed Node.Volumes as we do not use named volumes --- clab/config.go | 9 --------- clab/docker.go | 1 - 2 files changed, 10 deletions(-) diff --git a/clab/config.go b/clab/config.go index b0c865257..d4c65122c 100644 --- a/clab/config.go +++ b/clab/config.go @@ -99,7 +99,6 @@ type Node struct { Cmd string Env []string Mounts map[string]volume - Volumes map[string]struct{} Binds []string TLSCert string @@ -343,14 +342,6 @@ func (c *cLab) NewNode(nodeName string, nodeCfg NodeConfig, idx int) error { log.Debug("Topology File: ", v.Source) node.Mounts["topology"] = v - node.Volumes = make(map[string]struct{}) - node.Volumes = map[string]struct{}{ - node.Mounts["license"].Destination: {}, - node.Mounts["config"].Destination: {}, - node.Mounts["envConf"].Destination: {}, - node.Mounts["topology"].Destination: {}, - } - bindLicense := node.Mounts["license"].Source + ":" + node.Mounts["license"].Destination + ":" + "ro" bindConfig := node.Mounts["config"].Source + ":" + node.Mounts["config"].Destination + ":" + "rw" bindEnvConf := node.Mounts["envConf"].Source + ":" + node.Mounts["envConf"].Destination + ":" + "rw" diff --git a/clab/docker.go b/clab/docker.go index 1187b5102..6cebf7281 100644 --- a/clab/docker.go +++ b/clab/docker.go @@ -168,7 +168,6 @@ func (c *cLab) CreateContainer(ctx context.Context, node *Node) (err error) { AttachStdout: true, AttachStderr: true, Hostname: node.ShortName, - Volumes: node.Volumes, Tty: true, User: node.User, Labels: labels, From 6108f91eb6383660099a412a1560ba3c36ddde11 Mon Sep 17 00:00:00 2001 From: hellt Date: Fri, 13 Nov 2020 19:06:00 +0200 Subject: [PATCH 2/4] used node.Mounts in string format --- clab/config.go | 55 +++++++++++++++++--------------------------------- clab/docker.go | 2 +- 2 files changed, 20 insertions(+), 37 deletions(-) diff --git a/clab/config.go b/clab/config.go index d4c65122c..77629b65c 100644 --- a/clab/config.go +++ b/clab/config.go @@ -98,7 +98,7 @@ type Node struct { User string Cmd string Env []string - Mounts map[string]volume + Mounts []string // Bind mounts strings (src:dest:options) Binds []string TLSCert string @@ -316,41 +316,24 @@ func (c *cLab) NewNode(nodeName string, nodeCfg NodeConfig, idx int) error { node.Sysctls["net.ipv6.conf.all.autoconf"] = "0" node.Sysctls["net.ipv6.conf.default.autoconf"] = "0" - node.Mounts = make(map[string]volume) - var v volume - v.Source = c.Dir.Lab + "/" + "license.key" - v.Destination = "/opt/srlinux/etc/license.key" - v.ReadOnly = true - log.Debug("License key: ", v.Source) - node.Mounts["license"] = v - - v.Source = node.LabDir + "/" + "config/" - v.Destination = "/etc/opt/srlinux/" - v.ReadOnly = false - log.Debug("Config: ", v.Source) - node.Mounts["config"] = v - - v.Source = node.LabDir + "/" + "srlinux.conf" - v.Destination = "/home/admin/.srlinux.conf" - v.ReadOnly = false - log.Debug("Env Config: ", v.Source) - node.Mounts["envConf"] = v - - v.Source = node.LabDir + "/" + "topology.yml" - v.Destination = "/tmp/topology.yml" - v.ReadOnly = true - log.Debug("Topology File: ", v.Source) - node.Mounts["topology"] = v - - bindLicense := node.Mounts["license"].Source + ":" + node.Mounts["license"].Destination + ":" + "ro" - bindConfig := node.Mounts["config"].Source + ":" + node.Mounts["config"].Destination + ":" + "rw" - bindEnvConf := node.Mounts["envConf"].Source + ":" + node.Mounts["envConf"].Destination + ":" + "rw" - bindTopology := node.Mounts["topology"].Source + ":" + node.Mounts["topology"].Destination + ":" + "ro" - - node.Binds = append(node.Binds, bindLicense) - node.Binds = append(node.Binds, bindConfig) - node.Binds = append(node.Binds, bindEnvConf) - node.Binds = append(node.Binds, bindTopology) + // mount license path + licPath, err := filepath.Abs(node.License) + if err != nil { + return err + } + node.Mounts = append(node.Mounts, fmt.Sprint(licPath, ":/opt/srlinux/etc/license.key:ro")) + + // mount config directory + cfgPath := filepath.Join(node.LabDir, "config") + node.Mounts = append(node.Mounts, fmt.Sprint(cfgPath, ":/etc/opt/srlinux/:rw")) + + // mount srlinux.conf + srlconfPath := filepath.Join(node.LabDir, "srlinux.conf") + node.Mounts = append(node.Mounts, fmt.Sprint(srlconfPath, ":/home/admin/.srlinux.conf:rw")) + + // mount srlinux topology + topoPath := filepath.Join(node.LabDir, "topology.yml") + node.Mounts = append(node.Mounts, fmt.Sprint(topoPath, ":/tmp/topology.yml:ro")) case "alpine", "linux": node.Config = c.configInitialization(&nodeCfg, node.Kind) diff --git a/clab/docker.go b/clab/docker.go index 6cebf7281..323ac7ca0 100644 --- a/clab/docker.go +++ b/clab/docker.go @@ -172,7 +172,7 @@ func (c *cLab) CreateContainer(ctx context.Context, node *Node) (err error) { User: node.User, Labels: labels, }, &container.HostConfig{ - Binds: node.Binds, + Binds: node.Mounts, Sysctls: node.Sysctls, Privileged: true, NetworkMode: container.NetworkMode(c.Config.Mgmt.Network), From 563d1a4bf9a8c819dbc0db902e27432c4d248a51 Mon Sep 17 00:00:00 2001 From: hellt Date: Fri, 13 Nov 2020 19:22:08 +0200 Subject: [PATCH 3/4] added mounts field to NodeCfg and init func --- clab/config.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/clab/config.go b/clab/config.go index 77629b65c..cfc7bcc69 100644 --- a/clab/config.go +++ b/clab/config.go @@ -49,6 +49,7 @@ type NodeConfig struct { License string Position string Cmd string + Mounts []string // list of bind mount compatible strings } // Topology represents a lab topology @@ -182,6 +183,13 @@ func (c *cLab) kindInitialization(nodeCfg *NodeConfig) string { return c.Config.Topology.Defaults.Kind } +func (c *cLab) mountsInit(nodeCfg *NodeConfig) []string { + if len(nodeCfg.Mounts) != 0 { + return nodeCfg.Mounts + } + return c.Config.Topology.Kinds[nodeCfg.Kind].Mounts +} + func (c *cLab) groupInitialization(nodeCfg *NodeConfig, kind string) string { if nodeCfg.Group != "" { return nodeCfg.Group @@ -252,6 +260,7 @@ func (c *cLab) NewNode(nodeName string, nodeCfg NodeConfig, idx int) error { // Kind initialization is either coming from `topology.nodes` section or from `topology.defaults` // normalize the data to lower case to compare node.Kind = strings.ToLower(c.kindInitialization(&nodeCfg)) + node.Mounts = c.mountsInit(&nodeCfg) switch node.Kind { case "ceos": // initialize the global parameters with defaults, can be overwritten later From e4d5dd92ebaaa12f44ea8f8753357cb48efe549c Mon Sep 17 00:00:00 2001 From: hellt Date: Mon, 16 Nov 2020 10:07:58 +0200 Subject: [PATCH 4/4] switched `mounts` to `binds` in topo file and internal fields --- clab/config.go | 23 +++++++++++------------ clab/docker.go | 2 +- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/clab/config.go b/clab/config.go index cfc7bcc69..741bdb1f9 100644 --- a/clab/config.go +++ b/clab/config.go @@ -49,7 +49,7 @@ type NodeConfig struct { License string Position string Cmd string - Mounts []string // list of bind mount compatible strings + Binds []string // list of bind mount compatible strings } // Topology represents a lab topology @@ -99,8 +99,7 @@ type Node struct { User string Cmd string Env []string - Mounts []string // Bind mounts strings (src:dest:options) - Binds []string + Binds []string // Bind mounts strings (src:dest:options) TLSCert string TLSKey string @@ -183,11 +182,11 @@ func (c *cLab) kindInitialization(nodeCfg *NodeConfig) string { return c.Config.Topology.Defaults.Kind } -func (c *cLab) mountsInit(nodeCfg *NodeConfig) []string { - if len(nodeCfg.Mounts) != 0 { - return nodeCfg.Mounts +func (c *cLab) bindsInit(nodeCfg *NodeConfig) []string { + if len(nodeCfg.Binds) != 0 { + return nodeCfg.Binds } - return c.Config.Topology.Kinds[nodeCfg.Kind].Mounts + return c.Config.Topology.Kinds[nodeCfg.Kind].Binds } func (c *cLab) groupInitialization(nodeCfg *NodeConfig, kind string) string { @@ -260,7 +259,7 @@ func (c *cLab) NewNode(nodeName string, nodeCfg NodeConfig, idx int) error { // Kind initialization is either coming from `topology.nodes` section or from `topology.defaults` // normalize the data to lower case to compare node.Kind = strings.ToLower(c.kindInitialization(&nodeCfg)) - node.Mounts = c.mountsInit(&nodeCfg) + node.Binds = c.bindsInit(&nodeCfg) switch node.Kind { case "ceos": // initialize the global parameters with defaults, can be overwritten later @@ -330,19 +329,19 @@ func (c *cLab) NewNode(nodeName string, nodeCfg NodeConfig, idx int) error { if err != nil { return err } - node.Mounts = append(node.Mounts, fmt.Sprint(licPath, ":/opt/srlinux/etc/license.key:ro")) + node.Binds = append(node.Binds, fmt.Sprint(licPath, ":/opt/srlinux/etc/license.key:ro")) // mount config directory cfgPath := filepath.Join(node.LabDir, "config") - node.Mounts = append(node.Mounts, fmt.Sprint(cfgPath, ":/etc/opt/srlinux/:rw")) + node.Binds = append(node.Binds, fmt.Sprint(cfgPath, ":/etc/opt/srlinux/:rw")) // mount srlinux.conf srlconfPath := filepath.Join(node.LabDir, "srlinux.conf") - node.Mounts = append(node.Mounts, fmt.Sprint(srlconfPath, ":/home/admin/.srlinux.conf:rw")) + node.Binds = append(node.Binds, fmt.Sprint(srlconfPath, ":/home/admin/.srlinux.conf:rw")) // mount srlinux topology topoPath := filepath.Join(node.LabDir, "topology.yml") - node.Mounts = append(node.Mounts, fmt.Sprint(topoPath, ":/tmp/topology.yml:ro")) + node.Binds = append(node.Binds, fmt.Sprint(topoPath, ":/tmp/topology.yml:ro")) case "alpine", "linux": node.Config = c.configInitialization(&nodeCfg, node.Kind) diff --git a/clab/docker.go b/clab/docker.go index 323ac7ca0..6cebf7281 100644 --- a/clab/docker.go +++ b/clab/docker.go @@ -172,7 +172,7 @@ func (c *cLab) CreateContainer(ctx context.Context, node *Node) (err error) { User: node.User, Labels: labels, }, &container.HostConfig{ - Binds: node.Mounts, + Binds: node.Binds, Sysctls: node.Sysctls, Privileged: true, NetworkMode: container.NetworkMode(c.Config.Mgmt.Network),