From 9b83c54d2402e15c755e792998ac2a73a194165f Mon Sep 17 00:00:00 2001 From: steiler Date: Thu, 14 Mar 2024 16:06:59 +0100 Subject: [PATCH] update --- clab/authz_keys.go | 6 +- clab/cert.go | 12 +-- clab/clab.go | 70 ++++------------ clab/config.go | 23 ++--- clab/config/utils.go | 3 +- clab/export.go | 4 +- clab/file.go | 5 +- clab/hostsfile.go | 5 +- clab/inventory.go | 3 +- clab/register.go | 84 ------------------- clab/sshconfig.go | 7 +- clab/utils.go | 38 +++++++++ cmd/destroy.go | 2 +- cmd/tools_veth.go | 3 +- kinds/all/all.go | 40 +++++++++ .../kind_registry/kind_registry.go | 39 +++++---- {nodes => kinds/types}/border0/border0.go | 13 +-- {nodes => kinds/types}/bridge/bridge.go | 6 +- {nodes => kinds/types}/c8000/c8000.cfg | 0 {nodes => kinds/types}/c8000/c8000.go | 5 +- {nodes => kinds/types}/ceos/ceos.cfg | 0 {nodes => kinds/types}/ceos/ceos.go | 8 +- .../checkpoint_cloudguard.go | 8 +- {nodes => kinds/types}/crpd/crpd.cfg | 0 {nodes => kinds/types}/crpd/crpd.go | 8 +- {nodes => kinds/types}/crpd/sshd_config | 0 {nodes => kinds/types}/cvx/cvx.go | 6 +- .../types}/ext_container/ext_container.go | 6 +- .../types}/fortinet_fortigate/fortigate.go | 8 +- {nodes => kinds/types}/host/host.go | 6 +- .../ipinfusion_ocnos/ipinfusion_ocnos.go | 8 +- {nodes => kinds/types}/k8s_kind/k8s_kind.go | 6 +- {nodes => kinds/types}/k8s_kind/logger.go | 0 .../types}/keysight_ixiacone/ixiac-one.go | 6 +- {nodes => kinds/types}/linux/linux.go | 6 +- {nodes => kinds/types}/ovs/ovs.go | 6 +- {nodes => kinds/types}/rare/rare.go | 6 +- {nodes => kinds/types}/sonic/sonic.go | 6 +- {nodes => kinds/types}/srl/banner.go | 0 {nodes => kinds/types}/srl/macaddr.go | 0 {nodes => kinds/types}/srl/prompt.go | 0 {nodes => kinds/types}/srl/prompt_test.go | 0 {nodes => kinds/types}/srl/srl.go | 8 +- .../types}/srl/srl_default_config.go.tpl | 0 {nodes => kinds/types}/srl/sshkey.go | 0 {nodes => kinds/types}/srl/sshkey_test.go | 0 {nodes => kinds/types}/srl/test_data/keys | 0 {nodes => kinds/types}/srl/test_data/rsa_key | 0 .../types}/srl/topology/7215IXSA1.yml | 0 .../types}/srl/topology/7220IXRD1.yml | 0 .../types}/srl/topology/7220IXRD2.yml | 0 .../types}/srl/topology/7220IXRD2L.yml | 0 .../types}/srl/topology/7220IXRD3.yml | 0 .../types}/srl/topology/7220IXRD3L.yml | 0 .../types}/srl/topology/7220IXRD4.yml | 0 .../types}/srl/topology/7220IXRD5.yml | 0 .../types}/srl/topology/7220IXRD5T.yml | 0 .../types}/srl/topology/7220IXRH2.yml | 0 .../types}/srl/topology/7220IXRH3.yml | 0 .../types}/srl/topology/7220IXRH4.yml | 0 .../types}/srl/topology/7250IXR10.yml | 0 .../types}/srl/topology/7250IXR10e.yml | 0 .../types}/srl/topology/7250IXR6.yml | 0 .../types}/srl/topology/7250IXR6e.yml | 0 .../types}/srl/topology/7730SXR-1d-32d.yml | 0 .../types}/srl/topology/7730SXR-1x-44s.yml | 0 {nodes => kinds/types}/srl/version.go | 0 {nodes => kinds/types}/vr_aoscx/vr-aoscx.go | 8 +- {nodes => kinds/types}/vr_csr/vr-csr.go | 8 +- {nodes => kinds/types}/vr_ftdv/vr-ftdv.go | 8 +- {nodes => kinds/types}/vr_ftosv/vr-ftosv.go | 8 +- {nodes => kinds/types}/vr_n9kv/vr-n9kv.go | 8 +- .../types}/vr_openbsd/vr-openbsd.go | 8 +- {nodes => kinds/types}/vr_pan/vr-pan.go | 8 +- {nodes => kinds/types}/vr_ros/vr-ros.go | 8 +- {nodes => kinds/types}/vr_sros/sshKey.go | 0 {nodes => kinds/types}/vr_sros/sshKey_test.go | 0 .../types}/vr_sros/ssh_keys.go.tpl | 0 {nodes => kinds/types}/vr_sros/vr-sros.go | 8 +- {nodes => kinds/types}/vr_veos/vr-veos.go | 8 +- .../vr_vjunosevolved/vr-vjunosevolved.go | 8 +- .../types}/vr_vjunosswitch/vr-vjunosswitch.go | 8 +- {nodes => kinds/types}/vr_vmx/vr-vmx.go | 8 +- {nodes => kinds/types}/vr_vqfx/vr-vqfx.go | 8 +- {nodes => kinds/types}/vr_vsrx/vr-vsrx.go | 8 +- {nodes => kinds/types}/vr_xrv/vr-xrv.go | 8 +- {nodes => kinds/types}/vr_xrv9k/vr-xrv9k.go | 8 +- {nodes => kinds/types}/xrd/xrd.cfg | 0 {nodes => kinds/types}/xrd/xrd.go | 8 +- 89 files changed, 286 insertions(+), 328 deletions(-) delete mode 100644 clab/register.go create mode 100644 clab/utils.go create mode 100644 kinds/all/all.go rename nodes/node_registry.go => kinds/kind_registry/kind_registry.go (71%) rename {nodes => kinds/types}/border0/border0.go (96%) rename {nodes => kinds/types}/bridge/bridge.go (96%) rename {nodes => kinds/types}/c8000/c8000.cfg (100%) rename {nodes => kinds/types}/c8000/c8000.go (94%) rename {nodes => kinds/types}/ceos/ceos.cfg (100%) rename {nodes => kinds/types}/ceos/ceos.go (97%) rename {nodes => kinds/types}/checkpoint_cloudguard/checkpoint_cloudguard.go (89%) rename {nodes => kinds/types}/crpd/crpd.cfg (100%) rename {nodes => kinds/types}/crpd/crpd.go (95%) rename {nodes => kinds/types}/crpd/sshd_config (100%) rename {nodes => kinds/types}/cvx/cvx.go (95%) rename {nodes => kinds/types}/ext_container/ext_container.go (93%) rename {nodes => kinds/types}/fortinet_fortigate/fortigate.go (92%) rename {nodes => kinds/types}/host/host.go (95%) rename {nodes => kinds/types}/ipinfusion_ocnos/ipinfusion_ocnos.go (91%) rename {nodes => kinds/types}/k8s_kind/k8s_kind.go (97%) rename {nodes => kinds/types}/k8s_kind/logger.go (100%) rename {nodes => kinds/types}/keysight_ixiacone/ixiac-one.go (92%) rename {nodes => kinds/types}/linux/linux.go (95%) rename {nodes => kinds/types}/ovs/ovs.go (96%) rename {nodes => kinds/types}/rare/rare.go (90%) rename {nodes => kinds/types}/sonic/sonic.go (91%) rename {nodes => kinds/types}/srl/banner.go (100%) rename {nodes => kinds/types}/srl/macaddr.go (100%) rename {nodes => kinds/types}/srl/prompt.go (100%) rename {nodes => kinds/types}/srl/prompt_test.go (100%) rename {nodes => kinds/types}/srl/srl.go (99%) rename {nodes => kinds/types}/srl/srl_default_config.go.tpl (100%) rename {nodes => kinds/types}/srl/sshkey.go (100%) rename {nodes => kinds/types}/srl/sshkey_test.go (100%) rename {nodes => kinds/types}/srl/test_data/keys (100%) rename {nodes => kinds/types}/srl/test_data/rsa_key (100%) rename {nodes => kinds/types}/srl/topology/7215IXSA1.yml (100%) rename {nodes => kinds/types}/srl/topology/7220IXRD1.yml (100%) rename {nodes => kinds/types}/srl/topology/7220IXRD2.yml (100%) rename {nodes => kinds/types}/srl/topology/7220IXRD2L.yml (100%) rename {nodes => kinds/types}/srl/topology/7220IXRD3.yml (100%) rename {nodes => kinds/types}/srl/topology/7220IXRD3L.yml (100%) rename {nodes => kinds/types}/srl/topology/7220IXRD4.yml (100%) rename {nodes => kinds/types}/srl/topology/7220IXRD5.yml (100%) rename {nodes => kinds/types}/srl/topology/7220IXRD5T.yml (100%) rename {nodes => kinds/types}/srl/topology/7220IXRH2.yml (100%) rename {nodes => kinds/types}/srl/topology/7220IXRH3.yml (100%) rename {nodes => kinds/types}/srl/topology/7220IXRH4.yml (100%) rename {nodes => kinds/types}/srl/topology/7250IXR10.yml (100%) rename {nodes => kinds/types}/srl/topology/7250IXR10e.yml (100%) rename {nodes => kinds/types}/srl/topology/7250IXR6.yml (100%) rename {nodes => kinds/types}/srl/topology/7250IXR6e.yml (100%) rename {nodes => kinds/types}/srl/topology/7730SXR-1d-32d.yml (100%) rename {nodes => kinds/types}/srl/topology/7730SXR-1x-44s.yml (100%) rename {nodes => kinds/types}/srl/version.go (100%) rename {nodes => kinds/types}/vr_aoscx/vr-aoscx.go (90%) rename {nodes => kinds/types}/vr_csr/vr-csr.go (92%) rename {nodes => kinds/types}/vr_ftdv/vr-ftdv.go (89%) rename {nodes => kinds/types}/vr_ftosv/vr-ftosv.go (91%) rename {nodes => kinds/types}/vr_n9kv/vr-n9kv.go (91%) rename {nodes => kinds/types}/vr_openbsd/vr-openbsd.go (92%) rename {nodes => kinds/types}/vr_pan/vr-pan.go (91%) rename {nodes => kinds/types}/vr_ros/vr-ros.go (90%) rename {nodes => kinds/types}/vr_sros/sshKey.go (100%) rename {nodes => kinds/types}/vr_sros/sshKey_test.go (100%) rename {nodes => kinds/types}/vr_sros/ssh_keys.go.tpl (100%) rename {nodes => kinds/types}/vr_sros/vr-sros.go (97%) rename {nodes => kinds/types}/vr_veos/vr-veos.go (92%) rename {nodes => kinds/types}/vr_vjunosevolved/vr-vjunosevolved.go (92%) rename {nodes => kinds/types}/vr_vjunosswitch/vr-vjunosswitch.go (92%) rename {nodes => kinds/types}/vr_vmx/vr-vmx.go (92%) rename {nodes => kinds/types}/vr_vqfx/vr-vqfx.go (92%) rename {nodes => kinds/types}/vr_vsrx/vr-vsrx.go (92%) rename {nodes => kinds/types}/vr_xrv/vr-xrv.go (92%) rename {nodes => kinds/types}/vr_xrv9k/vr-xrv9k.go (92%) rename {nodes => kinds/types}/xrd/xrd.cfg (100%) rename {nodes => kinds/types}/xrd/xrd.go (94%) diff --git a/clab/authz_keys.go b/clab/authz_keys.go index e1e3a4a69..7f54ce7b6 100644 --- a/clab/authz_keys.go +++ b/clab/authz_keys.go @@ -30,7 +30,7 @@ const ( func (c *CLab) createAuthzKeysFile() error { b := new(bytes.Buffer) - for _, k := range c.SSHPubKeys { + for _, k := range c.sSHPubKeys { x := strings.TrimSpace(string(ssh.MarshalAuthorizedKey(k))) addKeyToBuffer(b, x) } @@ -70,9 +70,9 @@ func RetrieveSSHPubKeysFromFiles() ([]ssh.PublicKey, error) { return keys, nil } -// RetrieveSSHPubKeys retrieves the PubKeys from the different sources +// retrieveSSHPubKeys retrieves the PubKeys from the different sources // SSHAgent as well as all home dir based /.ssh/*.pub files. -func (c *CLab) RetrieveSSHPubKeys() ([]ssh.PublicKey, error) { +func (c *CLab) retrieveSSHPubKeys() ([]ssh.PublicKey, error) { keys := make([]ssh.PublicKey, 0) var errs error diff --git a/clab/cert.go b/clab/cert.go index fd2a23fef..ea1b865a2 100644 --- a/clab/cert.go +++ b/clab/cert.go @@ -6,25 +6,25 @@ import ( "github.com/srl-labs/containerlab/cert" ) -// LoadOrGenerateCA loads the CA certificate from the storage, or generates a new one if it does not exist. -func (c *CLab) LoadOrGenerateCA(caCertInput *cert.CACSRInput) error { +// loadOrGenerateCA loads the CA certificate from the storage, or generates a new one if it does not exist. +func (c *CLab) loadOrGenerateCA(caCertInput *cert.CACSRInput) error { // try loading the CA cert, and if it fails, generate a new one - caCertificate, err := c.Cert.LoadCaCert() + caCertificate, err := c.cert.LoadCaCert() if err != nil { // if loading certs failed, try to generate new RootCA - caCertificate, err = c.Cert.GenerateCACert(caCertInput) + caCertificate, err = c.cert.GenerateCACert(caCertInput) if err != nil { return fmt.Errorf("failed generating new Root CA %v", err) } // store the root CA - err = c.Cert.StoreCaCert(caCertificate) + err = c.cert.StoreCaCert(caCertificate) if err != nil { return nil } } // set CA cert that was either loaded or generated - err = c.Cert.SetCACert(caCertificate) + err = c.cert.SetCACert(caCertificate) if err != nil { return nil } diff --git a/clab/clab.go b/clab/clab.go index a1485253e..2d1506f7c 100644 --- a/clab/clab.go +++ b/clab/clab.go @@ -20,6 +20,7 @@ import ( depMgr "github.com/srl-labs/containerlab/clab/dependency_manager" "github.com/srl-labs/containerlab/clab/exec" errs "github.com/srl-labs/containerlab/errors" + _ "github.com/srl-labs/containerlab/kinds/all" "github.com/srl-labs/containerlab/links" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/runtime" @@ -39,15 +40,13 @@ type CLab struct { TopoPaths *types.TopoPaths Nodes map[string]nodes.Node `json:"nodes,omitempty"` Links map[int]links.Link `json:"links,omitempty"` - Endpoints []links.Endpoint + endpoints []links.Endpoint Runtimes map[string]runtime.ContainerRuntime `json:"runtimes,omitempty"` - // reg is a registry of node kinds - Reg *nodes.NodeRegistry - Cert *cert.Cert + cert *cert.Cert // List of SSH public keys extracted from the ~/.ssh/authorized_keys file // and ~/.ssh/*.pub files. // The keys are used to enable key-based SSH access for the nodes. - SSHPubKeys []ssh.PublicKey + sSHPubKeys []ssh.PublicKey dependencyManager depMgr.DependencyManager m *sync.RWMutex @@ -176,11 +175,11 @@ func WithKeepMgmtNet() ClabOption { func WithTopoPath(path, varsFile string) ClabOption { return func(c *CLab) error { - file, err := c.ProcessTopoPath(path) + file, err := ProcessTopoPath(path, c.TopoPaths.ClabTmpDir()) if err != nil { return err } - if err := c.LoadTopologyFromFile(file, varsFile); err != nil { + if err := c.loadTopologyFromFile(file, varsFile); err != nil { return fmt.Errorf("failed to read topology file: %v", err) } @@ -188,37 +187,6 @@ func WithTopoPath(path, varsFile string) ClabOption { } } -// ProcessTopoPath takes a topology path, which might be the path to a directory or a file -// or stdin or a URL and returns the topology file name if found. -func (c *CLab) ProcessTopoPath(path string) (string, error) { - var file string - var err error - - switch { - case path == "-" || path == "stdin": - file, err = readFromStdin(c.TopoPaths.ClabTmpDir()) - if err != nil { - return "", err - } - // if the path is not a local file and a URL, download the file and store it in the tmp dir - case !utils.FileOrDirExists(path) && utils.IsHttpURL(path, true): - file, err = downloadTopoFile(path, c.TopoPaths.ClabTmpDir()) - if err != nil { - return "", err - } - - case path == "": - return "", fmt.Errorf("provide a path to the clab topology file") - - default: - file, err = FindTopoFileByPath(path) - if err != nil { - return "", err - } - } - return file, nil -} - // FindTopoFileByPath takes a topology path, which might be the path to a directory // and returns the topology file name if found. func FindTopoFileByPath(path string) (string, error) { @@ -337,13 +305,9 @@ func NewContainerLab(opts ...ClabOption) (*CLab, error) { Nodes: make(map[string]nodes.Node), Links: make(map[int]links.Link), Runtimes: make(map[string]runtime.ContainerRuntime), - Cert: &cert.Cert{}, + cert: &cert.Cert{}, } - // init a new NodeRegistry - c.Reg = nodes.NewNodeRegistry() - c.RegisterNodes() - for _, opt := range opts { err := opt(c) if err != nil { @@ -574,10 +538,10 @@ func (c *CLab) scheduleNodes(ctx context.Context, maxWorkers int, skipPostDeploy err := node.PreDeploy( ctx, &nodes.PreDeployParams{ - Cert: c.Cert, + Cert: c.cert, TopologyName: c.Config.Name, TopoPaths: c.TopoPaths, - SSHPubKeys: c.SSHPubKeys, + SSHPubKeys: c.sSHPubKeys, }, ) if err != nil { @@ -911,7 +875,7 @@ func (c *CLab) ResolveLinks() error { continue } - c.Endpoints = append(c.Endpoints, l.GetEndpoints()...) + c.endpoints = append(c.endpoints, l.GetEndpoints()...) c.Links[i] = l } @@ -1020,7 +984,7 @@ func (c *CLab) Deploy(ctx context.Context, options *DeployOptions) ([]runtime.Ge return nil, err } - c.SSHPubKeys, err = c.RetrieveSSHPubKeys() + c.sSHPubKeys, err = c.retrieveSSHPubKeys() if err != nil { log.Warn(err) } @@ -1077,7 +1041,7 @@ func (c *CLab) Deploy(ctx context.Context, options *DeployOptions) ([]runtime.Ge return nil, err } - if err := c.GenerateExports(ctx, topoDataF, options.exportTemplate); err != nil { + if err := c.generateExports(ctx, topoDataF, options.exportTemplate); err != nil { return nil, err } @@ -1111,8 +1075,8 @@ func (c *CLab) Deploy(ctx context.Context, options *DeployOptions) ([]runtime.Ge // certificateAuthoritySetup sets up the certificate authority parameters. func (c *CLab) certificateAuthoritySetup() error { // init the Cert storage and CA - c.Cert.CertStorage = cert.NewLocalDirCertStorage(c.TopoPaths) - c.Cert.CA = cert.NewCA() + c.cert.CertStorage = cert.NewLocalDirCertStorage(c.TopoPaths) + c.cert.CA = cert.NewCA() s := c.Config.Settings @@ -1162,7 +1126,7 @@ func (c *CLab) certificateAuthoritySetup() error { KeySize: keySize, } - return c.LoadOrGenerateCA(caCertInput) + return c.loadOrGenerateCA(caCertInput) } // Destroy the given topology. @@ -1199,13 +1163,13 @@ func (c *CLab) Destroy(ctx context.Context, maxWorkers uint, keepMgmtNet bool) e c.deleteNodes(ctx, maxWorkers, serialNodes) log.Info("Removing containerlab host entries from /etc/hosts file") - err = c.DeleteEntriesFromHostsFile() + err = c.deleteEntriesFromHostsFile() if err != nil { return fmt.Errorf("error while trying to clean up the hosts file: %w", err) } log.Info("Removing ssh config for containerlab nodes") - err = c.RemoveSSHConfig(c.TopoPaths) + err = c.removeSSHConfig(c.TopoPaths) if err != nil { log.Errorf("failed to remove ssh config file: %v", err) } diff --git a/clab/config.go b/clab/config.go index b6264a5f2..d923d226a 100644 --- a/clab/config.go +++ b/clab/config.go @@ -14,6 +14,7 @@ import ( "github.com/pmorjan/kmod" log "github.com/sirupsen/logrus" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/labels" "github.com/srl-labs/containerlab/links" "github.com/srl-labs/containerlab/nodes" @@ -117,7 +118,7 @@ func (c *CLab) parseTopology() error { } for idx, nodeName := range nodeNames { - err = c.NewNode(nodeName, nodeRuntimes[nodeName], c.Config.Topology.Nodes[nodeName], idx) + err = c.newNode(nodeName, nodeRuntimes[nodeName], c.Config.Topology.Nodes[nodeName], idx) if err != nil { return err } @@ -126,15 +127,15 @@ func (c *CLab) parseTopology() error { return nil } -// NewNode initializes a new node object. -func (c *CLab) NewNode(nodeName, nodeRuntime string, nodeDef *types.NodeDefinition, idx int) error { +// newNode initializes a new node object. +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 } // construct node - n, err := c.Reg.NewNodeOfKind(nodeCfg.Kind) + n, err := kind_registry.KindRegistryInstance.NewNodeOfKind(nodeCfg.Kind) if err != nil { return fmt.Errorf("error constructing node %q: %v", nodeCfg.ShortName, err) } @@ -375,7 +376,7 @@ func (c *CLab) verifyRootNetNSLinks() error { func (c *CLab) verifyLinks(ctx context.Context) error { var err error verificationErrors := []error{} - for _, e := range c.Endpoints { + for _, e := range c.endpoints { err = e.Verify(ctx, c.globalRuntime().Config().VerifyLinkParams) if err != nil { verificationErrors = append(verificationErrors, err) @@ -527,18 +528,6 @@ func (c *CLab) resolveBindPaths(binds []string, nodedir string) error { return nil } -// HasKind returns true if kind k is found in the list of nodes. -func (c *CLab) HasKind(k string) bool { - for _, n := range c.Nodes { - if n.Config().Kind == k { - log.Warn("found") - return true - } - } - - return false -} - // addDefaultLabels adds default labels to node's config struct. func (c *CLab) addDefaultLabels(n nodes.Node) { cfg := n.Config() diff --git a/clab/config/utils.go b/clab/config/utils.go index 53092233f..64e2e309a 100644 --- a/clab/config/utils.go +++ b/clab/config/utils.go @@ -10,6 +10,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/srl-labs/containerlab/clab" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/types" ) @@ -64,7 +65,7 @@ func PrepareVars(c *clab.CLab) map[string]*NodeConfig { vars[vkRole] = nodeCfg.Kind } - creds := c.Reg.Kind(nodeCfg.Kind).Credentials().Slice() + creds := kind_registry.KindRegistryInstance.Kind(nodeCfg.Kind).Credentials().Slice() res[name] = &NodeConfig{ TargetNode: nodeCfg, diff --git a/clab/export.go b/clab/export.go index 9051359eb..5623735b4 100644 --- a/clab/export.go +++ b/clab/export.go @@ -18,8 +18,8 @@ import ( "github.com/srl-labs/containerlab/types" ) -// GenerateExports generates various export files and writes it to a lab location. -func (c *CLab) GenerateExports(ctx context.Context, f io.Writer, p string) error { +// generateExports generates various export files and writes it to a lab location. +func (c *CLab) generateExports(ctx context.Context, f io.Writer, p string) error { err := c.exportTopologyDataWithTemplate(ctx, f, p) if err != nil { log.Warningf("Cannot parse export template %s: %v", p, err) diff --git a/clab/file.go b/clab/file.go index 784550694..78de6abf3 100644 --- a/clab/file.go +++ b/clab/file.go @@ -27,10 +27,9 @@ const ( varFileSuffix = "_vars" ) -// LoadTopologyFromFile loads a topology by the topo file path -// parses the topology file into c.Conf structure +// loadTopology parses the topology file into c.Conf structure // as well as populates the TopoFile structure with the topology file related information. -func (c *CLab) LoadTopologyFromFile(topo, varsFile string) error { +func (c *CLab) loadTopologyFromFile(topo, varsFile string) error { var err error c.TopoPaths, err = types.NewTopoPaths(topo) diff --git a/clab/hostsfile.go b/clab/hostsfile.go index 156f36a7f..aa54213bb 100644 --- a/clab/hostsfile.go +++ b/clab/hostsfile.go @@ -32,7 +32,7 @@ func (c *CLab) appendHostsFileEntries(ctx context.Context) error { } } // lets make sure to remove the entries of a non-properly destroyed lab in the hosts file - err := c.DeleteEntriesFromHostsFile() + err := c.deleteEntriesFromHostsFile() if err != nil { return err } @@ -87,7 +87,8 @@ func generateHostsEntries(containers []runtime.GenericContainer, labname string) return entries.Bytes() } -func (c *CLab) DeleteEntriesFromHostsFile() error { +func (c *CLab) deleteEntriesFromHostsFile() error { + if c.Config.Name == "" { return errors.New("missing containerlab name") } diff --git a/clab/inventory.go b/clab/inventory.go index 8d3c16c88..c5fea5ae0 100644 --- a/clab/inventory.go +++ b/clab/inventory.go @@ -11,6 +11,7 @@ import ( "sort" "text/template" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/types" ) @@ -74,7 +75,7 @@ func (c *CLab) generateAnsibleInventory(w io.Writer) error { // add username and password to kind properties // assumption is that all nodes of the same kind have the same credentials - nodeRegEntry := c.Reg.Kind(n.Config().Kind) + nodeRegEntry := kind_registry.KindRegistryInstance.Kind(n.Config().Kind) if nodeRegEntry != nil { kindProps.Username = nodeRegEntry.Credentials().GetUsername() kindProps.Password = nodeRegEntry.Credentials().GetPassword() diff --git a/clab/register.go b/clab/register.go deleted file mode 100644 index 85123204d..000000000 --- a/clab/register.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2020 Nokia -// Licensed under the BSD 3-Clause License. -// SPDX-License-Identifier: BSD-3-Clause - -package clab - -import ( - border0 "github.com/srl-labs/containerlab/nodes/border0" - bridge "github.com/srl-labs/containerlab/nodes/bridge" - c8000 "github.com/srl-labs/containerlab/nodes/c8000" - ceos "github.com/srl-labs/containerlab/nodes/ceos" - checkpoint_cloudguard "github.com/srl-labs/containerlab/nodes/checkpoint_cloudguard" - crpd "github.com/srl-labs/containerlab/nodes/crpd" - cvx "github.com/srl-labs/containerlab/nodes/cvx" - ext_container "github.com/srl-labs/containerlab/nodes/ext_container" - fortinet_fortigate "github.com/srl-labs/containerlab/nodes/fortinet_fortigate" - host "github.com/srl-labs/containerlab/nodes/host" - ipinfusion_ocnos "github.com/srl-labs/containerlab/nodes/ipinfusion_ocnos" - k8s_kind "github.com/srl-labs/containerlab/nodes/k8s_kind" - keysight_ixiacone "github.com/srl-labs/containerlab/nodes/keysight_ixiacone" - linux "github.com/srl-labs/containerlab/nodes/linux" - ovs "github.com/srl-labs/containerlab/nodes/ovs" - rare "github.com/srl-labs/containerlab/nodes/rare" - sonic "github.com/srl-labs/containerlab/nodes/sonic" - srl "github.com/srl-labs/containerlab/nodes/srl" - vr_aoscx "github.com/srl-labs/containerlab/nodes/vr_aoscx" - vr_csr "github.com/srl-labs/containerlab/nodes/vr_csr" - vr_ftdv "github.com/srl-labs/containerlab/nodes/vr_ftdv" - vr_ftosv "github.com/srl-labs/containerlab/nodes/vr_ftosv" - vr_n9kv "github.com/srl-labs/containerlab/nodes/vr_n9kv" - vr_openbsd "github.com/srl-labs/containerlab/nodes/vr_openbsd" - vr_pan "github.com/srl-labs/containerlab/nodes/vr_pan" - vr_ros "github.com/srl-labs/containerlab/nodes/vr_ros" - vr_sros "github.com/srl-labs/containerlab/nodes/vr_sros" - vr_veos "github.com/srl-labs/containerlab/nodes/vr_veos" - vr_vjunosevolved "github.com/srl-labs/containerlab/nodes/vr_vjunosevolved" - vr_vjunosswitch "github.com/srl-labs/containerlab/nodes/vr_vjunosswitch" - vr_vmx "github.com/srl-labs/containerlab/nodes/vr_vmx" - vr_vqfx "github.com/srl-labs/containerlab/nodes/vr_vqfx" - vr_vsrx "github.com/srl-labs/containerlab/nodes/vr_vsrx" - vr_xrv "github.com/srl-labs/containerlab/nodes/vr_xrv" - vr_xrv9k "github.com/srl-labs/containerlab/nodes/vr_xrv9k" - xrd "github.com/srl-labs/containerlab/nodes/xrd" -) - -// RegisterNodes registers all the nodes/kinds supported by containerlab. -func (c *CLab) RegisterNodes() { - bridge.Register(c.Reg) - ceos.Register(c.Reg) - checkpoint_cloudguard.Register(c.Reg) - crpd.Register(c.Reg) - cvx.Register(c.Reg) - ext_container.Register(c.Reg) - fortinet_fortigate.Register(c.Reg) - host.Register(c.Reg) - ipinfusion_ocnos.Register(c.Reg) - keysight_ixiacone.Register(c.Reg) - linux.Register(c.Reg) - ovs.Register(c.Reg) - sonic.Register(c.Reg) - srl.Register(c.Reg) - vr_aoscx.Register(c.Reg) - vr_csr.Register(c.Reg) - vr_ftosv.Register(c.Reg) - vr_n9kv.Register(c.Reg) - vr_pan.Register(c.Reg) - vr_openbsd.Register(c.Reg) - vr_ftdv.Register(c.Reg) - vr_ros.Register(c.Reg) - vr_sros.Register(c.Reg) - vr_veos.Register(c.Reg) - vr_vmx.Register(c.Reg) - vr_vsrx.Register(c.Reg) - vr_vqfx.Register(c.Reg) - vr_vjunosswitch.Register(c.Reg) - vr_vjunosevolved.Register(c.Reg) - vr_xrv.Register(c.Reg) - vr_xrv9k.Register(c.Reg) - xrd.Register(c.Reg) - rare.Register(c.Reg) - c8000.Register(c.Reg) - border0.Register(c.Reg) - k8s_kind.Register(c.Reg) -} diff --git a/clab/sshconfig.go b/clab/sshconfig.go index 8002cd8a9..f24a3a246 100644 --- a/clab/sshconfig.go +++ b/clab/sshconfig.go @@ -7,6 +7,7 @@ import ( "text/template" log "github.com/sirupsen/logrus" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/types" "github.com/srl-labs/containerlab/utils" "golang.org/x/mod/semver" @@ -32,8 +33,8 @@ type SSHConfigNodeTmpl struct { //go:embed ssh_config.go.tpl var sshConfigTemplate string -// RemoveSSHConfig removes the lab specific ssh config file. -func (c *CLab) RemoveSSHConfig(topoPaths *types.TopoPaths) error { +// removeSSHConfig removes the lab specific ssh config file. +func (c *CLab) removeSSHConfig(topoPaths *types.TopoPaths) error { err := os.Remove(topoPaths.SSHConfigPath()) // if there is an error, thats not "Not Exists", then return it if err != nil && !os.IsNotExist(err) { @@ -65,7 +66,7 @@ func (c *CLab) addSSHConfig() error { for _, n := range c.Nodes { // get the Kind from the KindRegistry and and extract // the kind registered Username - NodeRegistryEntry := c.Reg.Kind(n.Config().Kind) + NodeRegistryEntry := kind_registry.KindRegistryInstance.Kind(n.Config().Kind) nodeData := SSHConfigNodeTmpl{ Name: n.Config().LongName, Username: NodeRegistryEntry.Credentials().GetUsername(), diff --git a/clab/utils.go b/clab/utils.go new file mode 100644 index 000000000..335ff3477 --- /dev/null +++ b/clab/utils.go @@ -0,0 +1,38 @@ +package clab + +import ( + "fmt" + + "github.com/srl-labs/containerlab/utils" +) + +// ProcessTopoPath takes a topology path, which might be the path to a directory or a file +// or stdin or a URL and returns the topology file name if found. +func ProcessTopoPath(path string, tmpDir string) (string, error) { + var file string + var err error + + switch { + case path == "-" || path == "stdin": + file, err = readFromStdin(tmpDir) + if err != nil { + return "", err + } + // if the path is not a local file and a URL, download the file and store it in the tmp dir + case !utils.FileOrDirExists(path) && utils.IsHttpURL(path, true): + file, err = downloadTopoFile(path, tmpDir) + if err != nil { + return "", err + } + + case path == "": + return "", fmt.Errorf("provide a path to the clab topology file") + + default: + file, err = FindTopoFileByPath(path) + if err != nil { + return "", err + } + } + return file, nil +} diff --git a/cmd/destroy.go b/cmd/destroy.go index ce3ed3618..7246c6a7e 100644 --- a/cmd/destroy.go +++ b/cmd/destroy.go @@ -200,7 +200,7 @@ func listContainers(ctx context.Context, topo string) ([]runtime.GenericContaine // when topo file is provided, filter containers by lab name if topo != "" { - topo, err = c.ProcessTopoPath(topo) + topo, err = clab.ProcessTopoPath(topo, c.TopoPaths.ClabTmpDir()) if err != nil { return nil, err } diff --git a/cmd/tools_veth.go b/cmd/tools_veth.go index 9086b5019..ca9eaf0bf 100644 --- a/cmd/tools_veth.go +++ b/cmd/tools_veth.go @@ -13,6 +13,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/srl-labs/containerlab/clab" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/links" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/nodes/state" @@ -226,7 +227,7 @@ func parseVethEndpoint(s string) (parsedEndpoint, error) { func createFakeNode(c *clab.CLab, kind string, nodeCfg *types.NodeConfig) error { name := nodeCfg.ShortName // construct node - n, err := c.Reg.NewNodeOfKind(kind) + n, err := kind_registry.KindRegistryInstance.NewNodeOfKind(kind) if err != nil { return fmt.Errorf("error constructing node %s: %v", name, err) } diff --git a/kinds/all/all.go b/kinds/all/all.go new file mode 100644 index 000000000..ef145e933 --- /dev/null +++ b/kinds/all/all.go @@ -0,0 +1,40 @@ +package all + +import ( + _ "github.com/srl-labs/containerlab/kinds/types/border0" + _ "github.com/srl-labs/containerlab/kinds/types/bridge" + _ "github.com/srl-labs/containerlab/kinds/types/c8000" + _ "github.com/srl-labs/containerlab/kinds/types/ceos" + _ "github.com/srl-labs/containerlab/kinds/types/checkpoint_cloudguard" + _ "github.com/srl-labs/containerlab/kinds/types/crpd" + _ "github.com/srl-labs/containerlab/kinds/types/cvx" + _ "github.com/srl-labs/containerlab/kinds/types/ext_container" + _ "github.com/srl-labs/containerlab/kinds/types/fortinet_fortigate" + _ "github.com/srl-labs/containerlab/kinds/types/host" + _ "github.com/srl-labs/containerlab/kinds/types/ipinfusion_ocnos" + _ "github.com/srl-labs/containerlab/kinds/types/k8s_kind" + _ "github.com/srl-labs/containerlab/kinds/types/keysight_ixiacone" + _ "github.com/srl-labs/containerlab/kinds/types/linux" + _ "github.com/srl-labs/containerlab/kinds/types/ovs" + _ "github.com/srl-labs/containerlab/kinds/types/rare" + _ "github.com/srl-labs/containerlab/kinds/types/sonic" + _ "github.com/srl-labs/containerlab/kinds/types/srl" + _ "github.com/srl-labs/containerlab/kinds/types/vr_aoscx" + _ "github.com/srl-labs/containerlab/kinds/types/vr_csr" + _ "github.com/srl-labs/containerlab/kinds/types/vr_ftdv" + _ "github.com/srl-labs/containerlab/kinds/types/vr_ftosv" + _ "github.com/srl-labs/containerlab/kinds/types/vr_n9kv" + _ "github.com/srl-labs/containerlab/kinds/types/vr_openbsd" + _ "github.com/srl-labs/containerlab/kinds/types/vr_pan" + _ "github.com/srl-labs/containerlab/kinds/types/vr_ros" + _ "github.com/srl-labs/containerlab/kinds/types/vr_sros" + _ "github.com/srl-labs/containerlab/kinds/types/vr_veos" + _ "github.com/srl-labs/containerlab/kinds/types/vr_vjunosevolved" + _ "github.com/srl-labs/containerlab/kinds/types/vr_vjunosswitch" + _ "github.com/srl-labs/containerlab/kinds/types/vr_vmx" + _ "github.com/srl-labs/containerlab/kinds/types/vr_vqfx" + _ "github.com/srl-labs/containerlab/kinds/types/vr_vsrx" + _ "github.com/srl-labs/containerlab/kinds/types/vr_xrv" + _ "github.com/srl-labs/containerlab/kinds/types/vr_xrv9k" + _ "github.com/srl-labs/containerlab/kinds/types/xrd" +) diff --git a/nodes/node_registry.go b/kinds/kind_registry/kind_registry.go similarity index 71% rename from nodes/node_registry.go rename to kinds/kind_registry/kind_registry.go index 0f2359028..202d3e38d 100644 --- a/nodes/node_registry.go +++ b/kinds/kind_registry/kind_registry.go @@ -1,33 +1,38 @@ -package nodes +package kind_registry import ( "fmt" "sort" "strings" + + "github.com/srl-labs/containerlab/nodes" ) -type Initializer func() Node +var KindRegistryInstance = newKindRegistry() + +type Initializer func() nodes.Node -type NodeRegistry struct { +type KindRegistry struct { // the nodeindex is a helping struct to speedup kind lookups. - nodeIndex map[string]*NodeRegistryEntry + nodeIndex map[string]*nodeRegistryEntry } -// NewNodeRegistry constructs a new Registry. -func NewNodeRegistry() *NodeRegistry { - return &NodeRegistry{ - nodeIndex: map[string]*NodeRegistryEntry{}, +// newKindRegistry constructs a new Registry. +func newKindRegistry() *KindRegistry { + r := &KindRegistry{ + nodeIndex: map[string]*nodeRegistryEntry{}, } + return r } // Register registers the node' init function for all provided names. -func (r *NodeRegistry) Register(names []string, initf Initializer, credentials *Credentials) error { +func (r *KindRegistry) Register(names []string, initf Initializer, credentials *Credentials) error { newEntry := newRegistryEntry(names, initf, credentials) return r.addEntry(newEntry) } // addEntry adds the node entry to the registry. -func (r *NodeRegistry) addEntry(entry *NodeRegistryEntry) error { +func (r *KindRegistry) addEntry(entry *nodeRegistryEntry) error { for _, name := range entry.nodeKindNames { if _, exists := r.nodeIndex[name]; exists { return fmt.Errorf("node kind %q already registered in Node Registry", name) @@ -40,7 +45,7 @@ func (r *NodeRegistry) addEntry(entry *NodeRegistryEntry) error { } // NewNodeOfKind return a new Node of the given Node Kind. -func (r *NodeRegistry) NewNodeOfKind(nodeKindName string) (Node, error) { +func (r *KindRegistry) NewNodeOfKind(nodeKindName string) (nodes.Node, error) { nodeKindEntry, ok := r.nodeIndex[nodeKindName] if !ok { registeredKinds := strings.Join(r.GetRegisteredNodeKindNames(), ", ") @@ -52,7 +57,7 @@ func (r *NodeRegistry) NewNodeOfKind(nodeKindName string) (Node, error) { } // GetRegisteredNodeKindNames returns a sorted slice of all the registered node kind names in the registry. -func (r *NodeRegistry) GetRegisteredNodeKindNames() []string { +func (r *KindRegistry) GetRegisteredNodeKindNames() []string { var result []string for k := range r.nodeIndex { result = append(result, k) @@ -63,18 +68,18 @@ func (r *NodeRegistry) GetRegisteredNodeKindNames() []string { return result } -func (r *NodeRegistry) Kind(kind string) *NodeRegistryEntry { +func (r *KindRegistry) Kind(kind string) *nodeRegistryEntry { return r.nodeIndex[kind] } -type NodeRegistryEntry struct { +type nodeRegistryEntry struct { nodeKindNames []string initFunction Initializer credentials *Credentials } // Credentials returns entry's credentials. -func (e *NodeRegistryEntry) Credentials() *Credentials { +func (e *nodeRegistryEntry) Credentials() *Credentials { if e == nil { return nil } @@ -82,8 +87,8 @@ func (e *NodeRegistryEntry) Credentials() *Credentials { return e.credentials } -func newRegistryEntry(nodeKindNames []string, initFunction Initializer, credentials *Credentials) *NodeRegistryEntry { - return &NodeRegistryEntry{ +func newRegistryEntry(nodeKindNames []string, initFunction Initializer, credentials *Credentials) *nodeRegistryEntry { + return &nodeRegistryEntry{ nodeKindNames: nodeKindNames, initFunction: initFunction, credentials: credentials, diff --git a/nodes/border0/border0.go b/kinds/types/border0/border0.go similarity index 96% rename from nodes/border0/border0.go rename to kinds/types/border0/border0.go index 16737df49..acec859b1 100644 --- a/nodes/border0/border0.go +++ b/kinds/types/border0/border0.go @@ -8,6 +8,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/srl-labs/containerlab/border0_api" "github.com/srl-labs/containerlab/clab/exec" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" "github.com/srl-labs/containerlab/utils" @@ -15,12 +16,6 @@ import ( var Kindnames = []string{"border0"} -func Register(r *nodes.NodeRegistry) { - r.Register(Kindnames, func() nodes.Node { - return new(border0) - }, nil) -} - type border0 struct { nodes.DefaultNode topologyName string @@ -119,3 +114,9 @@ func (b *border0) Delete(ctx context.Context) error { return b.DefaultNode.Delete(ctx) // TODO: maybe deleting sockets as well; we would need infos about the nodes } + +func Init() { + kind_registry.KindRegistryInstance.Register(Kindnames, func() nodes.Node { + return new(border0) + }, nil) +} diff --git a/nodes/bridge/bridge.go b/kinds/types/bridge/bridge.go similarity index 96% rename from nodes/bridge/bridge.go rename to kinds/types/bridge/bridge.go index 5a057673b..58b00f16b 100644 --- a/nodes/bridge/bridge.go +++ b/kinds/types/bridge/bridge.go @@ -14,6 +14,7 @@ import ( "github.com/containernetworking/plugins/pkg/ns" log "github.com/sirupsen/logrus" cExec "github.com/srl-labs/containerlab/clab/exec" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/links" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/nodes/state" @@ -30,9 +31,8 @@ const ( iptAllowCmd = "-I FORWARD -i %s -j ACCEPT -w 5" ) -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(bridge) }, nil) } diff --git a/nodes/c8000/c8000.cfg b/kinds/types/c8000/c8000.cfg similarity index 100% rename from nodes/c8000/c8000.cfg rename to kinds/types/c8000/c8000.cfg diff --git a/nodes/c8000/c8000.go b/kinds/types/c8000/c8000.go similarity index 94% rename from nodes/c8000/c8000.go rename to kinds/types/c8000/c8000.go index 55adcbdf1..d4f93af8f 100644 --- a/nodes/c8000/c8000.go +++ b/kinds/types/c8000/c8000.go @@ -13,6 +13,7 @@ import ( "regexp" log "github.com/sirupsen/logrus" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/netconf" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" @@ -21,7 +22,7 @@ import ( var ( kindnames = []string{"c8000", "cisco_c8000"} - defaultCredentials = nodes.NewCredentials("cisco", "cisco123") + defaultCredentials = kind_registry.NewCredentials("cisco", "cisco123") //go:embed c8000.cfg cfgTemplate string @@ -32,7 +33,7 @@ const ( ) // Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { +func Register(r *kind_registry.KindRegistry) { r.Register(kindnames, func() nodes.Node { return new(c8000) }, defaultCredentials) diff --git a/nodes/ceos/ceos.cfg b/kinds/types/ceos/ceos.cfg similarity index 100% rename from nodes/ceos/ceos.cfg rename to kinds/types/ceos/ceos.cfg diff --git a/nodes/ceos/ceos.go b/kinds/types/ceos/ceos.go similarity index 97% rename from nodes/ceos/ceos.go rename to kinds/types/ceos/ceos.go index 7d946b7a2..4ad2167d0 100644 --- a/nodes/ceos/ceos.go +++ b/kinds/types/ceos/ceos.go @@ -19,6 +19,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/srl-labs/containerlab/clab/exec" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" "github.com/srl-labs/containerlab/utils" @@ -47,12 +48,11 @@ var ( saveCmd = "Cli -p 15 -c wr" - defaultCredentials = nodes.NewCredentials("admin", "admin") + defaultCredentials = kind_registry.NewCredentials("admin", "admin") ) -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(ceos) }, defaultCredentials) } diff --git a/nodes/checkpoint_cloudguard/checkpoint_cloudguard.go b/kinds/types/checkpoint_cloudguard/checkpoint_cloudguard.go similarity index 89% rename from nodes/checkpoint_cloudguard/checkpoint_cloudguard.go rename to kinds/types/checkpoint_cloudguard/checkpoint_cloudguard.go index 89fe699af..fb42dd0e3 100644 --- a/nodes/checkpoint_cloudguard/checkpoint_cloudguard.go +++ b/kinds/types/checkpoint_cloudguard/checkpoint_cloudguard.go @@ -8,6 +8,7 @@ import ( "context" "fmt" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" "github.com/srl-labs/containerlab/utils" @@ -15,12 +16,11 @@ import ( var ( kindnames = []string{"checkpoint_cloudguard"} - defaultCredentials = nodes.NewCredentials("admin", "admin") + defaultCredentials = kind_registry.NewCredentials("admin", "admin") ) -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(CheckpointCloudguard) }, defaultCredentials) } diff --git a/nodes/crpd/crpd.cfg b/kinds/types/crpd/crpd.cfg similarity index 100% rename from nodes/crpd/crpd.cfg rename to kinds/types/crpd/crpd.cfg diff --git a/nodes/crpd/crpd.go b/kinds/types/crpd/crpd.go similarity index 95% rename from nodes/crpd/crpd.go rename to kinds/types/crpd/crpd.go index 347c55f33..abbae47f5 100644 --- a/nodes/crpd/crpd.go +++ b/kinds/types/crpd/crpd.go @@ -13,6 +13,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/srl-labs/containerlab/clab/exec" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" "github.com/srl-labs/containerlab/utils" @@ -30,15 +31,14 @@ var ( //go:embed sshd_config sshdCfg string - defaultCredentials = nodes.NewCredentials("root", "clab123") + defaultCredentials = kind_registry.NewCredentials("root", "clab123") saveCmd = "cli show conf" sshRestartCmd = "service ssh restart" ) -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(crpd) }, defaultCredentials) } diff --git a/nodes/crpd/sshd_config b/kinds/types/crpd/sshd_config similarity index 100% rename from nodes/crpd/sshd_config rename to kinds/types/crpd/sshd_config diff --git a/nodes/cvx/cvx.go b/kinds/types/cvx/cvx.go similarity index 95% rename from nodes/cvx/cvx.go rename to kinds/types/cvx/cvx.go index 0dbe6f2a4..0a4b02c04 100644 --- a/nodes/cvx/cvx.go +++ b/kinds/types/cvx/cvx.go @@ -6,6 +6,7 @@ import ( "regexp" log "github.com/sirupsen/logrus" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/nodes/state" "github.com/srl-labs/containerlab/runtime/ignite" @@ -25,9 +26,8 @@ var memoryReqs = map[string]string{ "4.4.0": "768MB", } -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(cvx) }, nil) nodes.SetNonDefaultRuntimePerKind(kindnames, ignite.RuntimeName) diff --git a/nodes/ext_container/ext_container.go b/kinds/types/ext_container/ext_container.go similarity index 93% rename from nodes/ext_container/ext_container.go rename to kinds/types/ext_container/ext_container.go index bc77b3278..2ad5de3d9 100644 --- a/nodes/ext_container/ext_container.go +++ b/kinds/types/ext_container/ext_container.go @@ -7,6 +7,7 @@ package ext_container import ( "context" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/labels" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/nodes/state" @@ -16,9 +17,8 @@ import ( var kindnames = []string{"ext-container"} -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(extcont) }, nil) } diff --git a/nodes/fortinet_fortigate/fortigate.go b/kinds/types/fortinet_fortigate/fortigate.go similarity index 92% rename from nodes/fortinet_fortigate/fortigate.go rename to kinds/types/fortinet_fortigate/fortigate.go index 92f149e10..c519e6557 100644 --- a/nodes/fortinet_fortigate/fortigate.go +++ b/kinds/types/fortinet_fortigate/fortigate.go @@ -9,6 +9,7 @@ import ( "fmt" "path" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" "github.com/srl-labs/containerlab/utils" @@ -16,7 +17,7 @@ import ( var ( kindnames = []string{"fortinet_fortigate"} - defaultCredentials = nodes.NewCredentials("admin", "admin") + defaultCredentials = kind_registry.NewCredentials("admin", "admin") ) const ( @@ -26,9 +27,8 @@ const ( startupCfgFName = "startup-config.cfg" ) -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(fortigate) }, defaultCredentials) } diff --git a/nodes/host/host.go b/kinds/types/host/host.go similarity index 95% rename from nodes/host/host.go rename to kinds/types/host/host.go index 131c8c87e..793c73443 100644 --- a/nodes/host/host.go +++ b/kinds/types/host/host.go @@ -14,6 +14,7 @@ import ( osexec "os/exec" cExec "github.com/srl-labs/containerlab/clab/exec" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/labels" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/nodes/state" @@ -23,9 +24,8 @@ import ( var kindnames = []string{"host"} -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(host) }, nil) } diff --git a/nodes/ipinfusion_ocnos/ipinfusion_ocnos.go b/kinds/types/ipinfusion_ocnos/ipinfusion_ocnos.go similarity index 91% rename from nodes/ipinfusion_ocnos/ipinfusion_ocnos.go rename to kinds/types/ipinfusion_ocnos/ipinfusion_ocnos.go index b02a30fa8..5b1564d75 100644 --- a/nodes/ipinfusion_ocnos/ipinfusion_ocnos.go +++ b/kinds/types/ipinfusion_ocnos/ipinfusion_ocnos.go @@ -9,6 +9,7 @@ import ( "fmt" log "github.com/sirupsen/logrus" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/netconf" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" @@ -17,16 +18,15 @@ import ( var ( kindnames = []string{"ipinfusion_ocnos"} - defaultCredentials = nodes.NewCredentials("admin", "admin") + defaultCredentials = kind_registry.NewCredentials("admin", "admin") ) const ( scrapliPlatformName = "ipinfusion_ocnos" ) -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(IPInfusionOcNOS) }, defaultCredentials) } diff --git a/nodes/k8s_kind/k8s_kind.go b/kinds/types/k8s_kind/k8s_kind.go similarity index 97% rename from nodes/k8s_kind/k8s_kind.go rename to kinds/types/k8s_kind/k8s_kind.go index efa241b36..6c4a9575c 100644 --- a/nodes/k8s_kind/k8s_kind.go +++ b/kinds/types/k8s_kind/k8s_kind.go @@ -12,6 +12,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/srl-labs/containerlab/clab/exec" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/runtime" "github.com/srl-labs/containerlab/runtime/docker" @@ -23,9 +24,8 @@ import ( var kindnames = []string{"k8s-kind"} -// Register registers the node in the global Node map. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(k8s_kind) }, nil) } diff --git a/nodes/k8s_kind/logger.go b/kinds/types/k8s_kind/logger.go similarity index 100% rename from nodes/k8s_kind/logger.go rename to kinds/types/k8s_kind/logger.go diff --git a/nodes/keysight_ixiacone/ixiac-one.go b/kinds/types/keysight_ixiacone/ixiac-one.go similarity index 92% rename from nodes/keysight_ixiacone/ixiac-one.go rename to kinds/types/keysight_ixiacone/ixiac-one.go index 468d43092..ff8815cc1 100644 --- a/nodes/keysight_ixiacone/ixiac-one.go +++ b/kinds/types/keysight_ixiacone/ixiac-one.go @@ -12,6 +12,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/srl-labs/containerlab/clab/exec" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" ) @@ -26,9 +27,8 @@ var ixiacStatusConfig = struct { readyFileName: "/home/keysight/ixia-c-one/init-done", } -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(ixiacOne) }, nil) } diff --git a/nodes/linux/linux.go b/kinds/types/linux/linux.go similarity index 95% rename from nodes/linux/linux.go rename to kinds/types/linux/linux.go index 7bc1c5503..298a96ffa 100644 --- a/nodes/linux/linux.go +++ b/kinds/types/linux/linux.go @@ -11,6 +11,7 @@ import ( "strings" log "github.com/sirupsen/logrus" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/nodes/state" "github.com/srl-labs/containerlab/runtime/ignite" @@ -21,9 +22,8 @@ import ( var kindnames = []string{"linux"} -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(linux) }, nil) } diff --git a/nodes/ovs/ovs.go b/kinds/types/ovs/ovs.go similarity index 96% rename from nodes/ovs/ovs.go rename to kinds/types/ovs/ovs.go index dae419f6f..2f13eb244 100644 --- a/nodes/ovs/ovs.go +++ b/kinds/types/ovs/ovs.go @@ -13,6 +13,7 @@ import ( log "github.com/sirupsen/logrus" cExec "github.com/srl-labs/containerlab/clab/exec" "github.com/srl-labs/containerlab/internal/slices" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/links" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/nodes/state" @@ -23,9 +24,8 @@ import ( var kindnames = []string{"ovs-bridge"} -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(ovs) }, nil) } diff --git a/nodes/rare/rare.go b/kinds/types/rare/rare.go similarity index 90% rename from nodes/rare/rare.go rename to kinds/types/rare/rare.go index 9dab4e6c0..4d73c53d1 100644 --- a/nodes/rare/rare.go +++ b/kinds/types/rare/rare.go @@ -9,6 +9,7 @@ import ( "fmt" "path/filepath" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" "github.com/srl-labs/containerlab/utils" @@ -16,9 +17,8 @@ import ( var kindnames = []string{"rare"} -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(rare) }, nil) } diff --git a/nodes/sonic/sonic.go b/kinds/types/sonic/sonic.go similarity index 91% rename from nodes/sonic/sonic.go rename to kinds/types/sonic/sonic.go index eb020f58e..8960c43fb 100644 --- a/nodes/sonic/sonic.go +++ b/kinds/types/sonic/sonic.go @@ -10,6 +10,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/srl-labs/containerlab/clab/exec" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" "github.com/srl-labs/containerlab/utils" @@ -17,9 +18,8 @@ import ( var kindnames = []string{"sonic-vs"} -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(sonic) }, nil) } diff --git a/nodes/srl/banner.go b/kinds/types/srl/banner.go similarity index 100% rename from nodes/srl/banner.go rename to kinds/types/srl/banner.go diff --git a/nodes/srl/macaddr.go b/kinds/types/srl/macaddr.go similarity index 100% rename from nodes/srl/macaddr.go rename to kinds/types/srl/macaddr.go diff --git a/nodes/srl/prompt.go b/kinds/types/srl/prompt.go similarity index 100% rename from nodes/srl/prompt.go rename to kinds/types/srl/prompt.go diff --git a/nodes/srl/prompt_test.go b/kinds/types/srl/prompt_test.go similarity index 100% rename from nodes/srl/prompt_test.go rename to kinds/types/srl/prompt_test.go diff --git a/nodes/srl/srl.go b/kinds/types/srl/srl.go similarity index 99% rename from nodes/srl/srl.go rename to kinds/types/srl/srl.go index 5143ab850..99c2fc774 100644 --- a/nodes/srl/srl.go +++ b/kinds/types/srl/srl.go @@ -25,6 +25,7 @@ import ( "github.com/srl-labs/containerlab/cert" "github.com/srl-labs/containerlab/clab/exec" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/links" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" @@ -60,7 +61,7 @@ var ( "net.ipv6.conf.all.autoconf": "0", "net.ipv6.conf.default.autoconf": "0", } - defaultCredentials = nodes.NewCredentials("admin", "NokiaSrl1!") + defaultCredentials = kind_registry.NewCredentials("admin", "NokiaSrl1!") srlTypes = map[string]string{ "ixsa1": "7215IXSA1.yml", @@ -104,9 +105,8 @@ var ( } ) -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(KindNames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(KindNames, func() nodes.Node { return new(srl) }, defaultCredentials) } diff --git a/nodes/srl/srl_default_config.go.tpl b/kinds/types/srl/srl_default_config.go.tpl similarity index 100% rename from nodes/srl/srl_default_config.go.tpl rename to kinds/types/srl/srl_default_config.go.tpl diff --git a/nodes/srl/sshkey.go b/kinds/types/srl/sshkey.go similarity index 100% rename from nodes/srl/sshkey.go rename to kinds/types/srl/sshkey.go diff --git a/nodes/srl/sshkey_test.go b/kinds/types/srl/sshkey_test.go similarity index 100% rename from nodes/srl/sshkey_test.go rename to kinds/types/srl/sshkey_test.go diff --git a/nodes/srl/test_data/keys b/kinds/types/srl/test_data/keys similarity index 100% rename from nodes/srl/test_data/keys rename to kinds/types/srl/test_data/keys diff --git a/nodes/srl/test_data/rsa_key b/kinds/types/srl/test_data/rsa_key similarity index 100% rename from nodes/srl/test_data/rsa_key rename to kinds/types/srl/test_data/rsa_key diff --git a/nodes/srl/topology/7215IXSA1.yml b/kinds/types/srl/topology/7215IXSA1.yml similarity index 100% rename from nodes/srl/topology/7215IXSA1.yml rename to kinds/types/srl/topology/7215IXSA1.yml diff --git a/nodes/srl/topology/7220IXRD1.yml b/kinds/types/srl/topology/7220IXRD1.yml similarity index 100% rename from nodes/srl/topology/7220IXRD1.yml rename to kinds/types/srl/topology/7220IXRD1.yml diff --git a/nodes/srl/topology/7220IXRD2.yml b/kinds/types/srl/topology/7220IXRD2.yml similarity index 100% rename from nodes/srl/topology/7220IXRD2.yml rename to kinds/types/srl/topology/7220IXRD2.yml diff --git a/nodes/srl/topology/7220IXRD2L.yml b/kinds/types/srl/topology/7220IXRD2L.yml similarity index 100% rename from nodes/srl/topology/7220IXRD2L.yml rename to kinds/types/srl/topology/7220IXRD2L.yml diff --git a/nodes/srl/topology/7220IXRD3.yml b/kinds/types/srl/topology/7220IXRD3.yml similarity index 100% rename from nodes/srl/topology/7220IXRD3.yml rename to kinds/types/srl/topology/7220IXRD3.yml diff --git a/nodes/srl/topology/7220IXRD3L.yml b/kinds/types/srl/topology/7220IXRD3L.yml similarity index 100% rename from nodes/srl/topology/7220IXRD3L.yml rename to kinds/types/srl/topology/7220IXRD3L.yml diff --git a/nodes/srl/topology/7220IXRD4.yml b/kinds/types/srl/topology/7220IXRD4.yml similarity index 100% rename from nodes/srl/topology/7220IXRD4.yml rename to kinds/types/srl/topology/7220IXRD4.yml diff --git a/nodes/srl/topology/7220IXRD5.yml b/kinds/types/srl/topology/7220IXRD5.yml similarity index 100% rename from nodes/srl/topology/7220IXRD5.yml rename to kinds/types/srl/topology/7220IXRD5.yml diff --git a/nodes/srl/topology/7220IXRD5T.yml b/kinds/types/srl/topology/7220IXRD5T.yml similarity index 100% rename from nodes/srl/topology/7220IXRD5T.yml rename to kinds/types/srl/topology/7220IXRD5T.yml diff --git a/nodes/srl/topology/7220IXRH2.yml b/kinds/types/srl/topology/7220IXRH2.yml similarity index 100% rename from nodes/srl/topology/7220IXRH2.yml rename to kinds/types/srl/topology/7220IXRH2.yml diff --git a/nodes/srl/topology/7220IXRH3.yml b/kinds/types/srl/topology/7220IXRH3.yml similarity index 100% rename from nodes/srl/topology/7220IXRH3.yml rename to kinds/types/srl/topology/7220IXRH3.yml diff --git a/nodes/srl/topology/7220IXRH4.yml b/kinds/types/srl/topology/7220IXRH4.yml similarity index 100% rename from nodes/srl/topology/7220IXRH4.yml rename to kinds/types/srl/topology/7220IXRH4.yml diff --git a/nodes/srl/topology/7250IXR10.yml b/kinds/types/srl/topology/7250IXR10.yml similarity index 100% rename from nodes/srl/topology/7250IXR10.yml rename to kinds/types/srl/topology/7250IXR10.yml diff --git a/nodes/srl/topology/7250IXR10e.yml b/kinds/types/srl/topology/7250IXR10e.yml similarity index 100% rename from nodes/srl/topology/7250IXR10e.yml rename to kinds/types/srl/topology/7250IXR10e.yml diff --git a/nodes/srl/topology/7250IXR6.yml b/kinds/types/srl/topology/7250IXR6.yml similarity index 100% rename from nodes/srl/topology/7250IXR6.yml rename to kinds/types/srl/topology/7250IXR6.yml diff --git a/nodes/srl/topology/7250IXR6e.yml b/kinds/types/srl/topology/7250IXR6e.yml similarity index 100% rename from nodes/srl/topology/7250IXR6e.yml rename to kinds/types/srl/topology/7250IXR6e.yml diff --git a/nodes/srl/topology/7730SXR-1d-32d.yml b/kinds/types/srl/topology/7730SXR-1d-32d.yml similarity index 100% rename from nodes/srl/topology/7730SXR-1d-32d.yml rename to kinds/types/srl/topology/7730SXR-1d-32d.yml diff --git a/nodes/srl/topology/7730SXR-1x-44s.yml b/kinds/types/srl/topology/7730SXR-1x-44s.yml similarity index 100% rename from nodes/srl/topology/7730SXR-1x-44s.yml rename to kinds/types/srl/topology/7730SXR-1x-44s.yml diff --git a/nodes/srl/version.go b/kinds/types/srl/version.go similarity index 100% rename from nodes/srl/version.go rename to kinds/types/srl/version.go diff --git a/nodes/vr_aoscx/vr-aoscx.go b/kinds/types/vr_aoscx/vr-aoscx.go similarity index 90% rename from nodes/vr_aoscx/vr-aoscx.go rename to kinds/types/vr_aoscx/vr-aoscx.go index 80131b43c..4b442aedd 100644 --- a/nodes/vr_aoscx/vr-aoscx.go +++ b/kinds/types/vr_aoscx/vr-aoscx.go @@ -5,6 +5,7 @@ import ( "fmt" "path" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" "github.com/srl-labs/containerlab/utils" @@ -12,7 +13,7 @@ import ( var ( kindnames = []string{"aruba_aoscx", "vr-aoscx", "vr-aruba_aoscx"} - defaultCredentials = nodes.NewCredentials("admin", "admin") + defaultCredentials = kind_registry.NewCredentials("admin", "admin") ) const ( @@ -20,9 +21,8 @@ const ( startupCfgFName = "startup-config.cfg" ) -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(vrAosCX) }, defaultCredentials) } diff --git a/nodes/vr_csr/vr-csr.go b/kinds/types/vr_csr/vr-csr.go similarity index 92% rename from nodes/vr_csr/vr-csr.go rename to kinds/types/vr_csr/vr-csr.go index f6a00db21..27814f733 100644 --- a/nodes/vr_csr/vr-csr.go +++ b/kinds/types/vr_csr/vr-csr.go @@ -10,6 +10,7 @@ import ( "path" log "github.com/sirupsen/logrus" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/netconf" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" @@ -18,7 +19,7 @@ import ( var ( kindnames = []string{"cisco_csr1000v", "vr-csr", "vr-cisco_csr1000v"} - defaultCredentials = nodes.NewCredentials("admin", "admin") + defaultCredentials = kind_registry.NewCredentials("admin", "admin") ) const ( @@ -28,9 +29,8 @@ const ( startupCfgFName = "startup-config.cfg" ) -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(vrCsr) }, defaultCredentials) } diff --git a/nodes/vr_ftdv/vr-ftdv.go b/kinds/types/vr_ftdv/vr-ftdv.go similarity index 89% rename from nodes/vr_ftdv/vr-ftdv.go rename to kinds/types/vr_ftdv/vr-ftdv.go index 823782b41..e9378f8db 100644 --- a/nodes/vr_ftdv/vr-ftdv.go +++ b/kinds/types/vr_ftdv/vr-ftdv.go @@ -8,6 +8,7 @@ import ( "context" "fmt" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" "github.com/srl-labs/containerlab/utils" @@ -15,12 +16,11 @@ import ( var ( kindnames = []string{"cisco_ftdv"} - defaultCredentials = nodes.NewCredentials("admin", "Admin@123") + defaultCredentials = kind_registry.NewCredentials("admin", "Admin@123") ) -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(vrFtdv) }, defaultCredentials) } diff --git a/nodes/vr_ftosv/vr-ftosv.go b/kinds/types/vr_ftosv/vr-ftosv.go similarity index 91% rename from nodes/vr_ftosv/vr-ftosv.go rename to kinds/types/vr_ftosv/vr-ftosv.go index 21f586aeb..ee7ec8424 100644 --- a/nodes/vr_ftosv/vr-ftosv.go +++ b/kinds/types/vr_ftosv/vr-ftosv.go @@ -9,6 +9,7 @@ import ( "fmt" "path" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" "github.com/srl-labs/containerlab/utils" @@ -16,7 +17,7 @@ import ( var ( kindnames = []string{"dell_ftosv", "vr-ftosv", "vr-dell_ftosv"} - defaultCredentials = nodes.NewCredentials("admin", "admin") + defaultCredentials = kind_registry.NewCredentials("admin", "admin") ) const ( @@ -24,9 +25,8 @@ const ( startupCfgFName = "startup-config.cfg" ) -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(vrFtosv) }, defaultCredentials) } diff --git a/nodes/vr_n9kv/vr-n9kv.go b/kinds/types/vr_n9kv/vr-n9kv.go similarity index 91% rename from nodes/vr_n9kv/vr-n9kv.go rename to kinds/types/vr_n9kv/vr-n9kv.go index a229526d5..26aff6f16 100644 --- a/nodes/vr_n9kv/vr-n9kv.go +++ b/kinds/types/vr_n9kv/vr-n9kv.go @@ -9,6 +9,7 @@ import ( "fmt" "path" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" @@ -17,7 +18,7 @@ import ( var ( kindnames = []string{"cisco_n9kv", "vr-n9kv", "vr-cisco_n9kv"} - defaultCredentials = nodes.NewCredentials("admin", "admin") + defaultCredentials = kind_registry.NewCredentials("admin", "admin") ) const ( @@ -25,9 +26,8 @@ const ( startupCfgFName = "startup-config.cfg" ) -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(vrN9kv) }, defaultCredentials) } diff --git a/nodes/vr_openbsd/vr-openbsd.go b/kinds/types/vr_openbsd/vr-openbsd.go similarity index 92% rename from nodes/vr_openbsd/vr-openbsd.go rename to kinds/types/vr_openbsd/vr-openbsd.go index f3861b791..b81b14476 100644 --- a/nodes/vr_openbsd/vr-openbsd.go +++ b/kinds/types/vr_openbsd/vr-openbsd.go @@ -11,6 +11,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/srl-labs/containerlab/clab/exec" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" "github.com/srl-labs/containerlab/utils" @@ -18,7 +19,7 @@ import ( var ( kindnames = []string{"openbsd"} - defaultCredentials = nodes.NewCredentials("admin", "admin") + defaultCredentials = kind_registry.NewCredentials("admin", "admin") saveCmd = "sh -c \"/backup.sh -u $USERNAME -p $PASSWORD backup\"" ) @@ -26,9 +27,8 @@ const ( configDirName = "config" ) -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(vrOpenBSD) }, defaultCredentials) } diff --git a/nodes/vr_pan/vr-pan.go b/kinds/types/vr_pan/vr-pan.go similarity index 91% rename from nodes/vr_pan/vr-pan.go rename to kinds/types/vr_pan/vr-pan.go index aab613a5c..8f0710cb4 100644 --- a/nodes/vr_pan/vr-pan.go +++ b/kinds/types/vr_pan/vr-pan.go @@ -9,6 +9,7 @@ import ( "fmt" "path" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" "github.com/srl-labs/containerlab/utils" @@ -16,7 +17,7 @@ import ( var ( kindnames = []string{"paloalto_panos", "vr-pan", "vr-paloalto_panos"} - defaultCredentials = nodes.NewCredentials("admin", "Admin@123") + defaultCredentials = kind_registry.NewCredentials("admin", "Admin@123") ) const ( @@ -24,9 +25,8 @@ const ( startupCfgFName = "startup-config.cfg" ) -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(vrPan) }, defaultCredentials) } diff --git a/nodes/vr_ros/vr-ros.go b/kinds/types/vr_ros/vr-ros.go similarity index 90% rename from nodes/vr_ros/vr-ros.go rename to kinds/types/vr_ros/vr-ros.go index 800c7794e..f6b9fd94b 100644 --- a/nodes/vr_ros/vr-ros.go +++ b/kinds/types/vr_ros/vr-ros.go @@ -9,6 +9,7 @@ import ( "fmt" "path" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" "github.com/srl-labs/containerlab/utils" @@ -16,7 +17,7 @@ import ( var ( kindnames = []string{"mikrotik_ros", "vr-ros", "vr-mikrotik_ros"} - defaultCredentials = nodes.NewCredentials("admin", "admin") + defaultCredentials = kind_registry.NewCredentials("admin", "admin") ) const ( @@ -24,9 +25,8 @@ const ( startupCfgFName = "config.auto.rsc" ) -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(vrRos) }, defaultCredentials) } diff --git a/nodes/vr_sros/sshKey.go b/kinds/types/vr_sros/sshKey.go similarity index 100% rename from nodes/vr_sros/sshKey.go rename to kinds/types/vr_sros/sshKey.go diff --git a/nodes/vr_sros/sshKey_test.go b/kinds/types/vr_sros/sshKey_test.go similarity index 100% rename from nodes/vr_sros/sshKey_test.go rename to kinds/types/vr_sros/sshKey_test.go diff --git a/nodes/vr_sros/ssh_keys.go.tpl b/kinds/types/vr_sros/ssh_keys.go.tpl similarity index 100% rename from nodes/vr_sros/ssh_keys.go.tpl rename to kinds/types/vr_sros/ssh_keys.go.tpl diff --git a/nodes/vr_sros/vr-sros.go b/kinds/types/vr_sros/vr-sros.go similarity index 97% rename from nodes/vr_sros/vr-sros.go rename to kinds/types/vr_sros/vr-sros.go index 92f4b38e2..5b6002246 100644 --- a/nodes/vr_sros/vr-sros.go +++ b/kinds/types/vr_sros/vr-sros.go @@ -24,6 +24,7 @@ import ( "github.com/scrapli/scrapligo/util" log "github.com/sirupsen/logrus" "github.com/srl-labs/containerlab/clab/exec" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/netconf" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" @@ -33,7 +34,7 @@ import ( var ( kindnames = []string{"nokia_sros", "vr-sros", "vr-nokia_sros"} - defaultCredentials = nodes.NewCredentials("admin", "admin") + defaultCredentials = kind_registry.NewCredentials("admin", "admin") ) const ( @@ -50,9 +51,8 @@ type SROSTemplateData struct { SSHPubKeysECDSA []string } -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(vrSROS) }, defaultCredentials) } diff --git a/nodes/vr_veos/vr-veos.go b/kinds/types/vr_veos/vr-veos.go similarity index 92% rename from nodes/vr_veos/vr-veos.go rename to kinds/types/vr_veos/vr-veos.go index 86df216dc..ece1c0e35 100644 --- a/nodes/vr_veos/vr-veos.go +++ b/kinds/types/vr_veos/vr-veos.go @@ -10,6 +10,7 @@ import ( "path" log "github.com/sirupsen/logrus" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/netconf" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" @@ -18,7 +19,7 @@ import ( var ( kindnames = []string{"arista_veos", "vr-veos", "vr-arista_veos"} - defaultCredentials = nodes.NewCredentials("admin", "admin") + defaultCredentials = kind_registry.NewCredentials("admin", "admin") ) const ( @@ -28,9 +29,8 @@ const ( startupCfgFName = "startup-config.cfg" ) -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(vrVEOS) }, defaultCredentials) } diff --git a/nodes/vr_vjunosevolved/vr-vjunosevolved.go b/kinds/types/vr_vjunosevolved/vr-vjunosevolved.go similarity index 92% rename from nodes/vr_vjunosevolved/vr-vjunosevolved.go rename to kinds/types/vr_vjunosevolved/vr-vjunosevolved.go index f5612905f..b615763d9 100644 --- a/nodes/vr_vjunosevolved/vr-vjunosevolved.go +++ b/kinds/types/vr_vjunosevolved/vr-vjunosevolved.go @@ -10,6 +10,7 @@ import ( "path" log "github.com/sirupsen/logrus" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/netconf" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" @@ -18,7 +19,7 @@ import ( var ( kindnames = []string{"juniper_vjunosevolved"} - defaultCredentials = nodes.NewCredentials("admin", "admin@123") + defaultCredentials = kind_registry.NewCredentials("admin", "admin@123") ) const ( @@ -28,9 +29,8 @@ const ( startupCfgFName = "startup-config.cfg" ) -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(vrVJUNOSEVOLVED) }, defaultCredentials) } diff --git a/nodes/vr_vjunosswitch/vr-vjunosswitch.go b/kinds/types/vr_vjunosswitch/vr-vjunosswitch.go similarity index 92% rename from nodes/vr_vjunosswitch/vr-vjunosswitch.go rename to kinds/types/vr_vjunosswitch/vr-vjunosswitch.go index 4c9435182..7a2aa9796 100644 --- a/nodes/vr_vjunosswitch/vr-vjunosswitch.go +++ b/kinds/types/vr_vjunosswitch/vr-vjunosswitch.go @@ -10,6 +10,7 @@ import ( "path" log "github.com/sirupsen/logrus" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/netconf" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" @@ -18,7 +19,7 @@ import ( var ( kindnames = []string{"juniper_vjunosswitch"} - defaultCredentials = nodes.NewCredentials("admin", "admin@123") + defaultCredentials = kind_registry.NewCredentials("admin", "admin@123") ) const ( @@ -28,9 +29,8 @@ const ( startupCfgFName = "startup-config.cfg" ) -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(vrVJUNOSSWITCH) }, defaultCredentials) } diff --git a/nodes/vr_vmx/vr-vmx.go b/kinds/types/vr_vmx/vr-vmx.go similarity index 92% rename from nodes/vr_vmx/vr-vmx.go rename to kinds/types/vr_vmx/vr-vmx.go index 622b1a7cb..3ce83c51f 100644 --- a/nodes/vr_vmx/vr-vmx.go +++ b/kinds/types/vr_vmx/vr-vmx.go @@ -10,6 +10,7 @@ import ( "path" log "github.com/sirupsen/logrus" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/netconf" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" @@ -18,7 +19,7 @@ import ( var ( kindnames = []string{"juniper_vmx", "vr-vmx", "vr-juniper_vmx"} - defaultCredentials = nodes.NewCredentials("admin", "admin@123") + defaultCredentials = kind_registry.NewCredentials("admin", "admin@123") ) const ( @@ -28,9 +29,8 @@ const ( scrapliPlatformName = "juniper_junos" ) -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(vrVMX) }, defaultCredentials) } diff --git a/nodes/vr_vqfx/vr-vqfx.go b/kinds/types/vr_vqfx/vr-vqfx.go similarity index 92% rename from nodes/vr_vqfx/vr-vqfx.go rename to kinds/types/vr_vqfx/vr-vqfx.go index b02de9c1f..50de2d062 100644 --- a/nodes/vr_vqfx/vr-vqfx.go +++ b/kinds/types/vr_vqfx/vr-vqfx.go @@ -10,6 +10,7 @@ import ( "path" log "github.com/sirupsen/logrus" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/netconf" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" @@ -18,7 +19,7 @@ import ( var ( kindnames = []string{"juniper_vqfx", "vr-vqfx", "vr-juniper_vqfx"} - defaultCredentials = nodes.NewCredentials("admin", "admin@123") + defaultCredentials = kind_registry.NewCredentials("admin", "admin@123") ) const ( @@ -28,9 +29,8 @@ const ( startupCfgFName = "startup-config.cfg" ) -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(vrVQFX) }, defaultCredentials) } diff --git a/nodes/vr_vsrx/vr-vsrx.go b/kinds/types/vr_vsrx/vr-vsrx.go similarity index 92% rename from nodes/vr_vsrx/vr-vsrx.go rename to kinds/types/vr_vsrx/vr-vsrx.go index 8edd507c2..04a63ebac 100644 --- a/nodes/vr_vsrx/vr-vsrx.go +++ b/kinds/types/vr_vsrx/vr-vsrx.go @@ -10,6 +10,7 @@ import ( "path" log "github.com/sirupsen/logrus" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/netconf" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" @@ -18,7 +19,7 @@ import ( var ( kindnames = []string{"juniper_vsrx", "vr-vsrx", "vr-juniper_vsrx"} - defaultCredentials = nodes.NewCredentials("admin", "admin@123") + defaultCredentials = kind_registry.NewCredentials("admin", "admin@123") ) const ( @@ -28,9 +29,8 @@ const ( startupCfgFName = "startup-config.cfg" ) -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(vrVSRX) }, defaultCredentials) } diff --git a/nodes/vr_xrv/vr-xrv.go b/kinds/types/vr_xrv/vr-xrv.go similarity index 92% rename from nodes/vr_xrv/vr-xrv.go rename to kinds/types/vr_xrv/vr-xrv.go index 28acbce08..b0a945d1a 100644 --- a/nodes/vr_xrv/vr-xrv.go +++ b/kinds/types/vr_xrv/vr-xrv.go @@ -10,6 +10,7 @@ import ( "path" log "github.com/sirupsen/logrus" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/netconf" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" @@ -18,7 +19,7 @@ import ( var ( kindnames = []string{"cisco_xrv", "vr-xrv", "vr-cisco_xrv"} - defaultCredentials = nodes.NewCredentials("clab", "clab@123") + defaultCredentials = kind_registry.NewCredentials("clab", "clab@123") ) const ( @@ -28,9 +29,8 @@ const ( startupCfgFName = "startup-config.cfg" ) -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(vrXRV) }, defaultCredentials) } diff --git a/nodes/vr_xrv9k/vr-xrv9k.go b/kinds/types/vr_xrv9k/vr-xrv9k.go similarity index 92% rename from nodes/vr_xrv9k/vr-xrv9k.go rename to kinds/types/vr_xrv9k/vr-xrv9k.go index 3208bd72b..f79aeac99 100644 --- a/nodes/vr_xrv9k/vr-xrv9k.go +++ b/kinds/types/vr_xrv9k/vr-xrv9k.go @@ -10,6 +10,7 @@ import ( "path" log "github.com/sirupsen/logrus" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/netconf" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" @@ -18,7 +19,7 @@ import ( var ( kindnames = []string{"cisco_xrv9k", "vr-xrv9k", "vr-cisco_xrv9k"} - defaultCredentials = nodes.NewCredentials("clab", "clab@123") + defaultCredentials = kind_registry.NewCredentials("clab", "clab@123") ) const ( @@ -28,9 +29,8 @@ const ( startupCfgFName = "startup-config.cfg" ) -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(vrXRV9K) }, defaultCredentials) } diff --git a/nodes/xrd/xrd.cfg b/kinds/types/xrd/xrd.cfg similarity index 100% rename from nodes/xrd/xrd.cfg rename to kinds/types/xrd/xrd.cfg diff --git a/nodes/xrd/xrd.go b/kinds/types/xrd/xrd.go similarity index 94% rename from nodes/xrd/xrd.go rename to kinds/types/xrd/xrd.go index 70798988c..25927d911 100644 --- a/nodes/xrd/xrd.go +++ b/kinds/types/xrd/xrd.go @@ -14,6 +14,7 @@ import ( "strings" log "github.com/sirupsen/logrus" + "github.com/srl-labs/containerlab/kinds/kind_registry" "github.com/srl-labs/containerlab/netconf" "github.com/srl-labs/containerlab/nodes" "github.com/srl-labs/containerlab/types" @@ -22,7 +23,7 @@ import ( var ( kindnames = []string{"xrd", "cisco_xrd"} - defaultCredentials = nodes.NewCredentials("clab", "clab@123") + defaultCredentials = kind_registry.NewCredentials("clab", "clab@123") xrdEnv = map[string]string{ "XR_FIRST_BOOT_CONFIG": "/etc/xrd/first-boot.cfg", "XR_MGMT_INTERFACES": "linux:eth0,xr_name=Mg0/RP0/CPU0/0,chksum,snoop_v4,snoop_v6", @@ -36,9 +37,8 @@ const ( scrapliPlatformName = "cisco_iosxr" ) -// Register registers the node in the NodeRegistry. -func Register(r *nodes.NodeRegistry) { - r.Register(kindnames, func() nodes.Node { +func Init() { + kind_registry.KindRegistryInstance.Register(kindnames, func() nodes.Node { return new(xrd) }, defaultCredentials) }