Skip to content

Commit

Permalink
Create first basic template (#6)
Browse files Browse the repository at this point in the history
Generate template for edgeos
  • Loading branch information
mraerino authored Aug 11, 2022
1 parent 6fb80ce commit 8b7b273
Show file tree
Hide file tree
Showing 6 changed files with 648 additions and 0 deletions.
72 changes: 72 additions & 0 deletions interop/edgeos/interfaces.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package edgeos

import "github.com/ffddorf/confgen/netbox/models"

type InterfaceType string

const (
InterfaceTypeBonding InterfaceType = "bonding" // Bonding interface name
InterfaceTypeBridge InterfaceType = "bridge" // Bridge interface name
InterfaceTypeEthernet InterfaceType = "ethernet" // Ethernet interface name
InterfaceTypeInput InterfaceType = "input" // Input functional block (IFB) interface name
InterfaceTypeIpv6Tunnel InterfaceType = "ipv6-tunnel" // IPv6 Tunnel interface
InterfaceTypeL2tpClient InterfaceType = "l2tp-client" // L2TP client interface name
InterfaceTypeL2tpv3 InterfaceType = "l2tpv3" // L2TPv3 interface
InterfaceTypeLoopback InterfaceType = "loopback" // Loopback interface name
InterfaceTypeOpenvpn InterfaceType = "openvpn" // OpenVPN tunnel interface name
InterfaceTypePptpClient InterfaceType = "pptp-client" // PPTP client interface name
InterfaceTypePseudoEthernet InterfaceType = "pseudo-ethernet" // Pseudo Ethernet device name
InterfaceTypeSwitch InterfaceType = "switch" // Switch interface name
InterfaceTypeTunnel InterfaceType = "tunnel" // Tunnel interface
InterfaceTypeVti InterfaceType = "vti" // Virtual Tunnel interface
InterfaceTypeWirelessmodem InterfaceType = "wirelessmodem" // Wireless modem interface name
)

func InterfaceTypeFromNetbox(netboxType models.DcimInterfaceTypeChoices) (edgeosType InterfaceType, ok bool) {
ok = true
switch netboxType {
case models.DcimInterfaceTypeChoicesA100baseTx,
models.DcimInterfaceTypeChoicesA1000baseT,
models.DcimInterfaceTypeChoicesA25gbaseT,
models.DcimInterfaceTypeChoicesA5gbaseT,
models.DcimInterfaceTypeChoicesA10gbaseT,
models.DcimInterfaceTypeChoicesA10gbaseCx4,
models.DcimInterfaceTypeChoicesA1000baseXGbic,
models.DcimInterfaceTypeChoicesA1000baseXSfp,
models.DcimInterfaceTypeChoicesA10gbaseXSfpp,
models.DcimInterfaceTypeChoicesA10gbaseXXfp,
models.DcimInterfaceTypeChoicesA10gbaseXXenpak,
models.DcimInterfaceTypeChoicesA10gbaseXX2,
models.DcimInterfaceTypeChoicesA25gbaseXSfp28,
models.DcimInterfaceTypeChoicesA50gbaseXSfp56,
models.DcimInterfaceTypeChoicesA40gbaseXQsfpp,
models.DcimInterfaceTypeChoicesA50gbaseXSfp28,
models.DcimInterfaceTypeChoicesA100gbaseXCfp,
models.DcimInterfaceTypeChoicesA100gbaseXCfp2,
models.DcimInterfaceTypeChoicesA200gbaseXCfp2,
models.DcimInterfaceTypeChoicesA100gbaseXCfp4,
models.DcimInterfaceTypeChoicesA100gbaseXCpak,
models.DcimInterfaceTypeChoicesA100gbaseXQsfp28,
models.DcimInterfaceTypeChoicesA200gbaseXQsfp56,
models.DcimInterfaceTypeChoicesA400gbaseXQsfpdd,
models.DcimInterfaceTypeChoicesA400gbaseXOsfp,
models.DcimInterfaceTypeChoicesA1gfcSfp,
models.DcimInterfaceTypeChoicesA2gfcSfp,
models.DcimInterfaceTypeChoicesA4gfcSfp,
models.DcimInterfaceTypeChoicesA8gfcSfpp,
models.DcimInterfaceTypeChoicesA16gfcSfpp,
models.DcimInterfaceTypeChoicesA32gfcSfp28,
models.DcimInterfaceTypeChoicesA64gfcQsfpp,
models.DcimInterfaceTypeChoicesA128gfcQsfp28:
edgeosType = InterfaceTypeEthernet
case models.DcimInterfaceTypeChoicesBridge:
edgeosType = InterfaceTypeBridge
case models.DcimInterfaceTypeChoicesLag:
edgeosType = InterfaceTypeBonding
case models.DcimInterfaceTypeChoicesVirtual:
edgeosType = InterfaceTypeLoopback
default:
ok = false
}
return
}
58 changes: 58 additions & 0 deletions templates/edgeos.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package templates

import (
"strings"

"github.com/ffddorf/confgen/interop/edgeos"
"github.com/ffddorf/confgen/netbox"
"github.com/ffddorf/confgen/netbox/models"
)

func edgeosConfigFromMap(in map[string]interface{}) string {
out := new(strings.Builder)
if err := edgeos.ConfigFromMap(out, in, 0); err != nil {
panic(err)
}
return out.String()
}

type ChildInterface = models.DeviceDeviceDeviceTypeInterfacesInterfaceTypeChild_interfacesInterfaceType

type edgeosInterfaceDef struct {
netbox.Interface
VIFs []ChildInterface
}

// Structures interfaces coming from netbox
// to be more compatible with the config
// structure of EdgeOS.
func edgeosPrepareInterfaces(interfaces []netbox.Interface) map[edgeos.InterfaceType][]edgeosInterfaceDef {
groups := make(map[edgeos.InterfaceType][]edgeosInterfaceDef)
for _, iface := range interfaces {
// find interface type, skip if not known
ifType, ok := edgeos.InterfaceTypeFromNetbox(iface.Type)
if !ok {
continue
}

// skip interfaces that are children
if iface.Parent.Id != "" {
continue
}

outIface := edgeosInterfaceDef{Interface: iface}

// add child interfaces
if len(iface.Child_interfaces) > 0 {
outIface.VIFs = iface.Child_interfaces
}

// add to list in map
if _, ok := groups[ifType]; !ok {
groups[ifType] = make([]edgeosInterfaceDef, 0, 1)
}
groups[ifType] = append(groups[ifType], outIface)
}

return groups
}
39 changes: 39 additions & 0 deletions templates/edgeos.tpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
interfaces {
{{- $ifGroups := edgeosPrepareInterfaces .Device.Interfaces }}
{{- range $ifType, $ifs := $ifGroups }}
{{- range $ifs }}
{{ $ifType }} {{ .Name }} {
{{- if .Description }}
description {{ .Description | maybeQuote }}
{{- end }}
{{- range .Ip_addresses }}
address {{ .Address }}
{{- end }}
{{- if not .Enabled }}
disable
{{- end }}
{{- if .Speed }}
speed {{ .Speed }}
{{- end }}
{{- if .Duplex }}
duplex {{ .Duplex }}
{{- end }}
{{- /* edgeosConfigFromMap .ConfigContext */}}
{{- range .VIFs }}
vif {{ .Untagged_vlan.Vid }} {
{{- if .Description }}
description {{ .Description | maybeQuote }}
{{- end }}
{{- range .Ip_addresses }}
address {{ .Address }}
{{- end }}
{{- if not .Enabled }}
disable
{{- end }}
{{- /* edgeosConfigFromMap .ConfigContext */}}
}
{{- end }}
}
{{- end }}
{{- end }}
}
60 changes: 60 additions & 0 deletions templates/templates.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package templates

import (
_ "embed"
"errors"
"io"
"text/template"

"github.com/ffddorf/confgen/netbox"
)

var (
// all known templates by name
templates = map[string]*template.Template{}

// common template functions
funcs = template.FuncMap{
"maybeQuote": maybeQuote,
"edgeosConfigFromMap": edgeosConfigFromMap,
"edgeosPrepareInterfaces": edgeosPrepareInterfaces,
}
)

// template bodies embedded via `go:embed`
var (
//go:embed edgeos.tpl
edgeosRaw string
// ... load your template file here!
)

func init() {
initTemplate("edgeos", edgeosRaw)
// ... initialize your template instance here!
}

// used to initialize a template globally using its name and body
func initTemplate(name string, tpl string) {
templates[name] = template.Must(
template.New(name).
Funcs(funcs).
Parse(tpl),
)
}

// TemplateData is the data needed to execute a template
type TemplateData struct {
Device *netbox.Device
}

var ErrTemplateNotFound = errors.New("template not found")

// Render executes the template by the given name and
// writes the result into `out`.
func Render(out io.Writer, name string, data TemplateData) error {
templ, ok := templates[name]
if !ok {
return ErrTemplateNotFound
}
return templ.Execute(out, data)
}
Loading

0 comments on commit 8b7b273

Please sign in to comment.